| @@ -1,17 +1,17 @@ | | | @@ -1,17 +1,17 @@ |
1 | $NetBSD: patch-ab,v 1.15 2008/11/23 01:40:26 jmcneill Exp $ | | 1 | $NetBSD: patch-ab,v 1.16 2009/01/06 19:00:50 hasso Exp $ |
2 | | | 2 | |
3 | --- dbus/dbus-sysdeps-unix.c.orig 2008-10-06 17:14:50.000000000 -0400 | | 3 | --- dbus/dbus-sysdeps-unix.c.orig 2008-10-07 00:14:50 +0300 |
4 | +++ dbus/dbus-sysdeps-unix.c | | 4 | +++ dbus/dbus-sysdeps-unix.c 2009-01-06 16:17:35 +0200 |
5 | @@ -23,6 +23,7 @@ | | 5 | @@ -23,6 +23,7 @@ |
6 | */ | | 6 | */ |
7 | | | 7 | |
8 | #define _GNU_SOURCE | | 8 | #define _GNU_SOURCE |
9 | +#define _NETBSD_SOURCE | | 9 | +#define _NETBSD_SOURCE |
10 | | | 10 | |
11 | #include "dbus-internals.h" | | 11 | #include "dbus-internals.h" |
12 | #include "dbus-sysdeps.h" | | 12 | #include "dbus-sysdeps.h" |
13 | @@ -35,6 +36,9 @@ | | 13 | @@ -35,6 +36,9 @@ |
14 | #include "dbus-list.h" | | 14 | #include "dbus-list.h" |
15 | #include "dbus-credentials.h" | | 15 | #include "dbus-credentials.h" |
16 | | | 16 | |
17 | +#ifdef HAVE_NETBSD_ATOMIC_OPS | | 17 | +#ifdef HAVE_NETBSD_ATOMIC_OPS |
| @@ -63,116 +63,177 @@ $NetBSD: patch-ab,v 1.15 2008/11/23 01:4 | | | @@ -63,116 +63,177 @@ $NetBSD: patch-ab,v 1.15 2008/11/23 01:4 |
63 | + | | 63 | + |
64 | static dbus_bool_t | | 64 | static dbus_bool_t |
65 | _dbus_open_socket (int *fd_p, | | 65 | _dbus_open_socket (int *fd_p, |
66 | int domain, | | 66 | int domain, |
67 | @@ -581,7 +615,7 @@ _dbus_set_local_creds (int fd, dbus_bool | | 67 | @@ -581,7 +615,7 @@ _dbus_set_local_creds (int fd, dbus_bool |
68 | { | | 68 | { |
69 | dbus_bool_t retval = TRUE; | | 69 | dbus_bool_t retval = TRUE; |
70 | | | 70 | |
71 | -#if defined(HAVE_CMSGCRED) | | 71 | -#if defined(HAVE_CMSGCRED) |
72 | +#if defined(HAVE_CMSGCRED) || defined(LOCAL_PEEREID) | | 72 | +#if defined(HAVE_CMSGCRED) || defined(LOCAL_PEEREID) |
73 | /* NOOP just to make sure only one codepath is used | | 73 | /* NOOP just to make sure only one codepath is used |
74 | * and to prefer CMSGCRED | | 74 | * and to prefer CMSGCRED |
75 | */ | | 75 | */ |
76 | @@ -1138,6 +1172,9 @@ _dbus_read_credentials_socket (int | | 76 | @@ -1041,9 +1075,9 @@ write_credentials_byte (int |
77 | struct cmsgcred cred; | | 77 | int bytes_written; |
| | | 78 | char buf[1] = { '\0' }; |
| | | 79 | #if defined(HAVE_CMSGCRED) |
| | | 80 | - struct { |
| | | 81 | + union { |
| | | 82 | struct cmsghdr hdr; |
| | | 83 | - struct cmsgcred cred; |
| | | 84 | + char cred[CMSG_SPACE (sizeof (struct cmsgcred))]; |
| | | 85 | } cmsg; |
| | | 86 | struct iovec iov; |
| | | 87 | struct msghdr msg; |
| | | 88 | @@ -1054,10 +1088,10 @@ write_credentials_byte (int |
| | | 89 | msg.msg_iov = &iov; |
| | | 90 | msg.msg_iovlen = 1; |
| | | 91 | |
| | | 92 | - msg.msg_control = &cmsg; |
| | | 93 | - msg.msg_controllen = sizeof (cmsg); |
| | | 94 | + msg.msg_control = (caddr_t) &cmsg; |
| | | 95 | + msg.msg_controllen = CMSG_SPACE (sizeof (struct cmsgcred)); |
| | | 96 | memset (&cmsg, 0, sizeof (cmsg)); |
| | | 97 | - cmsg.hdr.cmsg_len = sizeof (cmsg); |
| | | 98 | + cmsg.hdr.cmsg_len = CMSG_LEN (sizeof (struct cmsgcred)); |
| | | 99 | cmsg.hdr.cmsg_level = SOL_SOCKET; |
| | | 100 | cmsg.hdr.cmsg_type = SCM_CREDS; |
| | | 101 | #endif |
| | | 102 | @@ -1129,15 +1163,15 @@ _dbus_read_credentials_socket (int |
| | | 103 | dbus_pid_t pid_read; |
| | | 104 | int bytes_read; |
| | | 105 | |
| | | 106 | - uid_read = DBUS_UID_UNSET; |
| | | 107 | - pid_read = DBUS_PID_UNSET; |
| | | 108 | - |
| | | 109 | #ifdef HAVE_CMSGCRED |
| | | 110 | - struct { |
| | | 111 | + union { |
| | | 112 | struct cmsghdr hdr; |
| | | 113 | - struct cmsgcred cred; |
| | | 114 | + char cred[CMSG_SPACE (sizeof (struct cmsgcred))]; |
78 | } cmsg; | | 115 | } cmsg; |
79 | | | 116 | |
80 | +#elif defined(LOCAL_PEEREID) | | 117 | +#elif defined(LOCAL_PEEREID) |
81 | + pid_t sockpid, sockuid, sockgid; | | 118 | + pid_t sockpid, sockuid, sockgid; |
82 | + | | 119 | + |
83 | #elif defined(LOCAL_CREDS) | | 120 | #elif defined(LOCAL_CREDS) |
84 | struct { | | 121 | struct { |
85 | struct cmsghdr hdr; | | 122 | struct cmsghdr hdr; |
86 | @@ -1170,7 +1207,7 @@ _dbus_read_credentials_socket (int | | 123 | @@ -1145,6 +1179,9 @@ _dbus_read_credentials_socket (int |
| | | 124 | } cmsg; |
| | | 125 | #endif |
| | | 126 | |
| | | 127 | + uid_read = DBUS_UID_UNSET; |
| | | 128 | + pid_read = DBUS_PID_UNSET; |
| | | 129 | + |
| | | 130 | _DBUS_ASSERT_ERROR_IS_CLEAR (error); |
| | | 131 | |
| | | 132 | /* The POSIX spec certainly doesn't promise this, but |
| | | 133 | @@ -1170,10 +1207,10 @@ _dbus_read_credentials_socket (int |
87 | msg.msg_iov = &iov; | | 134 | msg.msg_iov = &iov; |
88 | msg.msg_iovlen = 1; | | 135 | msg.msg_iovlen = 1; |
89 | | | 136 | |
90 | -#if defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS) | | 137 | -#if defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS) |
91 | +#if (defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS)) && !defined(LOCAL_PEEREID) | | 138 | +#if (defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS)) && !defined(LOCAL_PEEREID) |
92 | memset (&cmsg, 0, sizeof (cmsg)); | | 139 | memset (&cmsg, 0, sizeof (cmsg)); |
93 | msg.msg_control = &cmsg; | | 140 | - msg.msg_control = &cmsg; |
94 | msg.msg_controllen = sizeof (cmsg); | | 141 | - msg.msg_controllen = sizeof (cmsg); |
95 | @@ -1210,7 +1247,7 @@ _dbus_read_credentials_socket (int | | 142 | + msg.msg_control = (caddr_t) &cmsg; |
| | | 143 | + msg.msg_controllen = CMSG_SPACE (sizeof (struct cmsgcred)); |
| | | 144 | #endif |
| | | 145 | |
| | | 146 | again: |
| | | 147 | @@ -1210,8 +1247,8 @@ _dbus_read_credentials_socket (int |
96 | return FALSE; | | 148 | return FALSE; |
97 | } | | 149 | } |
98 | | | 150 | |
99 | -#if defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS) | | 151 | -#if defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS) |
| | | 152 | - if (cmsg.hdr.cmsg_len < sizeof (cmsg) || cmsg.hdr.cmsg_type != SCM_CREDS) |
100 | +#if (defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS)) && !defined(LOCAL_PEEREID) | | 153 | +#if (defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS)) && !defined(LOCAL_PEEREID) |
101 | if (cmsg.hdr.cmsg_len < sizeof (cmsg) || cmsg.hdr.cmsg_type != SCM_CREDS) | | 154 | + if (cmsg.hdr.cmsg_len < CMSG_LEN (sizeof (struct cmsgcred)) || cmsg.hdr.cmsg_type != SCM_CREDS) |
102 | { | | 155 | { |
103 | dbus_set_error (error, DBUS_ERROR_FAILED, | | 156 | dbus_set_error (error, DBUS_ERROR_FAILED, |
104 | @@ -1240,6 +1277,16 @@ _dbus_read_credentials_socket (int | | 157 | "Message from recvmsg() was not SCM_CREDS"); |
| | | 158 | @@ -1238,8 +1275,21 @@ _dbus_read_credentials_socket (int |
| | | 159 | cr_len, (int) sizeof (cr), _dbus_strerror (errno)); |
| | | 160 | } |
105 | #elif defined(HAVE_CMSGCRED) | | 161 | #elif defined(HAVE_CMSGCRED) |
106 | pid_read = cmsg.cred.cmcred_pid; | | 162 | - pid_read = cmsg.cred.cmcred_pid; |
107 | uid_read = cmsg.cred.cmcred_euid; | | 163 | - uid_read = cmsg.cred.cmcred_euid; |
| | | 164 | + struct cmsgcred *cred; |
| | | 165 | + |
| | | 166 | + cred = (struct cmsgcred *) CMSG_DATA (&cmsg); |
| | | 167 | + pid_read = cred->cmcred_pid; |
| | | 168 | + uid_read = cred->cmcred_euid; |
108 | +#elif defined(LOCAL_PEEREID) | | 169 | +#elif defined(LOCAL_PEEREID) |
109 | + if (dbus_nb_getpeereid(client_fd, &sockpid, &sockuid, &sockgid) == TRUE) | | 170 | + if (dbus_nb_getpeereid(client_fd, &sockpid, &sockuid, &sockgid) == TRUE) |
110 | + { | | 171 | + { |
111 | + pid_read = sockpid; | | 172 | + pid_read = sockpid; |
112 | + uid_read = sockuid; | | 173 | + uid_read = sockuid; |
113 | + } | | 174 | + } |
114 | + else | | 175 | + else |
115 | + { | | 176 | + { |
116 | + _dbus_verbose ("Failed to dbus_nb_getpeereid() credentials: %s\n", _dbus_strerror (errno)); | | 177 | + _dbus_verbose ("Failed to dbus_nb_getpeereid() credentials: %s\n", _dbus_strerror (errno)); |
117 | + } | | 178 | + } |
118 | #elif defined(LOCAL_CREDS) | | 179 | #elif defined(LOCAL_CREDS) |
119 | pid_read = DBUS_PID_UNSET; | | 180 | pid_read = DBUS_PID_UNSET; |
120 | uid_read = cmsg.cred.sc_uid; | | 181 | uid_read = cmsg.cred.sc_uid; |
121 | @@ -1301,7 +1348,7 @@ _dbus_read_credentials_socket (int | | 182 | @@ -1301,7 +1351,7 @@ _dbus_read_credentials_socket (int |
122 | } | | 183 | } |
123 | if (ucred != NULL) | | 184 | if (ucred != NULL) |
124 | ucred_free (ucred); | | 185 | ucred_free (ucred); |
125 | -#else /* !SO_PEERCRED && !HAVE_CMSGCRED && !HAVE_GETPEEREID && !HAVE_GETPEERUCRED */ | | 186 | -#else /* !SO_PEERCRED && !HAVE_CMSGCRED && !HAVE_GETPEEREID && !HAVE_GETPEERUCRED */ |
126 | +#else /* !SO_PEERCRED && !HAVE_CMSGCRED && !HAVE_GETPEEREID && !HAVE_GETPEERUCRED && !LOCAL_PEEREID*/ | | 187 | +#else /* !SO_PEERCRED && !HAVE_CMSGCRED && !HAVE_GETPEEREID && !HAVE_GETPEERUCRED && !LOCAL_PEEREID*/ |
127 | _dbus_verbose ("Socket credentials not supported on this OS\n"); | | 188 | _dbus_verbose ("Socket credentials not supported on this OS\n"); |
128 | #endif | | 189 | #endif |
129 | } | | 190 | } |
130 | @@ -1826,7 +1873,26 @@ _dbus_parse_uid (const DBusString * | | 191 | @@ -1826,7 +1876,26 @@ _dbus_parse_uid (const DBusString * |
131 | return TRUE; | | 192 | return TRUE; |
132 | } | | 193 | } |
133 | | | 194 | |
134 | +#ifdef HAVE_NETBSD_ATOMIC_OPS | | 195 | +#ifdef HAVE_NETBSD_ATOMIC_OPS |
135 | +dbus_int32_t | | 196 | +dbus_int32_t |
136 | +_dbus_atomic_inc (DBusAtomic *atomic) | | 197 | +_dbus_atomic_inc (DBusAtomic *atomic) |
137 | +{ | | 198 | +{ |
138 | + register dbus_int32_t old = atomic->value; | | 199 | + register dbus_int32_t old = atomic->value; |
139 | + | | 200 | + |
140 | + atomic_inc_uint((unsigned *)&atomic->value); | | 201 | + atomic_inc_uint((unsigned *)&atomic->value); |
141 | + return old; | | 202 | + return old; |
142 | +} | | 203 | +} |
143 | + | | 204 | + |
144 | +dbus_int32_t | | 205 | +dbus_int32_t |
145 | +_dbus_atomic_dec (DBusAtomic *atomic) | | 206 | +_dbus_atomic_dec (DBusAtomic *atomic) |
146 | +{ | | 207 | +{ |
147 | + register dbus_int32_t old = atomic->value; | | 208 | + register dbus_int32_t old = atomic->value; |
148 | | | 209 | |
149 | + atomic_dec_uint((unsigned *)&atomic->value); | | 210 | + atomic_dec_uint((unsigned *)&atomic->value); |
150 | + return old; | | 211 | + return old; |
151 | +} | | 212 | +} |
152 | +_DBUS_DEFINE_GLOBAL_LOCK (atomic); | | 213 | +_DBUS_DEFINE_GLOBAL_LOCK (atomic); |
153 | +#else | | 214 | +#else |
154 | _DBUS_DEFINE_GLOBAL_LOCK (atomic); | | 215 | _DBUS_DEFINE_GLOBAL_LOCK (atomic); |
155 | | | 216 | |
156 | #if DBUS_USE_ATOMIC_INT_486_COND | | 217 | #if DBUS_USE_ATOMIC_INT_486_COND |
157 | @@ -1891,6 +1957,7 @@ _dbus_atomic_dec (DBusAtomic *atomic) | | 218 | @@ -1891,6 +1960,7 @@ _dbus_atomic_dec (DBusAtomic *atomic) |
158 | return res; | | 219 | return res; |
159 | #endif | | 220 | #endif |
160 | } | | 221 | } |
161 | +#endif /* HAVE_NETBSD_ATOMIC_OPS */ | | 222 | +#endif /* HAVE_NETBSD_ATOMIC_OPS */ |
162 | | | 223 | |
163 | #ifdef DBUS_BUILD_TESTS | | 224 | #ifdef DBUS_BUILD_TESTS |
164 | /** Gets our GID | | 225 | /** Gets our GID |
165 | @@ -2793,8 +2860,18 @@ int | | 226 | @@ -2793,8 +2863,18 @@ int |
166 | _dbus_printf_string_upper_bound (const char *format, | | 227 | _dbus_printf_string_upper_bound (const char *format, |
167 | va_list args) | | 228 | va_list args) |
168 | { | | 229 | { |
169 | +#if defined(__hpux) || defined(__sgi) | | 230 | +#if defined(__hpux) || defined(__sgi) |
170 | +/* this code from libnbcompat's vsnprintf */ | | 231 | +/* this code from libnbcompat's vsnprintf */ |
171 | + static FILE *devnull = 0; | | 232 | + static FILE *devnull = 0; |
172 | + if (!devnull) { | | 233 | + if (!devnull) { |
173 | + devnull = fopen("/dev/null", "w"); | | 234 | + devnull = fopen("/dev/null", "w"); |
174 | + if (!devnull) return -1; | | 235 | + if (!devnull) return -1; |
175 | + } | | 236 | + } |
176 | + return vfprintf(devnull, format, args); | | 237 | + return vfprintf(devnull, format, args); |
177 | +#else | | 238 | +#else |
178 | char c; | | 239 | char c; |