activation: add /lib/dbus-1/system-services to the search path for services
[platform/upstream/dbus.git] / dbus / dbus-sysdeps-unix.c
1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 /* dbus-sysdeps-unix.c Wrappers around UNIX system/libc features (internal to D-Bus implementation)
3  *
4  * Copyright (C) 2002, 2003, 2006  Red Hat, Inc.
5  * Copyright (C) 2003 CodeFactory AB
6  *
7  * Licensed under the Academic Free License version 2.1
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
22  *
23  */
24
25 #include <config.h>
26
27 #include "dbus-internals.h"
28 #include "dbus-sysdeps.h"
29 #include "dbus-sysdeps-unix.h"
30 #include "dbus-threads.h"
31 #include "dbus-protocol.h"
32 #include "dbus-transport.h"
33 #include "dbus-string.h"
34 #include "dbus-userdb.h"
35 #include "dbus-list.h"
36 #include "dbus-credentials.h"
37 #include "dbus-nonce.h"
38
39 #include <sys/types.h>
40 #include <stdlib.h>
41 #include <string.h>
42 #include <signal.h>
43 #include <unistd.h>
44 #include <stdio.h>
45 #include <fcntl.h>
46 #include <sys/socket.h>
47 #include <dirent.h>
48 #include <sys/un.h>
49 #include <pwd.h>
50 #include <time.h>
51 #include <locale.h>
52 #include <sys/time.h>
53 #include <sys/stat.h>
54 #include <sys/wait.h>
55 #include <netinet/in.h>
56 #include <netdb.h>
57 #include <grp.h>
58
59 #ifdef HAVE_ERRNO_H
60 #include <errno.h>
61 #endif
62 #ifdef HAVE_WRITEV
63 #include <sys/uio.h>
64 #endif
65 #ifdef HAVE_POLL
66 #include <sys/poll.h>
67 #endif
68 #ifdef HAVE_BACKTRACE
69 #include <execinfo.h>
70 #endif
71 #ifdef HAVE_GETPEERUCRED
72 #include <ucred.h>
73 #endif
74
75 #ifdef HAVE_ADT
76 #include <bsm/adt.h>
77 #endif
78
79 #include "sd-daemon.h"
80
81 #ifndef O_BINARY
82 #define O_BINARY 0
83 #endif
84
85 #ifndef AI_ADDRCONFIG
86 #define AI_ADDRCONFIG 0
87 #endif
88
89 #ifndef HAVE_SOCKLEN_T
90 #define socklen_t int
91 #endif
92
93 static dbus_bool_t
94 _dbus_open_socket (int              *fd_p,
95                    int               domain,
96                    int               type,
97                    int               protocol,
98                    DBusError        *error)
99 {
100 #ifdef SOCK_CLOEXEC
101   dbus_bool_t cloexec_done;
102
103   *fd_p = socket (domain, type | SOCK_CLOEXEC, protocol);
104   cloexec_done = *fd_p >= 0;
105
106   /* Check if kernel seems to be too old to know SOCK_CLOEXEC */
107   if (*fd_p < 0 && errno == EINVAL)
108 #endif
109     {
110       *fd_p = socket (domain, type, protocol);
111     }
112
113   if (*fd_p >= 0)
114     {
115 #ifdef SOCK_CLOEXEC
116       if (!cloexec_done)
117 #endif
118         {
119           _dbus_fd_set_close_on_exec(*fd_p);
120         }
121
122       _dbus_verbose ("socket fd %d opened\n", *fd_p);
123       return TRUE;
124     }
125   else
126     {
127       dbus_set_error(error,
128                      _dbus_error_from_errno (errno),
129                      "Failed to open socket: %s",
130                      _dbus_strerror (errno));
131       return FALSE;
132     }
133 }
134
135 dbus_bool_t
136 _dbus_open_tcp_socket (int              *fd,
137                        DBusError        *error)
138 {
139   return _dbus_open_socket(fd, AF_INET, SOCK_STREAM, 0, error);
140 }
141
142 /**
143  * Opens a UNIX domain socket (as in the socket() call).
144  * Does not bind the socket.
145  *
146  * This will set FD_CLOEXEC for the socket returned
147  *
148  * @param fd return location for socket descriptor
149  * @param error return location for an error
150  * @returns #FALSE if error is set
151  */
152 dbus_bool_t
153 _dbus_open_unix_socket (int              *fd,
154                         DBusError        *error)
155 {
156   return _dbus_open_socket(fd, PF_UNIX, SOCK_STREAM, 0, error);
157 }
158
159 /**
160  * Closes a socket. Should not be used on non-socket
161  * file descriptors or handles.
162  *
163  * @param fd the socket
164  * @param error return location for an error
165  * @returns #FALSE if error is set
166  */
167 dbus_bool_t
168 _dbus_close_socket (int               fd,
169                     DBusError        *error)
170 {
171   return _dbus_close (fd, error);
172 }
173
174 /**
175  * Like _dbus_read(), but only works on sockets so is
176  * available on Windows.
177  *
178  * @param fd the socket
179  * @param buffer string to append data to
180  * @param count max amount of data to read
181  * @returns number of bytes appended to the string
182  */
183 int
184 _dbus_read_socket (int               fd,
185                    DBusString       *buffer,
186                    int               count)
187 {
188   return _dbus_read (fd, buffer, count);
189 }
190
191 /**
192  * Like _dbus_write(), but only supports sockets
193  * and is thus available on Windows.
194  *
195  * @param fd the file descriptor to write
196  * @param buffer the buffer to write data from
197  * @param start the first byte in the buffer to write
198  * @param len the number of bytes to try to write
199  * @returns the number of bytes written or -1 on error
200  */
201 int
202 _dbus_write_socket (int               fd,
203                     const DBusString *buffer,
204                     int               start,
205                     int               len)
206 {
207 #if HAVE_DECL_MSG_NOSIGNAL
208   const char *data;
209   int bytes_written;
210
211   data = _dbus_string_get_const_data_len (buffer, start, len);
212
213  again:
214
215   bytes_written = send (fd, data, len, MSG_NOSIGNAL);
216
217   if (bytes_written < 0 && errno == EINTR)
218     goto again;
219
220   return bytes_written;
221
222 #else
223   return _dbus_write (fd, buffer, start, len);
224 #endif
225 }
226
227 /**
228  * Like _dbus_read_socket() but also tries to read unix fds from the
229  * socket. When there are more fds to read than space in the array
230  * passed this function will fail with ENOSPC.
231  *
232  * @param fd the socket
233  * @param buffer string to append data to
234  * @param count max amount of data to read
235  * @param fds array to place read file descriptors in
236  * @param n_fds on input space in fds array, on output how many fds actually got read
237  * @returns number of bytes appended to string
238  */
239 int
240 _dbus_read_socket_with_unix_fds (int               fd,
241                                  DBusString       *buffer,
242                                  int               count,
243                                  int              *fds,
244                                  int              *n_fds) {
245 #ifndef HAVE_UNIX_FD_PASSING
246   int r;
247
248   if ((r = _dbus_read_socket(fd, buffer, count)) < 0)
249     return r;
250
251   *n_fds = 0;
252   return r;
253
254 #else
255   int bytes_read;
256   int start;
257   struct msghdr m;
258   struct iovec iov;
259
260   _dbus_assert (count >= 0);
261   _dbus_assert (*n_fds >= 0);
262
263   start = _dbus_string_get_length (buffer);
264
265   if (!_dbus_string_lengthen (buffer, count))
266     {
267       errno = ENOMEM;
268       return -1;
269     }
270
271   _DBUS_ZERO(iov);
272   iov.iov_base = _dbus_string_get_data_len (buffer, start, count);
273   iov.iov_len = count;
274
275   _DBUS_ZERO(m);
276   m.msg_iov = &iov;
277   m.msg_iovlen = 1;
278
279   /* Hmm, we have no clue how long the control data will actually be
280      that is queued for us. The least we can do is assume that the
281      caller knows. Hence let's make space for the number of fds that
282      we shall read at max plus the cmsg header. */
283   m.msg_controllen = CMSG_SPACE(*n_fds * sizeof(int));
284
285   /* It's probably safe to assume that systems with SCM_RIGHTS also
286      know alloca() */
287   m.msg_control = alloca(m.msg_controllen);
288   memset(m.msg_control, 0, m.msg_controllen);
289
290  again:
291
292   bytes_read = recvmsg(fd, &m, 0
293 #ifdef MSG_CMSG_CLOEXEC
294                        |MSG_CMSG_CLOEXEC
295 #endif
296                        );
297
298   if (bytes_read < 0)
299     {
300       if (errno == EINTR)
301         goto again;
302       else
303         {
304           /* put length back (note that this doesn't actually realloc anything) */
305           _dbus_string_set_length (buffer, start);
306           return -1;
307         }
308     }
309   else
310     {
311       struct cmsghdr *cm;
312       dbus_bool_t found = FALSE;
313
314       if (m.msg_flags & MSG_CTRUNC)
315         {
316           /* Hmm, apparently the control data was truncated. The bad
317              thing is that we might have completely lost a couple of fds
318              without chance to recover them. Hence let's treat this as a
319              serious error. */
320
321           errno = ENOSPC;
322           _dbus_string_set_length (buffer, start);
323           return -1;
324         }
325
326       for (cm = CMSG_FIRSTHDR(&m); cm; cm = CMSG_NXTHDR(&m, cm))
327         if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SCM_RIGHTS)
328           {
329             unsigned i;
330
331             _dbus_assert(cm->cmsg_len <= CMSG_LEN(*n_fds * sizeof(int)));
332             *n_fds = (cm->cmsg_len - CMSG_LEN(0)) / sizeof(int);
333
334             memcpy(fds, CMSG_DATA(cm), *n_fds * sizeof(int));
335             found = TRUE;
336
337             /* Linux doesn't tell us whether MSG_CMSG_CLOEXEC actually
338                worked, hence we need to go through this list and set
339                CLOEXEC everywhere in any case */
340             for (i = 0; i < *n_fds; i++)
341               _dbus_fd_set_close_on_exec(fds[i]);
342
343             break;
344           }
345
346       if (!found)
347         *n_fds = 0;
348
349       /* put length back (doesn't actually realloc) */
350       _dbus_string_set_length (buffer, start + bytes_read);
351
352 #if 0
353       if (bytes_read > 0)
354         _dbus_verbose_bytes_of_string (buffer, start, bytes_read);
355 #endif
356
357       return bytes_read;
358     }
359 #endif
360 }
361
362 int
363 _dbus_write_socket_with_unix_fds(int               fd,
364                                  const DBusString *buffer,
365                                  int               start,
366                                  int               len,
367                                  const int        *fds,
368                                  int               n_fds) {
369
370 #ifndef HAVE_UNIX_FD_PASSING
371
372   if (n_fds > 0) {
373     errno = ENOTSUP;
374     return -1;
375   }
376
377   return _dbus_write_socket(fd, buffer, start, len);
378 #else
379   return _dbus_write_socket_with_unix_fds_two(fd, buffer, start, len, NULL, 0, 0, fds, n_fds);
380 #endif
381 }
382
383 int
384 _dbus_write_socket_with_unix_fds_two(int               fd,
385                                      const DBusString *buffer1,
386                                      int               start1,
387                                      int               len1,
388                                      const DBusString *buffer2,
389                                      int               start2,
390                                      int               len2,
391                                      const int        *fds,
392                                      int               n_fds) {
393
394 #ifndef HAVE_UNIX_FD_PASSING
395
396   if (n_fds > 0) {
397     errno = ENOTSUP;
398     return -1;
399   }
400
401   return _dbus_write_socket_two(fd,
402                                 buffer1, start1, len1,
403                                 buffer2, start2, len2);
404 #else
405
406   struct msghdr m;
407   struct cmsghdr *cm;
408   struct iovec iov[2];
409   int bytes_written;
410
411   _dbus_assert (len1 >= 0);
412   _dbus_assert (len2 >= 0);
413   _dbus_assert (n_fds >= 0);
414
415   _DBUS_ZERO(iov);
416   iov[0].iov_base = (char*) _dbus_string_get_const_data_len (buffer1, start1, len1);
417   iov[0].iov_len = len1;
418
419   if (buffer2)
420     {
421       iov[1].iov_base = (char*) _dbus_string_get_const_data_len (buffer2, start2, len2);
422       iov[1].iov_len = len2;
423     }
424
425   _DBUS_ZERO(m);
426   m.msg_iov = iov;
427   m.msg_iovlen = buffer2 ? 2 : 1;
428
429   if (n_fds > 0)
430     {
431       m.msg_controllen = CMSG_SPACE(n_fds * sizeof(int));
432       m.msg_control = alloca(m.msg_controllen);
433       memset(m.msg_control, 0, m.msg_controllen);
434
435       cm = CMSG_FIRSTHDR(&m);
436       cm->cmsg_level = SOL_SOCKET;
437       cm->cmsg_type = SCM_RIGHTS;
438       cm->cmsg_len = CMSG_LEN(n_fds * sizeof(int));
439       memcpy(CMSG_DATA(cm), fds, n_fds * sizeof(int));
440     }
441
442  again:
443
444   bytes_written = sendmsg (fd, &m, 0
445 #if HAVE_DECL_MSG_NOSIGNAL
446                            |MSG_NOSIGNAL
447 #endif
448                            );
449
450   if (bytes_written < 0 && errno == EINTR)
451     goto again;
452
453 #if 0
454   if (bytes_written > 0)
455     _dbus_verbose_bytes_of_string (buffer, start, bytes_written);
456 #endif
457
458   return bytes_written;
459 #endif
460 }
461
462 /**
463  * Like _dbus_write_two() but only works on sockets and is thus
464  * available on Windows.
465  *
466  * @param fd the file descriptor
467  * @param buffer1 first buffer
468  * @param start1 first byte to write in first buffer
469  * @param len1 number of bytes to write from first buffer
470  * @param buffer2 second buffer, or #NULL
471  * @param start2 first byte to write in second buffer
472  * @param len2 number of bytes to write in second buffer
473  * @returns total bytes written from both buffers, or -1 on error
474  */
475 int
476 _dbus_write_socket_two (int               fd,
477                         const DBusString *buffer1,
478                         int               start1,
479                         int               len1,
480                         const DBusString *buffer2,
481                         int               start2,
482                         int               len2)
483 {
484 #if HAVE_DECL_MSG_NOSIGNAL
485   struct iovec vectors[2];
486   const char *data1;
487   const char *data2;
488   int bytes_written;
489   struct msghdr m;
490
491   _dbus_assert (buffer1 != NULL);
492   _dbus_assert (start1 >= 0);
493   _dbus_assert (start2 >= 0);
494   _dbus_assert (len1 >= 0);
495   _dbus_assert (len2 >= 0);
496
497   data1 = _dbus_string_get_const_data_len (buffer1, start1, len1);
498
499   if (buffer2 != NULL)
500     data2 = _dbus_string_get_const_data_len (buffer2, start2, len2);
501   else
502     {
503       data2 = NULL;
504       start2 = 0;
505       len2 = 0;
506     }
507
508   vectors[0].iov_base = (char*) data1;
509   vectors[0].iov_len = len1;
510   vectors[1].iov_base = (char*) data2;
511   vectors[1].iov_len = len2;
512
513   _DBUS_ZERO(m);
514   m.msg_iov = vectors;
515   m.msg_iovlen = data2 ? 2 : 1;
516
517  again:
518
519   bytes_written = sendmsg (fd, &m, MSG_NOSIGNAL);
520
521   if (bytes_written < 0 && errno == EINTR)
522     goto again;
523
524   return bytes_written;
525
526 #else
527   return _dbus_write_two (fd, buffer1, start1, len1,
528                           buffer2, start2, len2);
529 #endif
530 }
531
532 dbus_bool_t
533 _dbus_socket_is_invalid (int fd)
534 {
535     return fd < 0 ? TRUE : FALSE;
536 }
537
538 /**
539  * Thin wrapper around the read() system call that appends
540  * the data it reads to the DBusString buffer. It appends
541  * up to the given count, and returns the same value
542  * and same errno as read(). The only exception is that
543  * _dbus_read() handles EINTR for you. Also, _dbus_read() can
544  * return ENOMEM, even though regular UNIX read doesn't.
545  *
546  * Unlike _dbus_read_socket(), _dbus_read() is not available
547  * on Windows.
548  *
549  * @param fd the file descriptor to read from
550  * @param buffer the buffer to append data to
551  * @param count the amount of data to read
552  * @returns the number of bytes read or -1
553  */
554 int
555 _dbus_read (int               fd,
556             DBusString       *buffer,
557             int               count)
558 {
559   int bytes_read;
560   int start;
561   char *data;
562
563   _dbus_assert (count >= 0);
564
565   start = _dbus_string_get_length (buffer);
566
567   if (!_dbus_string_lengthen (buffer, count))
568     {
569       errno = ENOMEM;
570       return -1;
571     }
572
573   data = _dbus_string_get_data_len (buffer, start, count);
574
575  again:
576
577   bytes_read = read (fd, data, count);
578
579   if (bytes_read < 0)
580     {
581       if (errno == EINTR)
582         goto again;
583       else
584         {
585           /* put length back (note that this doesn't actually realloc anything) */
586           _dbus_string_set_length (buffer, start);
587           return -1;
588         }
589     }
590   else
591     {
592       /* put length back (doesn't actually realloc) */
593       _dbus_string_set_length (buffer, start + bytes_read);
594
595 #if 0
596       if (bytes_read > 0)
597         _dbus_verbose_bytes_of_string (buffer, start, bytes_read);
598 #endif
599
600       return bytes_read;
601     }
602 }
603
604 /**
605  * Thin wrapper around the write() system call that writes a part of a
606  * DBusString and handles EINTR for you.
607  *
608  * @param fd the file descriptor to write
609  * @param buffer the buffer to write data from
610  * @param start the first byte in the buffer to write
611  * @param len the number of bytes to try to write
612  * @returns the number of bytes written or -1 on error
613  */
614 int
615 _dbus_write (int               fd,
616              const DBusString *buffer,
617              int               start,
618              int               len)
619 {
620   const char *data;
621   int bytes_written;
622
623   data = _dbus_string_get_const_data_len (buffer, start, len);
624
625  again:
626
627   bytes_written = write (fd, data, len);
628
629   if (bytes_written < 0 && errno == EINTR)
630     goto again;
631
632 #if 0
633   if (bytes_written > 0)
634     _dbus_verbose_bytes_of_string (buffer, start, bytes_written);
635 #endif
636
637   return bytes_written;
638 }
639
640 /**
641  * Like _dbus_write() but will use writev() if possible
642  * to write both buffers in sequence. The return value
643  * is the number of bytes written in the first buffer,
644  * plus the number written in the second. If the first
645  * buffer is written successfully and an error occurs
646  * writing the second, the number of bytes in the first
647  * is returned (i.e. the error is ignored), on systems that
648  * don't have writev. Handles EINTR for you.
649  * The second buffer may be #NULL.
650  *
651  * @param fd the file descriptor
652  * @param buffer1 first buffer
653  * @param start1 first byte to write in first buffer
654  * @param len1 number of bytes to write from first buffer
655  * @param buffer2 second buffer, or #NULL
656  * @param start2 first byte to write in second buffer
657  * @param len2 number of bytes to write in second buffer
658  * @returns total bytes written from both buffers, or -1 on error
659  */
660 int
661 _dbus_write_two (int               fd,
662                  const DBusString *buffer1,
663                  int               start1,
664                  int               len1,
665                  const DBusString *buffer2,
666                  int               start2,
667                  int               len2)
668 {
669   _dbus_assert (buffer1 != NULL);
670   _dbus_assert (start1 >= 0);
671   _dbus_assert (start2 >= 0);
672   _dbus_assert (len1 >= 0);
673   _dbus_assert (len2 >= 0);
674
675 #ifdef HAVE_WRITEV
676   {
677     struct iovec vectors[2];
678     const char *data1;
679     const char *data2;
680     int bytes_written;
681
682     data1 = _dbus_string_get_const_data_len (buffer1, start1, len1);
683
684     if (buffer2 != NULL)
685       data2 = _dbus_string_get_const_data_len (buffer2, start2, len2);
686     else
687       {
688         data2 = NULL;
689         start2 = 0;
690         len2 = 0;
691       }
692
693     vectors[0].iov_base = (char*) data1;
694     vectors[0].iov_len = len1;
695     vectors[1].iov_base = (char*) data2;
696     vectors[1].iov_len = len2;
697
698   again:
699
700     bytes_written = writev (fd,
701                             vectors,
702                             data2 ? 2 : 1);
703
704     if (bytes_written < 0 && errno == EINTR)
705       goto again;
706
707     return bytes_written;
708   }
709 #else /* HAVE_WRITEV */
710   {
711     int ret1;
712
713     ret1 = _dbus_write (fd, buffer1, start1, len1);
714     if (ret1 == len1 && buffer2 != NULL)
715       {
716         ret2 = _dbus_write (fd, buffer2, start2, len2);
717         if (ret2 < 0)
718           ret2 = 0; /* we can't report an error as the first write was OK */
719
720         return ret1 + ret2;
721       }
722     else
723       return ret1;
724   }
725 #endif /* !HAVE_WRITEV */
726 }
727
728 #define _DBUS_MAX_SUN_PATH_LENGTH 99
729
730 /**
731  * @def _DBUS_MAX_SUN_PATH_LENGTH
732  *
733  * Maximum length of the path to a UNIX domain socket,
734  * sockaddr_un::sun_path member. POSIX requires that all systems
735  * support at least 100 bytes here, including the nul termination.
736  * We use 99 for the max value to allow for the nul.
737  *
738  * We could probably also do sizeof (addr.sun_path)
739  * but this way we are the same on all platforms
740  * which is probably a good idea.
741  */
742
743 /**
744  * Creates a socket and connects it to the UNIX domain socket at the
745  * given path.  The connection fd is returned, and is set up as
746  * nonblocking.
747  *
748  * Uses abstract sockets instead of filesystem-linked sockets if
749  * requested (it's possible only on Linux; see "man 7 unix" on Linux).
750  * On non-Linux abstract socket usage always fails.
751  *
752  * This will set FD_CLOEXEC for the socket returned.
753  *
754  * @param path the path to UNIX domain socket
755  * @param abstract #TRUE to use abstract namespace
756  * @param error return location for error code
757  * @returns connection file descriptor or -1 on error
758  */
759 int
760 _dbus_connect_unix_socket (const char     *path,
761                            dbus_bool_t     abstract,
762                            DBusError      *error)
763 {
764   int fd;
765   size_t path_len;
766   struct sockaddr_un addr;
767
768   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
769
770   _dbus_verbose ("connecting to unix socket %s abstract=%d\n",
771                  path, abstract);
772
773
774   if (!_dbus_open_unix_socket (&fd, error))
775     {
776       _DBUS_ASSERT_ERROR_IS_SET(error);
777       return -1;
778     }
779   _DBUS_ASSERT_ERROR_IS_CLEAR(error);
780
781   _DBUS_ZERO (addr);
782   addr.sun_family = AF_UNIX;
783   path_len = strlen (path);
784
785   if (abstract)
786     {
787 #ifdef HAVE_ABSTRACT_SOCKETS
788       addr.sun_path[0] = '\0'; /* this is what says "use abstract" */
789       path_len++; /* Account for the extra nul byte added to the start of sun_path */
790
791       if (path_len > _DBUS_MAX_SUN_PATH_LENGTH)
792         {
793           dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
794                       "Abstract socket name too long\n");
795           _dbus_close (fd, NULL);
796           return -1;
797         }
798
799       strncpy (&addr.sun_path[1], path, path_len);
800       /* _dbus_verbose_bytes (addr.sun_path, sizeof (addr.sun_path)); */
801 #else /* HAVE_ABSTRACT_SOCKETS */
802       dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED,
803                       "Operating system does not support abstract socket namespace\n");
804       _dbus_close (fd, NULL);
805       return -1;
806 #endif /* ! HAVE_ABSTRACT_SOCKETS */
807     }
808   else
809     {
810       if (path_len > _DBUS_MAX_SUN_PATH_LENGTH)
811         {
812           dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
813                       "Socket name too long\n");
814           _dbus_close (fd, NULL);
815           return -1;
816         }
817
818       strncpy (addr.sun_path, path, path_len);
819     }
820
821   if (connect (fd, (struct sockaddr*) &addr, _DBUS_STRUCT_OFFSET (struct sockaddr_un, sun_path) + path_len) < 0)
822     {
823       dbus_set_error (error,
824                       _dbus_error_from_errno (errno),
825                       "Failed to connect to socket %s: %s",
826                       path, _dbus_strerror (errno));
827
828       _dbus_close (fd, NULL);
829       fd = -1;
830
831       return -1;
832     }
833
834   if (!_dbus_set_fd_nonblocking (fd, error))
835     {
836       _DBUS_ASSERT_ERROR_IS_SET (error);
837
838       _dbus_close (fd, NULL);
839       fd = -1;
840
841       return -1;
842     }
843
844   return fd;
845 }
846
847 /**
848  * Enables or disables the reception of credentials on the given socket during
849  * the next message transmission.  This is only effective if the #LOCAL_CREDS
850  * system feature exists, in which case the other side of the connection does
851  * not have to do anything special to send the credentials.
852  *
853  * @param fd socket on which to change the #LOCAL_CREDS flag.
854  * @param on whether to enable or disable the #LOCAL_CREDS flag.
855  */
856 static dbus_bool_t
857 _dbus_set_local_creds (int fd, dbus_bool_t on)
858 {
859   dbus_bool_t retval = TRUE;
860
861 #if defined(HAVE_CMSGCRED)
862   /* NOOP just to make sure only one codepath is used
863    *      and to prefer CMSGCRED
864    */
865 #elif defined(LOCAL_CREDS)
866   int val = on ? 1 : 0;
867   if (setsockopt (fd, 0, LOCAL_CREDS, &val, sizeof (val)) < 0)
868     {
869       _dbus_verbose ("Unable to set LOCAL_CREDS socket option on fd %d\n", fd);
870       retval = FALSE;
871     }
872   else
873     _dbus_verbose ("LOCAL_CREDS %s for further messages on fd %d\n",
874                    on ? "enabled" : "disabled", fd);
875 #endif
876
877   return retval;
878 }
879
880 /**
881  * Creates a socket and binds it to the given path,
882  * then listens on the socket. The socket is
883  * set to be nonblocking.
884  *
885  * Uses abstract sockets instead of filesystem-linked
886  * sockets if requested (it's possible only on Linux;
887  * see "man 7 unix" on Linux).
888  * On non-Linux abstract socket usage always fails.
889  *
890  * This will set FD_CLOEXEC for the socket returned
891  *
892  * @param path the socket name
893  * @param abstract #TRUE to use abstract namespace
894  * @param error return location for errors
895  * @returns the listening file descriptor or -1 on error
896  */
897 int
898 _dbus_listen_unix_socket (const char     *path,
899                           dbus_bool_t     abstract,
900                           DBusError      *error)
901 {
902   int listen_fd;
903   struct sockaddr_un addr;
904   size_t path_len;
905   unsigned int reuseaddr;
906
907   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
908
909   _dbus_verbose ("listening on unix socket %s abstract=%d\n",
910                  path, abstract);
911
912   if (!_dbus_open_unix_socket (&listen_fd, error))
913     {
914       _DBUS_ASSERT_ERROR_IS_SET(error);
915       return -1;
916     }
917   _DBUS_ASSERT_ERROR_IS_CLEAR(error);
918
919   _DBUS_ZERO (addr);
920   addr.sun_family = AF_UNIX;
921   path_len = strlen (path);
922
923   if (abstract)
924     {
925 #ifdef HAVE_ABSTRACT_SOCKETS
926       /* remember that abstract names aren't nul-terminated so we rely
927        * on sun_path being filled in with zeroes above.
928        */
929       addr.sun_path[0] = '\0'; /* this is what says "use abstract" */
930       path_len++; /* Account for the extra nul byte added to the start of sun_path */
931
932       if (path_len > _DBUS_MAX_SUN_PATH_LENGTH)
933         {
934           dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
935                       "Abstract socket name too long\n");
936           _dbus_close (listen_fd, NULL);
937           return -1;
938         }
939
940       strncpy (&addr.sun_path[1], path, path_len);
941       /* _dbus_verbose_bytes (addr.sun_path, sizeof (addr.sun_path)); */
942 #else /* HAVE_ABSTRACT_SOCKETS */
943       dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED,
944                       "Operating system does not support abstract socket namespace\n");
945       _dbus_close (listen_fd, NULL);
946       return -1;
947 #endif /* ! HAVE_ABSTRACT_SOCKETS */
948     }
949   else
950     {
951       /* Discussed security implications of this with Nalin,
952        * and we couldn't think of where it would kick our ass, but
953        * it still seems a bit sucky. It also has non-security suckage;
954        * really we'd prefer to exit if the socket is already in use.
955        * But there doesn't seem to be a good way to do this.
956        *
957        * Just to be extra careful, I threw in the stat() - clearly
958        * the stat() can't *fix* any security issue, but it at least
959        * avoids inadvertent/accidental data loss.
960        */
961       {
962         struct stat sb;
963
964         if (stat (path, &sb) == 0 &&
965             S_ISSOCK (sb.st_mode))
966           unlink (path);
967       }
968
969       if (path_len > _DBUS_MAX_SUN_PATH_LENGTH)
970         {
971           dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
972                       "Abstract socket name too long\n");
973           _dbus_close (listen_fd, NULL);
974           return -1;
975         }
976
977       strncpy (addr.sun_path, path, path_len);
978     }
979
980   reuseaddr = 1;
981   if (setsockopt  (listen_fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr))==-1)
982     {
983       _dbus_warn ("Failed to set socket option\"%s\": %s",
984                   path, _dbus_strerror (errno));
985     }
986
987   if (bind (listen_fd, (struct sockaddr*) &addr, _DBUS_STRUCT_OFFSET (struct sockaddr_un, sun_path) + path_len) < 0)
988     {
989       dbus_set_error (error, _dbus_error_from_errno (errno),
990                       "Failed to bind socket \"%s\": %s",
991                       path, _dbus_strerror (errno));
992       _dbus_close (listen_fd, NULL);
993       return -1;
994     }
995
996   if (listen (listen_fd, 30 /* backlog */) < 0)
997     {
998       dbus_set_error (error, _dbus_error_from_errno (errno),
999                       "Failed to listen on socket \"%s\": %s",
1000                       path, _dbus_strerror (errno));
1001       _dbus_close (listen_fd, NULL);
1002       return -1;
1003     }
1004
1005   if (!_dbus_set_local_creds (listen_fd, TRUE))
1006     {
1007       dbus_set_error (error, _dbus_error_from_errno (errno),
1008                       "Failed to enable LOCAL_CREDS on socket \"%s\": %s",
1009                       path, _dbus_strerror (errno));
1010       close (listen_fd);
1011       return -1;
1012     }
1013
1014   if (!_dbus_set_fd_nonblocking (listen_fd, error))
1015     {
1016       _DBUS_ASSERT_ERROR_IS_SET (error);
1017       _dbus_close (listen_fd, NULL);
1018       return -1;
1019     }
1020
1021   /* Try opening up the permissions, but if we can't, just go ahead
1022    * and continue, maybe it will be good enough.
1023    */
1024   if (!abstract && chmod (path, 0777) < 0)
1025     _dbus_warn ("Could not set mode 0777 on socket %s\n",
1026                 path);
1027
1028   return listen_fd;
1029 }
1030
1031 /**
1032  * Acquires one or more sockets passed in from systemd. The sockets
1033  * are set to be nonblocking.
1034  *
1035  * This will set FD_CLOEXEC for the sockets returned.
1036  *
1037  * @oaram fds the file descriptors
1038  * @param error return location for errors
1039  * @returns the number of file descriptors
1040  */
1041 int
1042 _dbus_listen_systemd_sockets (int       **fds,
1043                               DBusError *error)
1044 {
1045   int r, n;
1046   unsigned fd;
1047   int *new_fds;
1048
1049   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1050
1051   n = sd_listen_fds (TRUE);
1052   if (n < 0)
1053     {
1054       dbus_set_error (error, _dbus_error_from_errno (-n),
1055                       "Failed to acquire systemd socket: %s",
1056                       _dbus_strerror (-n));
1057       return -1;
1058     }
1059
1060   if (n <= 0)
1061     {
1062       dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
1063                       "No socket received.");
1064       return -1;
1065     }
1066
1067   for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++)
1068     {
1069       r = sd_is_socket (fd, AF_UNSPEC, SOCK_STREAM, 1);
1070       if (r < 0)
1071         {
1072           dbus_set_error (error, _dbus_error_from_errno (-r),
1073                           "Failed to verify systemd socket type: %s",
1074                           _dbus_strerror (-r));
1075           return -1;
1076         }
1077
1078       if (!r)
1079         {
1080           dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
1081                           "Passed socket has wrong type.");
1082           return -1;
1083         }
1084     }
1085
1086   /* OK, the file descriptors are all good, so let's take posession of
1087      them then. */
1088
1089   new_fds = dbus_new (int, n);
1090   if (!new_fds)
1091     {
1092       dbus_set_error (error, DBUS_ERROR_NO_MEMORY,
1093                       "Failed to allocate file handle array.");
1094       goto fail;
1095     }
1096
1097   for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++)
1098     {
1099       if (!_dbus_set_local_creds (fd, TRUE))
1100         {
1101           dbus_set_error (error, _dbus_error_from_errno (errno),
1102                           "Failed to enable LOCAL_CREDS on systemd socket: %s",
1103                           _dbus_strerror (errno));
1104           goto fail;
1105         }
1106
1107       if (!_dbus_set_fd_nonblocking (fd, error))
1108         {
1109           _DBUS_ASSERT_ERROR_IS_SET (error);
1110           goto fail;
1111         }
1112
1113       new_fds[fd - SD_LISTEN_FDS_START] = fd;
1114     }
1115
1116   *fds = new_fds;
1117   return n;
1118
1119  fail:
1120
1121   for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++)
1122     {
1123       _dbus_close (fd, NULL);
1124     }
1125
1126   dbus_free (new_fds);
1127   return -1;
1128 }
1129
1130 /**
1131  * Creates a socket and connects to a socket at the given host
1132  * and port. The connection fd is returned, and is set up as
1133  * nonblocking.
1134  *
1135  * This will set FD_CLOEXEC for the socket returned
1136  *
1137  * @param host the host name to connect to
1138  * @param port the port to connect to
1139  * @param family the address family to listen on, NULL for all
1140  * @param error return location for error code
1141  * @returns connection file descriptor or -1 on error
1142  */
1143 int
1144 _dbus_connect_tcp_socket (const char     *host,
1145                           const char     *port,
1146                           const char     *family,
1147                           DBusError      *error)
1148 {
1149     return _dbus_connect_tcp_socket_with_nonce (host, port, family, (const char*)NULL, error);
1150 }
1151
1152 int
1153 _dbus_connect_tcp_socket_with_nonce (const char     *host,
1154                                      const char     *port,
1155                                      const char     *family,
1156                                      const char     *noncefile,
1157                                      DBusError      *error)
1158 {
1159   int saved_errno = 0;
1160   int fd = -1, res;
1161   struct addrinfo hints;
1162   struct addrinfo *ai, *tmp;
1163
1164   _DBUS_ASSERT_ERROR_IS_CLEAR(error);
1165
1166   _DBUS_ZERO (hints);
1167
1168   if (!family)
1169     hints.ai_family = AF_UNSPEC;
1170   else if (!strcmp(family, "ipv4"))
1171     hints.ai_family = AF_INET;
1172   else if (!strcmp(family, "ipv6"))
1173     hints.ai_family = AF_INET6;
1174   else
1175     {
1176       dbus_set_error (error,
1177                       DBUS_ERROR_BAD_ADDRESS,
1178                       "Unknown address family %s", family);
1179       return -1;
1180     }
1181   hints.ai_protocol = IPPROTO_TCP;
1182   hints.ai_socktype = SOCK_STREAM;
1183   hints.ai_flags = AI_ADDRCONFIG;
1184
1185   if ((res = getaddrinfo(host, port, &hints, &ai)) != 0)
1186     {
1187       dbus_set_error (error,
1188                       _dbus_error_from_errno (errno),
1189                       "Failed to lookup host/port: \"%s:%s\": %s (%d)",
1190                       host, port, gai_strerror(res), res);
1191       _dbus_close (fd, NULL);
1192       return -1;
1193     }
1194
1195   tmp = ai;
1196   while (tmp)
1197     {
1198       if (!_dbus_open_socket (&fd, tmp->ai_family, SOCK_STREAM, 0, error))
1199         {
1200           freeaddrinfo(ai);
1201           _DBUS_ASSERT_ERROR_IS_SET(error);
1202           return -1;
1203         }
1204       _DBUS_ASSERT_ERROR_IS_CLEAR(error);
1205
1206       if (connect (fd, (struct sockaddr*) tmp->ai_addr, tmp->ai_addrlen) < 0)
1207         {
1208           saved_errno = errno;
1209           _dbus_close(fd, NULL);
1210           fd = -1;
1211           tmp = tmp->ai_next;
1212           continue;
1213         }
1214
1215       break;
1216     }
1217   freeaddrinfo(ai);
1218
1219   if (fd == -1)
1220     {
1221       dbus_set_error (error,
1222                       _dbus_error_from_errno (saved_errno),
1223                       "Failed to connect to socket \"%s:%s\" %s",
1224                       host, port, _dbus_strerror(saved_errno));
1225       return -1;
1226     }
1227
1228   if (noncefile != NULL)
1229     {
1230       DBusString noncefileStr;
1231       dbus_bool_t ret;
1232       _dbus_string_init_const (&noncefileStr, noncefile);
1233       ret = _dbus_send_nonce (fd, &noncefileStr, error);
1234       _dbus_string_free (&noncefileStr);
1235
1236       if (!ret)
1237     {
1238       _dbus_close (fd, NULL);
1239           return -1;
1240         }
1241     }
1242
1243   if (!_dbus_set_fd_nonblocking (fd, error))
1244     {
1245       _dbus_close (fd, NULL);
1246       return -1;
1247     }
1248
1249   return fd;
1250 }
1251
1252 /**
1253  * Creates a socket and binds it to the given path, then listens on
1254  * the socket. The socket is set to be nonblocking.  In case of port=0
1255  * a random free port is used and returned in the port parameter.
1256  * If inaddr_any is specified, the hostname is ignored.
1257  *
1258  * This will set FD_CLOEXEC for the socket returned
1259  *
1260  * @param host the host name to listen on
1261  * @param port the port to listen on, if zero a free port will be used
1262  * @param family the address family to listen on, NULL for all
1263  * @param retport string to return the actual port listened on
1264  * @param fds_p location to store returned file descriptors
1265  * @param error return location for errors
1266  * @returns the number of listening file descriptors or -1 on error
1267  */
1268 int
1269 _dbus_listen_tcp_socket (const char     *host,
1270                          const char     *port,
1271                          const char     *family,
1272                          DBusString     *retport,
1273                          int           **fds_p,
1274                          DBusError      *error)
1275 {
1276   int saved_errno;
1277   int nlisten_fd = 0, *listen_fd = NULL, res, i;
1278   struct addrinfo hints;
1279   struct addrinfo *ai, *tmp;
1280   unsigned int reuseaddr;
1281
1282   *fds_p = NULL;
1283   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1284
1285   _DBUS_ZERO (hints);
1286
1287   if (!family)
1288     hints.ai_family = AF_UNSPEC;
1289   else if (!strcmp(family, "ipv4"))
1290     hints.ai_family = AF_INET;
1291   else if (!strcmp(family, "ipv6"))
1292     hints.ai_family = AF_INET6;
1293   else
1294     {
1295       dbus_set_error (error,
1296                       DBUS_ERROR_BAD_ADDRESS,
1297                       "Unknown address family %s", family);
1298       return -1;
1299     }
1300
1301   hints.ai_protocol = IPPROTO_TCP;
1302   hints.ai_socktype = SOCK_STREAM;
1303   hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;
1304
1305  redo_lookup_with_port:
1306   if ((res = getaddrinfo(host, port, &hints, &ai)) != 0 || !ai)
1307     {
1308       dbus_set_error (error,
1309                       _dbus_error_from_errno (errno),
1310                       "Failed to lookup host/port: \"%s:%s\": %s (%d)",
1311                       host ? host : "*", port, gai_strerror(res), res);
1312       return -1;
1313     }
1314
1315   tmp = ai;
1316   while (tmp)
1317     {
1318       int fd = -1, *newlisten_fd;
1319       if (!_dbus_open_socket (&fd, tmp->ai_family, SOCK_STREAM, 0, error))
1320         {
1321           _DBUS_ASSERT_ERROR_IS_SET(error);
1322           goto failed;
1323         }
1324       _DBUS_ASSERT_ERROR_IS_CLEAR(error);
1325
1326       reuseaddr = 1;
1327       if (setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr))==-1)
1328         {
1329           _dbus_warn ("Failed to set socket option \"%s:%s\": %s",
1330                       host ? host : "*", port, _dbus_strerror (errno));
1331         }
1332
1333       if (bind (fd, (struct sockaddr*) tmp->ai_addr, tmp->ai_addrlen) < 0)
1334         {
1335           saved_errno = errno;
1336           _dbus_close(fd, NULL);
1337           if (saved_errno == EADDRINUSE)
1338             {
1339               /* Depending on kernel policy, it may or may not
1340                  be neccessary to bind to both IPv4 & 6 addresses
1341                  so ignore EADDRINUSE here */
1342               tmp = tmp->ai_next;
1343               continue;
1344             }
1345           dbus_set_error (error, _dbus_error_from_errno (saved_errno),
1346                           "Failed to bind socket \"%s:%s\": %s",
1347                           host ? host : "*", port, _dbus_strerror (saved_errno));
1348           goto failed;
1349         }
1350
1351       if (listen (fd, 30 /* backlog */) < 0)
1352         {
1353           saved_errno = errno;
1354           _dbus_close (fd, NULL);
1355           dbus_set_error (error, _dbus_error_from_errno (saved_errno),
1356                           "Failed to listen on socket \"%s:%s\": %s",
1357                           host ? host : "*", port, _dbus_strerror (saved_errno));
1358           goto failed;
1359         }
1360
1361       newlisten_fd = dbus_realloc(listen_fd, sizeof(int)*(nlisten_fd+1));
1362       if (!newlisten_fd)
1363         {
1364           saved_errno = errno;
1365           _dbus_close (fd, NULL);
1366           dbus_set_error (error, _dbus_error_from_errno (saved_errno),
1367                           "Failed to allocate file handle array: %s",
1368                           _dbus_strerror (saved_errno));
1369           goto failed;
1370         }
1371       listen_fd = newlisten_fd;
1372       listen_fd[nlisten_fd] = fd;
1373       nlisten_fd++;
1374
1375       if (!_dbus_string_get_length(retport))
1376         {
1377           /* If the user didn't specify a port, or used 0, then
1378              the kernel chooses a port. After the first address
1379              is bound to, we need to force all remaining addresses
1380              to use the same port */
1381           if (!port || !strcmp(port, "0"))
1382             {
1383               int result;
1384               struct sockaddr_storage addr;
1385               socklen_t addrlen;
1386               char portbuf[50];
1387
1388               addrlen = sizeof(addr);
1389               result = getsockname(fd, (struct sockaddr*) &addr, &addrlen);
1390
1391               if (result == -1 ||
1392                   (res = getnameinfo ((struct sockaddr*)&addr, addrlen, NULL, 0,
1393                                       portbuf, sizeof(portbuf),
1394                                       NI_NUMERICHOST)) != 0)
1395                 {
1396                   dbus_set_error (error, _dbus_error_from_errno (errno),
1397                                   "Failed to resolve port \"%s:%s\": %s (%s)",
1398                                   host ? host : "*", port, gai_strerror(res), res);
1399                   goto failed;
1400                 }
1401               if (!_dbus_string_append(retport, portbuf))
1402                 {
1403                   dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1404                   goto failed;
1405                 }
1406
1407               /* Release current address list & redo lookup */
1408               port = _dbus_string_get_const_data(retport);
1409               freeaddrinfo(ai);
1410               goto redo_lookup_with_port;
1411             }
1412           else
1413             {
1414               if (!_dbus_string_append(retport, port))
1415                 {
1416                     dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1417                     goto failed;
1418                 }
1419             }
1420         }
1421
1422       tmp = tmp->ai_next;
1423     }
1424   freeaddrinfo(ai);
1425   ai = NULL;
1426
1427   if (!nlisten_fd)
1428     {
1429       errno = EADDRINUSE;
1430       dbus_set_error (error, _dbus_error_from_errno (errno),
1431                       "Failed to bind socket \"%s:%s\": %s",
1432                       host ? host : "*", port, _dbus_strerror (errno));
1433       goto failed;
1434     }
1435
1436   for (i = 0 ; i < nlisten_fd ; i++)
1437     {
1438       if (!_dbus_set_fd_nonblocking (listen_fd[i], error))
1439         {
1440           goto failed;
1441         }
1442     }
1443
1444   *fds_p = listen_fd;
1445
1446   return nlisten_fd;
1447
1448  failed:
1449   if (ai)
1450     freeaddrinfo(ai);
1451   for (i = 0 ; i < nlisten_fd ; i++)
1452     _dbus_close(listen_fd[i], NULL);
1453   dbus_free(listen_fd);
1454   return -1;
1455 }
1456
1457 static dbus_bool_t
1458 write_credentials_byte (int             server_fd,
1459                         DBusError      *error)
1460 {
1461   int bytes_written;
1462   char buf[1] = { '\0' };
1463 #if defined(HAVE_CMSGCRED)
1464   union {
1465           struct cmsghdr hdr;
1466           char cred[CMSG_SPACE (sizeof (struct cmsgcred))];
1467   } cmsg;
1468   struct iovec iov;
1469   struct msghdr msg;
1470   iov.iov_base = buf;
1471   iov.iov_len = 1;
1472
1473   _DBUS_ZERO(msg);
1474   msg.msg_iov = &iov;
1475   msg.msg_iovlen = 1;
1476
1477   msg.msg_control = (caddr_t) &cmsg;
1478   msg.msg_controllen = CMSG_SPACE (sizeof (struct cmsgcred));
1479   _DBUS_ZERO(cmsg);
1480   cmsg.hdr.cmsg_len = CMSG_LEN (sizeof (struct cmsgcred));
1481   cmsg.hdr.cmsg_level = SOL_SOCKET;
1482   cmsg.hdr.cmsg_type = SCM_CREDS;
1483 #endif
1484
1485   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1486
1487  again:
1488
1489 #if defined(HAVE_CMSGCRED)
1490   bytes_written = sendmsg (server_fd, &msg, 0
1491 #if HAVE_DECL_MSG_NOSIGNAL
1492                            |MSG_NOSIGNAL
1493 #endif
1494                            );
1495 #else
1496   bytes_written = send (server_fd, buf, 1, 0
1497 #if HAVE_DECL_MSG_NOSIGNAL
1498                         |MSG_NOSIGNAL
1499 #endif
1500                         );
1501 #endif
1502
1503   if (bytes_written < 0 && errno == EINTR)
1504     goto again;
1505
1506   if (bytes_written < 0)
1507     {
1508       dbus_set_error (error, _dbus_error_from_errno (errno),
1509                       "Failed to write credentials byte: %s",
1510                      _dbus_strerror (errno));
1511       return FALSE;
1512     }
1513   else if (bytes_written == 0)
1514     {
1515       dbus_set_error (error, DBUS_ERROR_IO_ERROR,
1516                       "wrote zero bytes writing credentials byte");
1517       return FALSE;
1518     }
1519   else
1520     {
1521       _dbus_assert (bytes_written == 1);
1522       _dbus_verbose ("wrote credentials byte\n");
1523       return TRUE;
1524     }
1525 }
1526
1527 /**
1528  * Reads a single byte which must be nul (an error occurs otherwise),
1529  * and reads unix credentials if available. Clears the credentials
1530  * object, then adds pid/uid if available, so any previous credentials
1531  * stored in the object are lost.
1532  *
1533  * Return value indicates whether a byte was read, not whether
1534  * we got valid credentials. On some systems, such as Linux,
1535  * reading/writing the byte isn't actually required, but we do it
1536  * anyway just to avoid multiple codepaths.
1537  *
1538  * Fails if no byte is available, so you must select() first.
1539  *
1540  * The point of the byte is that on some systems we have to
1541  * use sendmsg()/recvmsg() to transmit credentials.
1542  *
1543  * @param client_fd the client file descriptor
1544  * @param credentials object to add client credentials to
1545  * @param error location to store error code
1546  * @returns #TRUE on success
1547  */
1548 dbus_bool_t
1549 _dbus_read_credentials_socket  (int              client_fd,
1550                                 DBusCredentials *credentials,
1551                                 DBusError       *error)
1552 {
1553   struct msghdr msg;
1554   struct iovec iov;
1555   char buf;
1556   dbus_uid_t uid_read;
1557   dbus_pid_t pid_read;
1558   int bytes_read;
1559
1560 #ifdef HAVE_CMSGCRED
1561   union {
1562     struct cmsghdr hdr;
1563     char cred[CMSG_SPACE (sizeof (struct cmsgcred))];
1564   } cmsg;
1565
1566 #elif defined(LOCAL_CREDS)
1567   struct {
1568     struct cmsghdr hdr;
1569     struct sockcred cred;
1570   } cmsg;
1571 #endif
1572
1573   uid_read = DBUS_UID_UNSET;
1574   pid_read = DBUS_PID_UNSET;
1575
1576   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1577
1578   /* The POSIX spec certainly doesn't promise this, but
1579    * we need these assertions to fail as soon as we're wrong about
1580    * it so we can do the porting fixups
1581    */
1582   _dbus_assert (sizeof (pid_t) <= sizeof (dbus_pid_t));
1583   _dbus_assert (sizeof (uid_t) <= sizeof (dbus_uid_t));
1584   _dbus_assert (sizeof (gid_t) <= sizeof (dbus_gid_t));
1585
1586   _dbus_credentials_clear (credentials);
1587
1588   /* Systems supporting LOCAL_CREDS are configured to have this feature
1589    * enabled (if it does not conflict with HAVE_CMSGCRED) prior accepting
1590    * the connection.  Therefore, the received message must carry the
1591    * credentials information without doing anything special.
1592    */
1593
1594   iov.iov_base = &buf;
1595   iov.iov_len = 1;
1596
1597   _DBUS_ZERO(msg);
1598   msg.msg_iov = &iov;
1599   msg.msg_iovlen = 1;
1600
1601 #if defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS)
1602   _DBUS_ZERO(cmsg);
1603   msg.msg_control = (caddr_t) &cmsg;
1604   msg.msg_controllen = CMSG_SPACE (sizeof (struct cmsgcred));
1605 #endif
1606
1607  again:
1608   bytes_read = recvmsg (client_fd, &msg, 0);
1609
1610   if (bytes_read < 0)
1611     {
1612       if (errno == EINTR)
1613         goto again;
1614
1615       /* EAGAIN or EWOULDBLOCK would be unexpected here since we would
1616        * normally only call read_credentials if the socket was ready
1617        * for reading
1618        */
1619
1620       dbus_set_error (error, _dbus_error_from_errno (errno),
1621                       "Failed to read credentials byte: %s",
1622                       _dbus_strerror (errno));
1623       return FALSE;
1624     }
1625   else if (bytes_read == 0)
1626     {
1627       /* this should not happen unless we are using recvmsg wrong,
1628        * so is essentially here for paranoia
1629        */
1630       dbus_set_error (error, DBUS_ERROR_FAILED,
1631                       "Failed to read credentials byte (zero-length read)");
1632       return FALSE;
1633     }
1634   else if (buf != '\0')
1635     {
1636       dbus_set_error (error, DBUS_ERROR_FAILED,
1637                       "Credentials byte was not nul");
1638       return FALSE;
1639     }
1640
1641 #if defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS)
1642   if (cmsg.hdr.cmsg_len < CMSG_LEN (sizeof (struct cmsgcred))
1643                   || cmsg.hdr.cmsg_type != SCM_CREDS)
1644     {
1645       dbus_set_error (error, DBUS_ERROR_FAILED,
1646                       "Message from recvmsg() was not SCM_CREDS");
1647       return FALSE;
1648     }
1649 #endif
1650
1651   _dbus_verbose ("read credentials byte\n");
1652
1653   {
1654 #ifdef SO_PEERCRED
1655 #ifdef __OpenBSD__
1656     struct sockpeercred cr;
1657 #else
1658     struct ucred cr;
1659 #endif
1660     int cr_len = sizeof (cr);
1661
1662     if (getsockopt (client_fd, SOL_SOCKET, SO_PEERCRED, &cr, &cr_len) == 0 &&
1663         cr_len == sizeof (cr))
1664       {
1665         pid_read = cr.pid;
1666         uid_read = cr.uid;
1667       }
1668     else
1669       {
1670         _dbus_verbose ("Failed to getsockopt() credentials, returned len %d/%d: %s\n",
1671                        cr_len, (int) sizeof (cr), _dbus_strerror (errno));
1672       }
1673 #elif defined(HAVE_CMSGCRED)
1674     struct cmsgcred *cred;
1675
1676     cred = (struct cmsgcred *) CMSG_DATA (&cmsg.hdr);
1677     pid_read = cred->cmcred_pid;
1678     uid_read = cred->cmcred_euid;
1679 #elif defined(LOCAL_CREDS)
1680     pid_read = DBUS_PID_UNSET;
1681     uid_read = cmsg.cred.sc_uid;
1682     /* Since we have already got the credentials from this socket, we can
1683      * disable its LOCAL_CREDS flag if it was ever set. */
1684     _dbus_set_local_creds (client_fd, FALSE);
1685 #elif defined(HAVE_GETPEEREID)
1686     uid_t euid;
1687     gid_t egid;
1688     if (getpeereid (client_fd, &euid, &egid) == 0)
1689       {
1690         uid_read = euid;
1691       }
1692     else
1693       {
1694         _dbus_verbose ("Failed to getpeereid() credentials: %s\n", _dbus_strerror (errno));
1695       }
1696 #elif defined(HAVE_GETPEERUCRED)
1697     ucred_t * ucred = NULL;
1698     if (getpeerucred (client_fd, &ucred) == 0)
1699       {
1700         pid_read = ucred_getpid (ucred);
1701         uid_read = ucred_geteuid (ucred);
1702 #ifdef HAVE_ADT
1703         /* generate audit session data based on socket ucred */
1704         adt_session_data_t *adth = NULL;
1705         adt_export_data_t *data = NULL;
1706         size_t size = 0;
1707         if (adt_start_session (&adth, NULL, 0) || (adth == NULL))
1708           {
1709             _dbus_verbose ("Failed to adt_start_session(): %s\n", _dbus_strerror (errno));
1710           }
1711         else
1712           {
1713             if (adt_set_from_ucred (adth, ucred, ADT_NEW))
1714               {
1715                 _dbus_verbose ("Failed to adt_set_from_ucred(): %s\n", _dbus_strerror (errno));
1716               }
1717             else
1718               {
1719                 size = adt_export_session_data (adth, &data);
1720                 if (size <= 0)
1721                   {
1722                     _dbus_verbose ("Failed to adt_export_session_data(): %s\n", _dbus_strerror (errno));
1723                   }
1724                 else
1725                   {
1726                     _dbus_credentials_add_adt_audit_data (credentials, data, size);
1727                     free (data);
1728                   }
1729               }
1730             (void) adt_end_session (adth);
1731           }
1732 #endif /* HAVE_ADT */
1733       }
1734     else
1735       {
1736         _dbus_verbose ("Failed to getpeerucred() credentials: %s\n", _dbus_strerror (errno));
1737       }
1738     if (ucred != NULL)
1739       ucred_free (ucred);
1740 #else /* !SO_PEERCRED && !HAVE_CMSGCRED && !HAVE_GETPEEREID && !HAVE_GETPEERUCRED */
1741     _dbus_verbose ("Socket credentials not supported on this OS\n");
1742 #endif
1743   }
1744
1745   _dbus_verbose ("Credentials:"
1746                  "  pid "DBUS_PID_FORMAT
1747                  "  uid "DBUS_UID_FORMAT
1748                  "\n",
1749                  pid_read,
1750                  uid_read);
1751
1752   if (pid_read != DBUS_PID_UNSET)
1753     {
1754       if (!_dbus_credentials_add_unix_pid (credentials, pid_read))
1755         {
1756           _DBUS_SET_OOM (error);
1757           return FALSE;
1758         }
1759     }
1760
1761   if (uid_read != DBUS_UID_UNSET)
1762     {
1763       if (!_dbus_credentials_add_unix_uid (credentials, uid_read))
1764         {
1765           _DBUS_SET_OOM (error);
1766           return FALSE;
1767         }
1768     }
1769
1770   return TRUE;
1771 }
1772
1773 /**
1774  * Sends a single nul byte with our UNIX credentials as ancillary
1775  * data.  Returns #TRUE if the data was successfully written.  On
1776  * systems that don't support sending credentials, just writes a byte,
1777  * doesn't send any credentials.  On some systems, such as Linux,
1778  * reading/writing the byte isn't actually required, but we do it
1779  * anyway just to avoid multiple codepaths.
1780  *
1781  * Fails if no byte can be written, so you must select() first.
1782  *
1783  * The point of the byte is that on some systems we have to
1784  * use sendmsg()/recvmsg() to transmit credentials.
1785  *
1786  * @param server_fd file descriptor for connection to server
1787  * @param error return location for error code
1788  * @returns #TRUE if the byte was sent
1789  */
1790 dbus_bool_t
1791 _dbus_send_credentials_socket  (int              server_fd,
1792                                 DBusError       *error)
1793 {
1794   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1795
1796   if (write_credentials_byte (server_fd, error))
1797     return TRUE;
1798   else
1799     return FALSE;
1800 }
1801
1802 /**
1803  * Accepts a connection on a listening socket.
1804  * Handles EINTR for you.
1805  *
1806  * This will enable FD_CLOEXEC for the returned socket.
1807  *
1808  * @param listen_fd the listen file descriptor
1809  * @returns the connection fd of the client, or -1 on error
1810  */
1811 int
1812 _dbus_accept  (int listen_fd)
1813 {
1814   int client_fd;
1815   struct sockaddr addr;
1816   socklen_t addrlen;
1817 #ifdef HAVE_ACCEPT4
1818   dbus_bool_t cloexec_done;
1819 #endif
1820
1821   addrlen = sizeof (addr);
1822
1823  retry:
1824
1825 #ifdef HAVE_ACCEPT4
1826   /* We assume that if accept4 is available SOCK_CLOEXEC is too */
1827   client_fd = accept4 (listen_fd, &addr, &addrlen, SOCK_CLOEXEC);
1828   cloexec_done = client_fd >= 0;
1829
1830   if (client_fd < 0 && errno == ENOSYS)
1831 #endif
1832     {
1833       client_fd = accept (listen_fd, &addr, &addrlen);
1834     }
1835
1836   if (client_fd < 0)
1837     {
1838       if (errno == EINTR)
1839         goto retry;
1840     }
1841
1842   _dbus_verbose ("client fd %d accepted\n", client_fd);
1843
1844 #ifdef HAVE_ACCEPT4
1845   if (!cloexec_done)
1846 #endif
1847     {
1848       _dbus_fd_set_close_on_exec(client_fd);
1849     }
1850
1851   return client_fd;
1852 }
1853
1854 /**
1855  * Checks to make sure the given directory is
1856  * private to the user
1857  *
1858  * @param dir the name of the directory
1859  * @param error error return
1860  * @returns #FALSE on failure
1861  **/
1862 dbus_bool_t
1863 _dbus_check_dir_is_private_to_user (DBusString *dir, DBusError *error)
1864 {
1865   const char *directory;
1866   struct stat sb;
1867
1868   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1869
1870   directory = _dbus_string_get_const_data (dir);
1871
1872   if (stat (directory, &sb) < 0)
1873     {
1874       dbus_set_error (error, _dbus_error_from_errno (errno),
1875                       "%s", _dbus_strerror (errno));
1876
1877       return FALSE;
1878     }
1879
1880   if ((S_IROTH & sb.st_mode) || (S_IWOTH & sb.st_mode) ||
1881       (S_IRGRP & sb.st_mode) || (S_IWGRP & sb.st_mode))
1882     {
1883       dbus_set_error (error, DBUS_ERROR_FAILED,
1884                      "%s directory is not private to the user", directory);
1885       return FALSE;
1886     }
1887
1888   return TRUE;
1889 }
1890
1891 static dbus_bool_t
1892 fill_user_info_from_passwd (struct passwd *p,
1893                             DBusUserInfo  *info,
1894                             DBusError     *error)
1895 {
1896   _dbus_assert (p->pw_name != NULL);
1897   _dbus_assert (p->pw_dir != NULL);
1898
1899   info->uid = p->pw_uid;
1900   info->primary_gid = p->pw_gid;
1901   info->username = _dbus_strdup (p->pw_name);
1902   info->homedir = _dbus_strdup (p->pw_dir);
1903
1904   if (info->username == NULL ||
1905       info->homedir == NULL)
1906     {
1907       dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1908       return FALSE;
1909     }
1910
1911   return TRUE;
1912 }
1913
1914 static dbus_bool_t
1915 fill_user_info (DBusUserInfo       *info,
1916                 dbus_uid_t          uid,
1917                 const DBusString   *username,
1918                 DBusError          *error)
1919 {
1920   const char *username_c;
1921
1922   /* exactly one of username/uid provided */
1923   _dbus_assert (username != NULL || uid != DBUS_UID_UNSET);
1924   _dbus_assert (username == NULL || uid == DBUS_UID_UNSET);
1925
1926   info->uid = DBUS_UID_UNSET;
1927   info->primary_gid = DBUS_GID_UNSET;
1928   info->group_ids = NULL;
1929   info->n_group_ids = 0;
1930   info->username = NULL;
1931   info->homedir = NULL;
1932
1933   if (username != NULL)
1934     username_c = _dbus_string_get_const_data (username);
1935   else
1936     username_c = NULL;
1937
1938   /* For now assuming that the getpwnam() and getpwuid() flavors
1939    * are always symmetrical, if not we have to add more configure
1940    * checks
1941    */
1942
1943 #if defined (HAVE_POSIX_GETPWNAM_R) || defined (HAVE_NONPOSIX_GETPWNAM_R)
1944   {
1945     struct passwd *p;
1946     int result;
1947     size_t buflen;
1948     char *buf;
1949     struct passwd p_str;
1950
1951     /* retrieve maximum needed size for buf */
1952     buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
1953
1954     /* sysconf actually returns a long, but everything else expects size_t,
1955      * so just recast here.
1956      * https://bugs.freedesktop.org/show_bug.cgi?id=17061
1957      */
1958     if ((long) buflen <= 0)
1959       buflen = 1024;
1960
1961     result = -1;
1962     while (1)
1963       {
1964         buf = dbus_malloc (buflen);
1965         if (buf == NULL)
1966           {
1967             dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1968             return FALSE;
1969           }
1970
1971         p = NULL;
1972 #ifdef HAVE_POSIX_GETPWNAM_R
1973         if (uid != DBUS_UID_UNSET)
1974           result = getpwuid_r (uid, &p_str, buf, buflen,
1975                                &p);
1976         else
1977           result = getpwnam_r (username_c, &p_str, buf, buflen,
1978                                &p);
1979 #else
1980         if (uid != DBUS_UID_UNSET)
1981           p = getpwuid_r (uid, &p_str, buf, buflen);
1982         else
1983           p = getpwnam_r (username_c, &p_str, buf, buflen);
1984         result = 0;
1985 #endif /* !HAVE_POSIX_GETPWNAM_R */
1986         //Try a bigger buffer if ERANGE was returned
1987         if (result == ERANGE && buflen < 512 * 1024)
1988           {
1989             dbus_free (buf);
1990             buflen *= 2;
1991           }
1992         else
1993           {
1994             break;
1995           }
1996       }
1997     if (result == 0 && p == &p_str)
1998       {
1999         if (!fill_user_info_from_passwd (p, info, error))
2000           {
2001             dbus_free (buf);
2002             return FALSE;
2003           }
2004         dbus_free (buf);
2005       }
2006     else
2007       {
2008         dbus_set_error (error, _dbus_error_from_errno (errno),
2009                         "User \"%s\" unknown or no memory to allocate password entry\n",
2010                         username_c ? username_c : "???");
2011         _dbus_verbose ("User %s unknown\n", username_c ? username_c : "???");
2012         dbus_free (buf);
2013         return FALSE;
2014       }
2015   }
2016 #else /* ! HAVE_GETPWNAM_R */
2017   {
2018     /* I guess we're screwed on thread safety here */
2019     struct passwd *p;
2020
2021     if (uid != DBUS_UID_UNSET)
2022       p = getpwuid (uid);
2023     else
2024       p = getpwnam (username_c);
2025
2026     if (p != NULL)
2027       {
2028         if (!fill_user_info_from_passwd (p, info, error))
2029           {
2030             return FALSE;
2031           }
2032       }
2033     else
2034       {
2035         dbus_set_error (error, _dbus_error_from_errno (errno),
2036                         "User \"%s\" unknown or no memory to allocate password entry\n",
2037                         username_c ? username_c : "???");
2038         _dbus_verbose ("User %s unknown\n", username_c ? username_c : "???");
2039         return FALSE;
2040       }
2041   }
2042 #endif  /* ! HAVE_GETPWNAM_R */
2043
2044   /* Fill this in so we can use it to get groups */
2045   username_c = info->username;
2046
2047 #ifdef HAVE_GETGROUPLIST
2048   {
2049     gid_t *buf;
2050     int buf_count;
2051     int i;
2052     int initial_buf_count;
2053
2054     initial_buf_count = 17;
2055     buf_count = initial_buf_count;
2056     buf = dbus_new (gid_t, buf_count);
2057     if (buf == NULL)
2058       {
2059         dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
2060         goto failed;
2061       }
2062
2063     if (getgrouplist (username_c,
2064                       info->primary_gid,
2065                       buf, &buf_count) < 0)
2066       {
2067         gid_t *new;
2068         /* Presumed cause of negative return code: buf has insufficient
2069            entries to hold the entire group list. The Linux behavior in this
2070            case is to pass back the actual number of groups in buf_count, but
2071            on Mac OS X 10.5, buf_count is unhelpfully left alone.
2072            So as a hack, try to help out a bit by guessing a larger
2073            number of groups, within reason.. might still fail, of course,
2074            but we can at least print a more informative message.  I looked up
2075            the "right way" to do this by downloading Apple's own source code
2076            for the "id" command, and it turns out that they use an
2077            undocumented library function getgrouplist_2 (!) which is not
2078            declared in any header in /usr/include (!!). That did not seem
2079            like the way to go here.
2080         */
2081         if (buf_count == initial_buf_count)
2082           {
2083             buf_count *= 16; /* Retry with an arbitrarily scaled-up array */
2084           }
2085         new = dbus_realloc (buf, buf_count * sizeof (buf[0]));
2086         if (new == NULL)
2087           {
2088             dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
2089             dbus_free (buf);
2090             goto failed;
2091           }
2092
2093         buf = new;
2094
2095         errno = 0;
2096         if (getgrouplist (username_c, info->primary_gid, buf, &buf_count) < 0)
2097           {
2098             if (errno == 0)
2099               {
2100                 _dbus_warn ("It appears that username \"%s\" is in more than %d groups.\nProceeding with just the first %d groups.",
2101                             username_c, buf_count, buf_count);
2102               }
2103             else
2104               {
2105                 dbus_set_error (error,
2106                                 _dbus_error_from_errno (errno),
2107                                 "Failed to get groups for username \"%s\" primary GID "
2108                                 DBUS_GID_FORMAT ": %s\n",
2109                                 username_c, info->primary_gid,
2110                                 _dbus_strerror (errno));
2111                 dbus_free (buf);
2112                 goto failed;
2113               }
2114           }
2115       }
2116
2117     info->group_ids = dbus_new (dbus_gid_t, buf_count);
2118     if (info->group_ids == NULL)
2119       {
2120         dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
2121         dbus_free (buf);
2122         goto failed;
2123       }
2124
2125     for (i = 0; i < buf_count; ++i)
2126       info->group_ids[i] = buf[i];
2127
2128     info->n_group_ids = buf_count;
2129
2130     dbus_free (buf);
2131   }
2132 #else  /* HAVE_GETGROUPLIST */
2133   {
2134     /* We just get the one group ID */
2135     info->group_ids = dbus_new (dbus_gid_t, 1);
2136     if (info->group_ids == NULL)
2137       {
2138         dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
2139         goto failed;
2140       }
2141
2142     info->n_group_ids = 1;
2143
2144     (info->group_ids)[0] = info->primary_gid;
2145   }
2146 #endif /* HAVE_GETGROUPLIST */
2147
2148   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2149
2150   return TRUE;
2151
2152  failed:
2153   _DBUS_ASSERT_ERROR_IS_SET (error);
2154   return FALSE;
2155 }
2156
2157 /**
2158  * Gets user info for the given username.
2159  *
2160  * @param info user info object to initialize
2161  * @param username the username
2162  * @param error error return
2163  * @returns #TRUE on success
2164  */
2165 dbus_bool_t
2166 _dbus_user_info_fill (DBusUserInfo     *info,
2167                       const DBusString *username,
2168                       DBusError        *error)
2169 {
2170   return fill_user_info (info, DBUS_UID_UNSET,
2171                          username, error);
2172 }
2173
2174 /**
2175  * Gets user info for the given user ID.
2176  *
2177  * @param info user info object to initialize
2178  * @param uid the user ID
2179  * @param error error return
2180  * @returns #TRUE on success
2181  */
2182 dbus_bool_t
2183 _dbus_user_info_fill_uid (DBusUserInfo *info,
2184                           dbus_uid_t    uid,
2185                           DBusError    *error)
2186 {
2187   return fill_user_info (info, uid,
2188                          NULL, error);
2189 }
2190
2191 /**
2192  * Adds the credentials of the current process to the
2193  * passed-in credentials object.
2194  *
2195  * @param credentials credentials to add to
2196  * @returns #FALSE if no memory; does not properly roll back on failure, so only some credentials may have been added
2197  */
2198 dbus_bool_t
2199 _dbus_credentials_add_from_current_process (DBusCredentials *credentials)
2200 {
2201   /* The POSIX spec certainly doesn't promise this, but
2202    * we need these assertions to fail as soon as we're wrong about
2203    * it so we can do the porting fixups
2204    */
2205   _dbus_assert (sizeof (pid_t) <= sizeof (dbus_pid_t));
2206   _dbus_assert (sizeof (uid_t) <= sizeof (dbus_uid_t));
2207   _dbus_assert (sizeof (gid_t) <= sizeof (dbus_gid_t));
2208
2209   if (!_dbus_credentials_add_unix_pid(credentials, _dbus_getpid()))
2210     return FALSE;
2211   if (!_dbus_credentials_add_unix_uid(credentials, _dbus_geteuid()))
2212     return FALSE;
2213
2214   return TRUE;
2215 }
2216
2217 /**
2218  * Append to the string the identity we would like to have when we
2219  * authenticate, on UNIX this is the current process UID and on
2220  * Windows something else, probably a Windows SID string.  No escaping
2221  * is required, that is done in dbus-auth.c. The username here
2222  * need not be anything human-readable, it can be the machine-readable
2223  * form i.e. a user id.
2224  *
2225  * @param str the string to append to
2226  * @returns #FALSE on no memory
2227  */
2228 dbus_bool_t
2229 _dbus_append_user_from_current_process (DBusString *str)
2230 {
2231   return _dbus_string_append_uint (str,
2232                                    _dbus_geteuid ());
2233 }
2234
2235 /**
2236  * Gets our process ID
2237  * @returns process ID
2238  */
2239 dbus_pid_t
2240 _dbus_getpid (void)
2241 {
2242   return getpid ();
2243 }
2244
2245 /** Gets our UID
2246  * @returns process UID
2247  */
2248 dbus_uid_t
2249 _dbus_getuid (void)
2250 {
2251   return getuid ();
2252 }
2253
2254 /** Gets our effective UID
2255  * @returns process effective UID
2256  */
2257 dbus_uid_t
2258 _dbus_geteuid (void)
2259 {
2260   return geteuid ();
2261 }
2262
2263 /**
2264  * The only reason this is separate from _dbus_getpid() is to allow it
2265  * on Windows for logging but not for other purposes.
2266  *
2267  * @returns process ID to put in log messages
2268  */
2269 unsigned long
2270 _dbus_pid_for_log (void)
2271 {
2272   return getpid ();
2273 }
2274
2275 /**
2276  * Gets a UID from a UID string.
2277  *
2278  * @param uid_str the UID in string form
2279  * @param uid UID to fill in
2280  * @returns #TRUE if successfully filled in UID
2281  */
2282 dbus_bool_t
2283 _dbus_parse_uid (const DBusString      *uid_str,
2284                  dbus_uid_t            *uid)
2285 {
2286   int end;
2287   long val;
2288
2289   if (_dbus_string_get_length (uid_str) == 0)
2290     {
2291       _dbus_verbose ("UID string was zero length\n");
2292       return FALSE;
2293     }
2294
2295   val = -1;
2296   end = 0;
2297   if (!_dbus_string_parse_int (uid_str, 0, &val,
2298                                &end))
2299     {
2300       _dbus_verbose ("could not parse string as a UID\n");
2301       return FALSE;
2302     }
2303
2304   if (end != _dbus_string_get_length (uid_str))
2305     {
2306       _dbus_verbose ("string contained trailing stuff after UID\n");
2307       return FALSE;
2308     }
2309
2310   *uid = val;
2311
2312   return TRUE;
2313 }
2314
2315 #if !DBUS_USE_SYNC
2316 _DBUS_DEFINE_GLOBAL_LOCK (atomic);
2317 #endif
2318
2319 /**
2320  * Atomically increments an integer
2321  *
2322  * @param atomic pointer to the integer to increment
2323  * @returns the value before incrementing
2324  */
2325 dbus_int32_t
2326 _dbus_atomic_inc (DBusAtomic *atomic)
2327 {
2328 #if DBUS_USE_SYNC
2329   return __sync_add_and_fetch(&atomic->value, 1)-1;
2330 #else
2331   dbus_int32_t res;
2332   _DBUS_LOCK (atomic);
2333   res = atomic->value;
2334   atomic->value += 1;
2335   _DBUS_UNLOCK (atomic);
2336   return res;
2337 #endif
2338 }
2339
2340 /**
2341  * Atomically decrement an integer
2342  *
2343  * @param atomic pointer to the integer to decrement
2344  * @returns the value before decrementing
2345  */
2346 dbus_int32_t
2347 _dbus_atomic_dec (DBusAtomic *atomic)
2348 {
2349 #if DBUS_USE_SYNC
2350   return __sync_sub_and_fetch(&atomic->value, 1)+1;
2351 #else
2352   dbus_int32_t res;
2353
2354   _DBUS_LOCK (atomic);
2355   res = atomic->value;
2356   atomic->value -= 1;
2357   _DBUS_UNLOCK (atomic);
2358   return res;
2359 #endif
2360 }
2361
2362 #ifdef DBUS_BUILD_TESTS
2363 /** Gets our GID
2364  * @returns process GID
2365  */
2366 dbus_gid_t
2367 _dbus_getgid (void)
2368 {
2369   return getgid ();
2370 }
2371 #endif
2372
2373 /**
2374  * Wrapper for poll().
2375  *
2376  * @param fds the file descriptors to poll
2377  * @param n_fds number of descriptors in the array
2378  * @param timeout_milliseconds timeout or -1 for infinite
2379  * @returns numbers of fds with revents, or <0 on error
2380  */
2381 int
2382 _dbus_poll (DBusPollFD *fds,
2383             int         n_fds,
2384             int         timeout_milliseconds)
2385 {
2386 #if defined(HAVE_POLL) && !defined(BROKEN_POLL)
2387   /* This big thing is a constant expression and should get optimized
2388    * out of existence. So it's more robust than a configure check at
2389    * no cost.
2390    */
2391   if (_DBUS_POLLIN == POLLIN &&
2392       _DBUS_POLLPRI == POLLPRI &&
2393       _DBUS_POLLOUT == POLLOUT &&
2394       _DBUS_POLLERR == POLLERR &&
2395       _DBUS_POLLHUP == POLLHUP &&
2396       _DBUS_POLLNVAL == POLLNVAL &&
2397       sizeof (DBusPollFD) == sizeof (struct pollfd) &&
2398       _DBUS_STRUCT_OFFSET (DBusPollFD, fd) ==
2399       _DBUS_STRUCT_OFFSET (struct pollfd, fd) &&
2400       _DBUS_STRUCT_OFFSET (DBusPollFD, events) ==
2401       _DBUS_STRUCT_OFFSET (struct pollfd, events) &&
2402       _DBUS_STRUCT_OFFSET (DBusPollFD, revents) ==
2403       _DBUS_STRUCT_OFFSET (struct pollfd, revents))
2404     {
2405       return poll ((struct pollfd*) fds,
2406                    n_fds,
2407                    timeout_milliseconds);
2408     }
2409   else
2410     {
2411       /* We have to convert the DBusPollFD to an array of
2412        * struct pollfd, poll, and convert back.
2413        */
2414       _dbus_warn ("didn't implement poll() properly for this system yet\n");
2415       return -1;
2416     }
2417 #else /* ! HAVE_POLL */
2418
2419   fd_set read_set, write_set, err_set;
2420   int max_fd = 0;
2421   int i;
2422   struct timeval tv;
2423   int ready;
2424
2425   FD_ZERO (&read_set);
2426   FD_ZERO (&write_set);
2427   FD_ZERO (&err_set);
2428
2429   for (i = 0; i < n_fds; i++)
2430     {
2431       DBusPollFD *fdp = &fds[i];
2432
2433       if (fdp->events & _DBUS_POLLIN)
2434         FD_SET (fdp->fd, &read_set);
2435
2436       if (fdp->events & _DBUS_POLLOUT)
2437         FD_SET (fdp->fd, &write_set);
2438
2439       FD_SET (fdp->fd, &err_set);
2440
2441       max_fd = MAX (max_fd, fdp->fd);
2442     }
2443
2444   tv.tv_sec = timeout_milliseconds / 1000;
2445   tv.tv_usec = (timeout_milliseconds % 1000) * 1000;
2446
2447   ready = select (max_fd + 1, &read_set, &write_set, &err_set,
2448                   timeout_milliseconds < 0 ? NULL : &tv);
2449
2450   if (ready > 0)
2451     {
2452       for (i = 0; i < n_fds; i++)
2453         {
2454           DBusPollFD *fdp = &fds[i];
2455
2456           fdp->revents = 0;
2457
2458           if (FD_ISSET (fdp->fd, &read_set))
2459             fdp->revents |= _DBUS_POLLIN;
2460
2461           if (FD_ISSET (fdp->fd, &write_set))
2462             fdp->revents |= _DBUS_POLLOUT;
2463
2464           if (FD_ISSET (fdp->fd, &err_set))
2465             fdp->revents |= _DBUS_POLLERR;
2466         }
2467     }
2468
2469   return ready;
2470 #endif
2471 }
2472
2473 /**
2474  * Get current time, as in gettimeofday(). Use the monotonic clock if
2475  * available, to avoid problems when the system time changes.
2476  *
2477  * @param tv_sec return location for number of seconds
2478  * @param tv_usec return location for number of microseconds (thousandths)
2479  */
2480 void
2481 _dbus_get_current_time (long *tv_sec,
2482                         long *tv_usec)
2483 {
2484   struct timeval t;
2485
2486 #ifdef HAVE_MONOTONIC_CLOCK
2487   struct timespec ts;
2488   clock_gettime (CLOCK_MONOTONIC, &ts);
2489
2490   if (tv_sec)
2491     *tv_sec = ts.tv_sec;
2492   if (tv_usec)
2493     *tv_usec = ts.tv_nsec / 1000;
2494 #else
2495   gettimeofday (&t, NULL);
2496
2497   if (tv_sec)
2498     *tv_sec = t.tv_sec;
2499   if (tv_usec)
2500     *tv_usec = t.tv_usec;
2501 #endif
2502 }
2503
2504 /**
2505  * Creates a directory; succeeds if the directory
2506  * is created or already existed.
2507  *
2508  * @param filename directory filename
2509  * @param error initialized error object
2510  * @returns #TRUE on success
2511  */
2512 dbus_bool_t
2513 _dbus_create_directory (const DBusString *filename,
2514                         DBusError        *error)
2515 {
2516   const char *filename_c;
2517
2518   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2519
2520   filename_c = _dbus_string_get_const_data (filename);
2521
2522   if (mkdir (filename_c, 0700) < 0)
2523     {
2524       if (errno == EEXIST)
2525         return TRUE;
2526
2527       dbus_set_error (error, DBUS_ERROR_FAILED,
2528                       "Failed to create directory %s: %s\n",
2529                       filename_c, _dbus_strerror (errno));
2530       return FALSE;
2531     }
2532   else
2533     return TRUE;
2534 }
2535
2536 /**
2537  * Appends the given filename to the given directory.
2538  *
2539  * @todo it might be cute to collapse multiple '/' such as "foo//"
2540  * concat "//bar"
2541  *
2542  * @param dir the directory name
2543  * @param next_component the filename
2544  * @returns #TRUE on success
2545  */
2546 dbus_bool_t
2547 _dbus_concat_dir_and_file (DBusString       *dir,
2548                            const DBusString *next_component)
2549 {
2550   dbus_bool_t dir_ends_in_slash;
2551   dbus_bool_t file_starts_with_slash;
2552
2553   if (_dbus_string_get_length (dir) == 0 ||
2554       _dbus_string_get_length (next_component) == 0)
2555     return TRUE;
2556
2557   dir_ends_in_slash = '/' == _dbus_string_get_byte (dir,
2558                                                     _dbus_string_get_length (dir) - 1);
2559
2560   file_starts_with_slash = '/' == _dbus_string_get_byte (next_component, 0);
2561
2562   if (dir_ends_in_slash && file_starts_with_slash)
2563     {
2564       _dbus_string_shorten (dir, 1);
2565     }
2566   else if (!(dir_ends_in_slash || file_starts_with_slash))
2567     {
2568       if (!_dbus_string_append_byte (dir, '/'))
2569         return FALSE;
2570     }
2571
2572   return _dbus_string_copy (next_component, 0, dir,
2573                             _dbus_string_get_length (dir));
2574 }
2575
2576 /** nanoseconds in a second */
2577 #define NANOSECONDS_PER_SECOND       1000000000
2578 /** microseconds in a second */
2579 #define MICROSECONDS_PER_SECOND      1000000
2580 /** milliseconds in a second */
2581 #define MILLISECONDS_PER_SECOND      1000
2582 /** nanoseconds in a millisecond */
2583 #define NANOSECONDS_PER_MILLISECOND  1000000
2584 /** microseconds in a millisecond */
2585 #define MICROSECONDS_PER_MILLISECOND 1000
2586
2587 /**
2588  * Sleeps the given number of milliseconds.
2589  * @param milliseconds number of milliseconds
2590  */
2591 void
2592 _dbus_sleep_milliseconds (int milliseconds)
2593 {
2594 #ifdef HAVE_NANOSLEEP
2595   struct timespec req;
2596   struct timespec rem;
2597
2598   req.tv_sec = milliseconds / MILLISECONDS_PER_SECOND;
2599   req.tv_nsec = (milliseconds % MILLISECONDS_PER_SECOND) * NANOSECONDS_PER_MILLISECOND;
2600   rem.tv_sec = 0;
2601   rem.tv_nsec = 0;
2602
2603   while (nanosleep (&req, &rem) < 0 && errno == EINTR)
2604     req = rem;
2605 #elif defined (HAVE_USLEEP)
2606   usleep (milliseconds * MICROSECONDS_PER_MILLISECOND);
2607 #else /* ! HAVE_USLEEP */
2608   sleep (MAX (milliseconds / 1000, 1));
2609 #endif
2610 }
2611
2612 static dbus_bool_t
2613 _dbus_generate_pseudorandom_bytes (DBusString *str,
2614                                    int         n_bytes)
2615 {
2616   int old_len;
2617   char *p;
2618
2619   old_len = _dbus_string_get_length (str);
2620
2621   if (!_dbus_string_lengthen (str, n_bytes))
2622     return FALSE;
2623
2624   p = _dbus_string_get_data_len (str, old_len, n_bytes);
2625
2626   _dbus_generate_pseudorandom_bytes_buffer (p, n_bytes);
2627
2628   return TRUE;
2629 }
2630
2631 /**
2632  * Generates the given number of random bytes,
2633  * using the best mechanism we can come up with.
2634  *
2635  * @param str the string
2636  * @param n_bytes the number of random bytes to append to string
2637  * @returns #TRUE on success, #FALSE if no memory
2638  */
2639 dbus_bool_t
2640 _dbus_generate_random_bytes (DBusString *str,
2641                              int         n_bytes)
2642 {
2643   int old_len;
2644   int fd;
2645
2646   /* FALSE return means "no memory", if it could
2647    * mean something else then we'd need to return
2648    * a DBusError. So we always fall back to pseudorandom
2649    * if the I/O fails.
2650    */
2651
2652   old_len = _dbus_string_get_length (str);
2653   fd = -1;
2654
2655   /* note, urandom on linux will fall back to pseudorandom */
2656   fd = open ("/dev/urandom", O_RDONLY);
2657   if (fd < 0)
2658     return _dbus_generate_pseudorandom_bytes (str, n_bytes);
2659
2660   _dbus_verbose ("/dev/urandom fd %d opened\n", fd);
2661
2662   if (_dbus_read (fd, str, n_bytes) != n_bytes)
2663     {
2664       _dbus_close (fd, NULL);
2665       _dbus_string_set_length (str, old_len);
2666       return _dbus_generate_pseudorandom_bytes (str, n_bytes);
2667     }
2668
2669   _dbus_verbose ("Read %d bytes from /dev/urandom\n",
2670                  n_bytes);
2671
2672   _dbus_close (fd, NULL);
2673
2674   return TRUE;
2675 }
2676
2677 /**
2678  * Exit the process, returning the given value.
2679  *
2680  * @param code the exit code
2681  */
2682 void
2683 _dbus_exit (int code)
2684 {
2685   _exit (code);
2686 }
2687
2688 /**
2689  * A wrapper around strerror() because some platforms
2690  * may be lame and not have strerror(). Also, never
2691  * returns NULL.
2692  *
2693  * @param error_number errno.
2694  * @returns error description.
2695  */
2696 const char*
2697 _dbus_strerror (int error_number)
2698 {
2699   const char *msg;
2700
2701   msg = strerror (error_number);
2702   if (msg == NULL)
2703     msg = "unknown";
2704
2705   return msg;
2706 }
2707
2708 /**
2709  * signal (SIGPIPE, SIG_IGN);
2710  */
2711 void
2712 _dbus_disable_sigpipe (void)
2713 {
2714   signal (SIGPIPE, SIG_IGN);
2715 }
2716
2717 /**
2718  * Sets the file descriptor to be close
2719  * on exec. Should be called for all file
2720  * descriptors in D-Bus code.
2721  *
2722  * @param fd the file descriptor
2723  */
2724 void
2725 _dbus_fd_set_close_on_exec (intptr_t fd)
2726 {
2727   int val;
2728
2729   val = fcntl (fd, F_GETFD, 0);
2730
2731   if (val < 0)
2732     return;
2733
2734   val |= FD_CLOEXEC;
2735
2736   fcntl (fd, F_SETFD, val);
2737 }
2738
2739 /**
2740  * Closes a file descriptor.
2741  *
2742  * @param fd the file descriptor
2743  * @param error error object
2744  * @returns #FALSE if error set
2745  */
2746 dbus_bool_t
2747 _dbus_close (int        fd,
2748              DBusError *error)
2749 {
2750   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2751
2752  again:
2753   if (close (fd) < 0)
2754     {
2755       if (errno == EINTR)
2756         goto again;
2757
2758       dbus_set_error (error, _dbus_error_from_errno (errno),
2759                       "Could not close fd %d", fd);
2760       return FALSE;
2761     }
2762
2763   return TRUE;
2764 }
2765
2766 /**
2767  * Duplicates a file descriptor. Makes sure the fd returned is >= 3
2768  * (i.e. avoids stdin/stdout/stderr). Sets O_CLOEXEC.
2769  *
2770  * @param fd the file descriptor to duplicate
2771  * @returns duplicated file descriptor
2772  * */
2773 int
2774 _dbus_dup(int        fd,
2775           DBusError *error)
2776 {
2777   int new_fd;
2778
2779 #ifdef F_DUPFD_CLOEXEC
2780   dbus_bool_t cloexec_done;
2781
2782   new_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
2783   cloexec_done = new_fd >= 0;
2784
2785   if (new_fd < 0 && errno == EINVAL)
2786 #endif
2787     {
2788       new_fd = fcntl(fd, F_DUPFD, 3);
2789     }
2790
2791   if (new_fd < 0) {
2792
2793     dbus_set_error (error, _dbus_error_from_errno (errno),
2794                     "Could not duplicate fd %d", fd);
2795     return -1;
2796   }
2797
2798 #ifdef F_DUPFD_CLOEXEC
2799   if (!cloexec_done)
2800 #endif
2801     {
2802       _dbus_fd_set_close_on_exec(new_fd);
2803     }
2804
2805   return new_fd;
2806 }
2807
2808 /**
2809  * Sets a file descriptor to be nonblocking.
2810  *
2811  * @param fd the file descriptor.
2812  * @param error address of error location.
2813  * @returns #TRUE on success.
2814  */
2815 dbus_bool_t
2816 _dbus_set_fd_nonblocking (int             fd,
2817                           DBusError      *error)
2818 {
2819   int val;
2820
2821   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2822
2823   val = fcntl (fd, F_GETFL, 0);
2824   if (val < 0)
2825     {
2826       dbus_set_error (error, _dbus_error_from_errno (errno),
2827                       "Failed to get flags from file descriptor %d: %s",
2828                       fd, _dbus_strerror (errno));
2829       _dbus_verbose ("Failed to get flags for fd %d: %s\n", fd,
2830                      _dbus_strerror (errno));
2831       return FALSE;
2832     }
2833
2834   if (fcntl (fd, F_SETFL, val | O_NONBLOCK) < 0)
2835     {
2836       dbus_set_error (error, _dbus_error_from_errno (errno),
2837                       "Failed to set nonblocking flag of file descriptor %d: %s",
2838                       fd, _dbus_strerror (errno));
2839       _dbus_verbose ("Failed to set fd %d nonblocking: %s\n",
2840                      fd, _dbus_strerror (errno));
2841
2842       return FALSE;
2843     }
2844
2845   return TRUE;
2846 }
2847
2848 /**
2849  * On GNU libc systems, print a crude backtrace to stderr.  On other
2850  * systems, print "no backtrace support" and block for possible gdb
2851  * attachment if an appropriate environment variable is set.
2852  */
2853 void
2854 _dbus_print_backtrace (void)
2855 {
2856 #if defined (HAVE_BACKTRACE) && defined (DBUS_BUILT_R_DYNAMIC)
2857   void *bt[500];
2858   int bt_size;
2859   int i;
2860   char **syms;
2861
2862   bt_size = backtrace (bt, 500);
2863
2864   syms = backtrace_symbols (bt, bt_size);
2865
2866   i = 0;
2867   while (i < bt_size)
2868     {
2869       /* don't use dbus_warn since it can _dbus_abort() */
2870       fprintf (stderr, "  %s\n", syms[i]);
2871       ++i;
2872     }
2873   fflush (stderr);
2874
2875   free (syms);
2876 #elif defined (HAVE_BACKTRACE) && ! defined (DBUS_BUILT_R_DYNAMIC)
2877   fprintf (stderr, "  D-Bus not built with -rdynamic so unable to print a backtrace\n");
2878 #else
2879   fprintf (stderr, "  D-Bus not compiled with backtrace support so unable to print a backtrace\n");
2880 #endif
2881 }
2882
2883 /**
2884  * Creates a full-duplex pipe (as in socketpair()).
2885  * Sets both ends of the pipe nonblocking.
2886  *
2887  * Marks both file descriptors as close-on-exec
2888  *
2889  * @todo libdbus only uses this for the debug-pipe server, so in
2890  * principle it could be in dbus-sysdeps-util.c, except that
2891  * dbus-sysdeps-util.c isn't in libdbus when tests are enabled and the
2892  * debug-pipe server is used.
2893  *
2894  * @param fd1 return location for one end
2895  * @param fd2 return location for the other end
2896  * @param blocking #TRUE if pipe should be blocking
2897  * @param error error return
2898  * @returns #FALSE on failure (if error is set)
2899  */
2900 dbus_bool_t
2901 _dbus_full_duplex_pipe (int        *fd1,
2902                         int        *fd2,
2903                         dbus_bool_t blocking,
2904                         DBusError  *error)
2905 {
2906 #ifdef HAVE_SOCKETPAIR
2907   int fds[2];
2908   int retval;
2909
2910 #ifdef SOCK_CLOEXEC
2911   dbus_bool_t cloexec_done;
2912
2913   retval = socketpair(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0, fds);
2914   cloexec_done = retval >= 0;
2915
2916   if (retval < 0 && errno == EINVAL)
2917 #endif
2918     {
2919       retval = socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
2920     }
2921
2922   if (retval < 0)
2923     {
2924       dbus_set_error (error, _dbus_error_from_errno (errno),
2925                       "Could not create full-duplex pipe");
2926       return FALSE;
2927     }
2928
2929   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2930
2931 #ifdef SOCK_CLOEXEC
2932   if (!cloexec_done)
2933 #endif
2934     {
2935       _dbus_fd_set_close_on_exec (fds[0]);
2936       _dbus_fd_set_close_on_exec (fds[1]);
2937     }
2938
2939   if (!blocking &&
2940       (!_dbus_set_fd_nonblocking (fds[0], NULL) ||
2941        !_dbus_set_fd_nonblocking (fds[1], NULL)))
2942     {
2943       dbus_set_error (error, _dbus_error_from_errno (errno),
2944                       "Could not set full-duplex pipe nonblocking");
2945
2946       _dbus_close (fds[0], NULL);
2947       _dbus_close (fds[1], NULL);
2948
2949       return FALSE;
2950     }
2951
2952   *fd1 = fds[0];
2953   *fd2 = fds[1];
2954
2955   _dbus_verbose ("full-duplex pipe %d <-> %d\n",
2956                  *fd1, *fd2);
2957
2958   return TRUE;
2959 #else
2960   _dbus_warn ("_dbus_full_duplex_pipe() not implemented on this OS\n");
2961   dbus_set_error (error, DBUS_ERROR_FAILED,
2962                   "_dbus_full_duplex_pipe() not implemented on this OS");
2963   return FALSE;
2964 #endif
2965 }
2966
2967 /**
2968  * Measure the length of the given format string and arguments,
2969  * not including the terminating nul.
2970  *
2971  * @param format a printf-style format string
2972  * @param args arguments for the format string
2973  * @returns length of the given format string and args
2974  */
2975 int
2976 _dbus_printf_string_upper_bound (const char *format,
2977                                  va_list     args)
2978 {
2979   char c;
2980   return vsnprintf (&c, 1, format, args);
2981 }
2982
2983 /**
2984  * Gets the temporary files directory by inspecting the environment variables
2985  * TMPDIR, TMP, and TEMP in that order. If none of those are set "/tmp" is returned
2986  *
2987  * @returns location of temp directory
2988  */
2989 const char*
2990 _dbus_get_tmpdir(void)
2991 {
2992   static const char* tmpdir = NULL;
2993
2994   if (tmpdir == NULL)
2995     {
2996       /* TMPDIR is what glibc uses, then
2997        * glibc falls back to the P_tmpdir macro which
2998        * just expands to "/tmp"
2999        */
3000       if (tmpdir == NULL)
3001         tmpdir = getenv("TMPDIR");
3002
3003       /* These two env variables are probably
3004        * broken, but maybe some OS uses them?
3005        */
3006       if (tmpdir == NULL)
3007         tmpdir = getenv("TMP");
3008       if (tmpdir == NULL)
3009         tmpdir = getenv("TEMP");
3010
3011       /* And this is the sane fallback. */
3012       if (tmpdir == NULL)
3013         tmpdir = "/tmp";
3014     }
3015
3016   _dbus_assert(tmpdir != NULL);
3017
3018   return tmpdir;
3019 }
3020
3021 /**
3022  * Execute a subprocess, returning up to 1024 bytes of output
3023  * into @p result.
3024  *
3025  * If successful, returns #TRUE and appends the output to @p
3026  * result. If a failure happens, returns #FALSE and
3027  * sets an error in @p error.
3028  *
3029  * @note It's not an error if the subprocess terminates normally
3030  * without writing any data to stdout. Verify the @p result length
3031  * before and after this function call to cover this case.
3032  *
3033  * @param progname initial path to exec (may or may not be absolute)
3034  * @param path_fallback if %TRUE, search PATH for executable
3035  * @param argv NULL-terminated list of arguments
3036  * @param result a DBusString where the output can be append
3037  * @param error a DBusError to store the error in case of failure
3038  * @returns #TRUE on success, #FALSE if an error happened
3039  */
3040 static dbus_bool_t
3041 _read_subprocess_line_argv (const char *progpath,
3042                             dbus_bool_t path_fallback,
3043                             char       * const *argv,
3044                             DBusString *result,
3045                             DBusError  *error)
3046 {
3047   int result_pipe[2] = { -1, -1 };
3048   int errors_pipe[2] = { -1, -1 };
3049   pid_t pid;
3050   int ret;
3051   int status;
3052   int orig_len;
3053   int i;
3054
3055   dbus_bool_t retval;
3056   sigset_t new_set, old_set;
3057
3058   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3059   retval = FALSE;
3060
3061   /* We need to block any existing handlers for SIGCHLD temporarily; they
3062    * will cause waitpid() below to fail.
3063    * https://bugs.freedesktop.org/show_bug.cgi?id=21347
3064    */
3065   sigemptyset (&new_set);
3066   sigaddset (&new_set, SIGCHLD);
3067   sigprocmask (SIG_BLOCK, &new_set, &old_set);
3068
3069   orig_len = _dbus_string_get_length (result);
3070
3071 #define READ_END        0
3072 #define WRITE_END       1
3073   if (pipe (result_pipe) < 0)
3074     {
3075       dbus_set_error (error, _dbus_error_from_errno (errno),
3076                       "Failed to create a pipe to call %s: %s",
3077                       progpath, _dbus_strerror (errno));
3078       _dbus_verbose ("Failed to create a pipe to call %s: %s\n",
3079                      progpath, _dbus_strerror (errno));
3080       goto out;
3081     }
3082   if (pipe (errors_pipe) < 0)
3083     {
3084       dbus_set_error (error, _dbus_error_from_errno (errno),
3085                       "Failed to create a pipe to call %s: %s",
3086                       progpath, _dbus_strerror (errno));
3087       _dbus_verbose ("Failed to create a pipe to call %s: %s\n",
3088                      progpath, _dbus_strerror (errno));
3089       goto out;
3090     }
3091
3092   pid = fork ();
3093   if (pid < 0)
3094     {
3095       dbus_set_error (error, _dbus_error_from_errno (errno),
3096                       "Failed to fork() to call %s: %s",
3097                       progpath, _dbus_strerror (errno));
3098       _dbus_verbose ("Failed to fork() to call %s: %s\n",
3099                      progpath, _dbus_strerror (errno));
3100       goto out;
3101     }
3102
3103   if (pid == 0)
3104     {
3105       /* child process */
3106       int maxfds;
3107       int fd;
3108
3109       fd = open ("/dev/null", O_RDWR);
3110       if (fd == -1)
3111         /* huh?! can't open /dev/null? */
3112         _exit (1);
3113
3114       _dbus_verbose ("/dev/null fd %d opened\n", fd);
3115
3116       /* set-up stdXXX */
3117       close (result_pipe[READ_END]);
3118       close (errors_pipe[READ_END]);
3119       close (0);                /* close stdin */
3120       close (1);                /* close stdout */
3121       close (2);                /* close stderr */
3122
3123       if (dup2 (fd, 0) == -1)
3124         _exit (1);
3125       if (dup2 (result_pipe[WRITE_END], 1) == -1)
3126         _exit (1);
3127       if (dup2 (errors_pipe[WRITE_END], 2) == -1)
3128         _exit (1);
3129
3130       maxfds = sysconf (_SC_OPEN_MAX);
3131       /* Pick something reasonable if for some reason sysconf
3132        * says unlimited.
3133        */
3134       if (maxfds < 0)
3135         maxfds = 1024;
3136       /* close all inherited fds */
3137       for (i = 3; i < maxfds; i++)
3138         close (i);
3139
3140       sigprocmask (SIG_SETMASK, &old_set, NULL);
3141
3142       /* If it looks fully-qualified, try execv first */
3143       if (progpath[0] == '/')
3144         {
3145           execv (progpath, argv);
3146           /* Ok, that failed.  Now if path_fallback is given, let's
3147            * try unqualified.  This is mostly a hack to work
3148            * around systems which ship dbus-launch in /usr/bin
3149            * but everything else in /bin (because dbus-launch
3150            * depends on X11).
3151            */
3152           if (path_fallback)
3153             /* We must have a slash, because we checked above */
3154             execvp (strrchr (progpath, '/')+1, argv);
3155         }
3156       else
3157         execvp (progpath, argv);
3158
3159       /* still nothing, we failed */
3160       _exit (1);
3161     }
3162
3163   /* parent process */
3164   close (result_pipe[WRITE_END]);
3165   close (errors_pipe[WRITE_END]);
3166   result_pipe[WRITE_END] = -1;
3167   errors_pipe[WRITE_END] = -1;
3168
3169   ret = 0;
3170   do
3171     {
3172       ret = _dbus_read (result_pipe[READ_END], result, 1024);
3173     }
3174   while (ret > 0);
3175
3176   /* reap the child process to avoid it lingering as zombie */
3177   do
3178     {
3179       ret = waitpid (pid, &status, 0);
3180     }
3181   while (ret == -1 && errno == EINTR);
3182
3183   /* We succeeded if the process exited with status 0 and
3184      anything was read */
3185   if (!WIFEXITED (status) || WEXITSTATUS (status) != 0 )
3186     {
3187       /* The process ended with error */
3188       DBusString error_message;
3189       if (!_dbus_string_init (&error_message))
3190         {
3191           _DBUS_SET_OOM (error);
3192           goto out;
3193         }
3194
3195       ret = 0;
3196       do
3197         {
3198           ret = _dbus_read (errors_pipe[READ_END], &error_message, 1024);
3199         }
3200       while (ret > 0);
3201
3202       _dbus_string_set_length (result, orig_len);
3203       if (_dbus_string_get_length (&error_message) > 0)
3204         dbus_set_error (error, DBUS_ERROR_SPAWN_EXEC_FAILED,
3205                         "%s terminated abnormally with the following error: %s",
3206                         progpath, _dbus_string_get_data (&error_message));
3207       else
3208         dbus_set_error (error, DBUS_ERROR_SPAWN_EXEC_FAILED,
3209                         "%s terminated abnormally without any error message",
3210                         progpath);
3211       goto out;
3212     }
3213
3214   retval = TRUE;
3215
3216  out:
3217   sigprocmask (SIG_SETMASK, &old_set, NULL);
3218
3219   if (retval)
3220     _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3221   else
3222     _DBUS_ASSERT_ERROR_IS_SET (error);
3223
3224   if (result_pipe[0] != -1)
3225     close (result_pipe[0]);
3226   if (result_pipe[1] != -1)
3227     close (result_pipe[1]);
3228   if (errors_pipe[0] != -1)
3229     close (errors_pipe[0]);
3230   if (errors_pipe[1] != -1)
3231     close (errors_pipe[1]);
3232
3233   return retval;
3234 }
3235
3236 /**
3237  * Returns the address of a new session bus.
3238  *
3239  * If successful, returns #TRUE and appends the address to @p
3240  * address. If a failure happens, returns #FALSE and
3241  * sets an error in @p error.
3242  *
3243  * @param address a DBusString where the address can be stored
3244  * @param error a DBusError to store the error in case of failure
3245  * @returns #TRUE on success, #FALSE if an error happened
3246  */
3247 dbus_bool_t
3248 _dbus_get_autolaunch_address (const char *scope,
3249                               DBusString *address,
3250                               DBusError  *error)
3251 {
3252 #ifdef DBUS_ENABLE_X11_AUTOLAUNCH
3253   /* Perform X11-based autolaunch. (We also support launchd-based autolaunch,
3254    * but that's done elsewhere, and if it worked, this function wouldn't
3255    * be called.) */
3256   const char *display;
3257   static char *argv[6];
3258   int i;
3259   DBusString uuid;
3260   dbus_bool_t retval;
3261
3262   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3263   retval = FALSE;
3264
3265   /* fd.o #19997: if $DISPLAY isn't set to something useful, then
3266    * dbus-launch-x11 is just going to fail. Rather than trying to
3267    * run it, we might as well bail out early with a nice error. */
3268   display = _dbus_getenv ("DISPLAY");
3269
3270   if (display == NULL || display[0] == '\0')
3271     {
3272       dbus_set_error_const (error, DBUS_ERROR_NOT_SUPPORTED,
3273           "Unable to autolaunch a dbus-daemon without a $DISPLAY for X11");
3274       return FALSE;
3275     }
3276
3277   if (!_dbus_string_init (&uuid))
3278     {
3279       _DBUS_SET_OOM (error);
3280       return FALSE;
3281     }
3282
3283   if (!_dbus_get_local_machine_uuid_encoded (&uuid))
3284     {
3285       _DBUS_SET_OOM (error);
3286       goto out;
3287     }
3288
3289   i = 0;
3290   argv[i] = "dbus-launch";
3291   ++i;
3292   argv[i] = "--autolaunch";
3293   ++i;
3294   argv[i] = _dbus_string_get_data (&uuid);
3295   ++i;
3296   argv[i] = "--binary-syntax";
3297   ++i;
3298   argv[i] = "--close-stderr";
3299   ++i;
3300   argv[i] = NULL;
3301   ++i;
3302
3303   _dbus_assert (i == _DBUS_N_ELEMENTS (argv));
3304
3305   retval = _read_subprocess_line_argv (DBUS_BINDIR "/dbus-launch",
3306                                        TRUE,
3307                                        argv, address, error);
3308
3309  out:
3310   _dbus_string_free (&uuid);
3311   return retval;
3312 #else
3313   dbus_set_error_const (error, DBUS_ERROR_NOT_SUPPORTED,
3314       "Using X11 for dbus-daemon autolaunch was disabled at compile time, "
3315       "set your DBUS_SESSION_BUS_ADDRESS instead");
3316   return FALSE;
3317 #endif
3318 }
3319
3320 /**
3321  * Reads the uuid of the machine we're running on from
3322  * the dbus configuration. Optionally try to create it
3323  * (only root can do this usually).
3324  *
3325  * On UNIX, reads a file that gets created by dbus-uuidgen
3326  * in a post-install script. On Windows, if there's a standard
3327  * machine uuid we could just use that, but I can't find one
3328  * with the right properties (the hardware profile guid can change
3329  * without rebooting I believe). If there's no standard one
3330  * we might want to use the registry instead of a file for
3331  * this, and I'm not sure how we'd ensure the uuid gets created.
3332  *
3333  * @param machine_id guid to init with the machine's uuid
3334  * @param create_if_not_found try to create the uuid if it doesn't exist
3335  * @param error the error return
3336  * @returns #FALSE if the error is set
3337  */
3338 dbus_bool_t
3339 _dbus_read_local_machine_uuid (DBusGUID   *machine_id,
3340                                dbus_bool_t create_if_not_found,
3341                                DBusError  *error)
3342 {
3343   DBusString filename;
3344   dbus_bool_t b;
3345
3346   _dbus_string_init_const (&filename, DBUS_MACHINE_UUID_FILE);
3347
3348   b = _dbus_read_uuid_file (&filename, machine_id, create_if_not_found, error);
3349   if (b)
3350     return TRUE;
3351
3352   dbus_error_free (error);
3353
3354   /* Fallback to the system machine ID */
3355   _dbus_string_init_const (&filename, "/etc/machine-id");
3356   return _dbus_read_uuid_file (&filename, machine_id, FALSE, error);
3357 }
3358
3359 #define DBUS_UNIX_STANDARD_SESSION_SERVICEDIR "/dbus-1/services"
3360 #define DBUS_UNIX_STANDARD_SYSTEM_SERVICEDIR "/dbus-1/system-services"
3361
3362 /**
3363  * quries launchd for a specific env var which holds the socket path.
3364  * @param launchd_env_var the env var to look up
3365  * @param error a DBusError to store the error in case of failure
3366  * @return the value of the env var
3367  */
3368 dbus_bool_t
3369 _dbus_lookup_launchd_socket (DBusString *socket_path,
3370                              const char *launchd_env_var,
3371                              DBusError  *error)
3372 {
3373 #ifdef DBUS_ENABLE_LAUNCHD
3374   char *argv[4];
3375   int i;
3376
3377   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3378
3379   i = 0;
3380   argv[i] = "launchctl";
3381   ++i;
3382   argv[i] = "getenv";
3383   ++i;
3384   argv[i] = (char*)launchd_env_var;
3385   ++i;
3386   argv[i] = NULL;
3387   ++i;
3388
3389   _dbus_assert (i == _DBUS_N_ELEMENTS (argv));
3390
3391   if (!_read_subprocess_line_argv(argv[0], TRUE, argv, socket_path, error))
3392     {
3393       return FALSE;
3394     }
3395
3396   /* no error, but no result either */
3397   if (_dbus_string_get_length(socket_path) == 0)
3398     {
3399       return FALSE;
3400     }
3401
3402   /* strip the carriage-return */
3403   _dbus_string_shorten(socket_path, 1);
3404   return TRUE;
3405 #else /* DBUS_ENABLE_LAUNCHD */
3406   dbus_set_error(error, DBUS_ERROR_NOT_SUPPORTED,
3407                 "can't lookup socket from launchd; launchd support not compiled in");
3408   return FALSE;
3409 #endif
3410 }
3411
3412 static dbus_bool_t
3413 _dbus_lookup_session_address_launchd (DBusString *address, DBusError  *error)
3414 {
3415 #ifdef DBUS_ENABLE_LAUNCHD
3416   dbus_bool_t valid_socket;
3417   DBusString socket_path;
3418
3419   if (!_dbus_string_init (&socket_path))
3420     {
3421       _DBUS_SET_OOM (error);
3422       return FALSE;
3423     }
3424
3425   valid_socket = _dbus_lookup_launchd_socket (&socket_path, "DBUS_LAUNCHD_SESSION_BUS_SOCKET", error);
3426
3427   if (dbus_error_is_set(error))
3428     {
3429       _dbus_string_free(&socket_path);
3430       return FALSE;
3431     }
3432
3433   if (!valid_socket)
3434     {
3435       dbus_set_error(error, "no socket path",
3436                 "launchd did not provide a socket path, "
3437                 "verify that org.freedesktop.dbus-session.plist is loaded!");
3438       _dbus_string_free(&socket_path);
3439       return FALSE;
3440     }
3441   if (!_dbus_string_append (address, "unix:path="))
3442     {
3443       _DBUS_SET_OOM (error);
3444       _dbus_string_free(&socket_path);
3445       return FALSE;
3446     }
3447   if (!_dbus_string_copy (&socket_path, 0, address,
3448                           _dbus_string_get_length (address)))
3449     {
3450       _DBUS_SET_OOM (error);
3451       _dbus_string_free(&socket_path);
3452       return FALSE;
3453     }
3454
3455   _dbus_string_free(&socket_path);
3456   return TRUE;
3457 #else
3458   dbus_set_error(error, DBUS_ERROR_NOT_SUPPORTED,
3459                 "can't lookup session address from launchd; launchd support not compiled in");
3460   return FALSE;
3461 #endif
3462 }
3463
3464 /**
3465  * Determines the address of the session bus by querying a
3466  * platform-specific method.
3467  *
3468  * The first parameter will be a boolean specifying whether
3469  * or not a dynamic session lookup is supported on this platform.
3470  *
3471  * If supported is TRUE and the return value is #TRUE, the
3472  * address will be  appended to @p address.
3473  * If a failure happens, returns #FALSE and sets an error in
3474  * @p error.
3475  *
3476  * If supported is FALSE, ignore the return value.
3477  *
3478  * @param supported returns whether this method is supported
3479  * @param address a DBusString where the address can be stored
3480  * @param error a DBusError to store the error in case of failure
3481  * @returns #TRUE on success, #FALSE if an error happened
3482  */
3483 dbus_bool_t
3484 _dbus_lookup_session_address (dbus_bool_t *supported,
3485                               DBusString  *address,
3486                               DBusError   *error)
3487 {
3488 #ifdef DBUS_ENABLE_LAUNCHD
3489   *supported = TRUE;
3490   return _dbus_lookup_session_address_launchd (address, error);
3491 #else
3492   /* On non-Mac Unix platforms, if the session address isn't already
3493    * set in DBUS_SESSION_BUS_ADDRESS environment variable, we punt and
3494    * fall back to the autolaunch: global default; see
3495    * init_session_address in dbus/dbus-bus.c. */
3496   *supported = FALSE;
3497   return TRUE;
3498 #endif
3499 }
3500
3501 /**
3502  * Returns the standard directories for a session bus to look for service
3503  * activation files
3504  *
3505  * On UNIX this should be the standard xdg freedesktop.org data directories:
3506  *
3507  * XDG_DATA_HOME=${XDG_DATA_HOME-$HOME/.local/share}
3508  * XDG_DATA_DIRS=${XDG_DATA_DIRS-/usr/local/share:/usr/share}
3509  *
3510  * and
3511  *
3512  * DBUS_DATADIR
3513  *
3514  * @param dirs the directory list we are returning
3515  * @returns #FALSE on OOM
3516  */
3517
3518 dbus_bool_t
3519 _dbus_get_standard_session_servicedirs (DBusList **dirs)
3520 {
3521   const char *xdg_data_home;
3522   const char *xdg_data_dirs;
3523   DBusString servicedir_path;
3524
3525   if (!_dbus_string_init (&servicedir_path))
3526     return FALSE;
3527
3528   xdg_data_home = _dbus_getenv ("XDG_DATA_HOME");
3529   xdg_data_dirs = _dbus_getenv ("XDG_DATA_DIRS");
3530
3531   if (xdg_data_home != NULL)
3532     {
3533       if (!_dbus_string_append (&servicedir_path, xdg_data_home))
3534         goto oom;
3535     }
3536   else
3537     {
3538       const DBusString *homedir;
3539       DBusString local_share;
3540
3541       if (!_dbus_homedir_from_current_process (&homedir))
3542         goto oom;
3543
3544       if (!_dbus_string_append (&servicedir_path, _dbus_string_get_const_data (homedir)))
3545         goto oom;
3546
3547       _dbus_string_init_const (&local_share, "/.local/share");
3548       if (!_dbus_concat_dir_and_file (&servicedir_path, &local_share))
3549         goto oom;
3550     }
3551
3552   if (!_dbus_string_append (&servicedir_path, ":"))
3553     goto oom;
3554
3555   if (xdg_data_dirs != NULL)
3556     {
3557       if (!_dbus_string_append (&servicedir_path, xdg_data_dirs))
3558         goto oom;
3559
3560       if (!_dbus_string_append (&servicedir_path, ":"))
3561         goto oom;
3562     }
3563   else
3564     {
3565       if (!_dbus_string_append (&servicedir_path, "/usr/local/share:/usr/share:"))
3566         goto oom;
3567     }
3568
3569   /*
3570    * add configured datadir to defaults
3571    * this may be the same as an xdg dir
3572    * however the config parser should take
3573    * care of duplicates
3574    */
3575   if (!_dbus_string_append (&servicedir_path, DBUS_DATADIR))
3576     goto oom;
3577
3578   if (!_dbus_split_paths_and_append (&servicedir_path,
3579                                      DBUS_UNIX_STANDARD_SESSION_SERVICEDIR,
3580                                      dirs))
3581     goto oom;
3582
3583   _dbus_string_free (&servicedir_path);
3584   return TRUE;
3585
3586  oom:
3587   _dbus_string_free (&servicedir_path);
3588   return FALSE;
3589 }
3590
3591
3592 /**
3593  * Returns the standard directories for a system bus to look for service
3594  * activation files
3595  *
3596  * On UNIX this should be the standard xdg freedesktop.org data directories:
3597  *
3598  * XDG_DATA_DIRS=${XDG_DATA_DIRS-/usr/local/share:/usr/share}
3599  *
3600  * and
3601  *
3602  * DBUS_DATADIR
3603  *
3604  * On Windows there is no system bus and this function can return nothing.
3605  *
3606  * @param dirs the directory list we are returning
3607  * @returns #FALSE on OOM
3608  */
3609
3610 dbus_bool_t
3611 _dbus_get_standard_system_servicedirs (DBusList **dirs)
3612 {
3613   const char *xdg_data_dirs;
3614   DBusString servicedir_path;
3615
3616   if (!_dbus_string_init (&servicedir_path))
3617     return FALSE;
3618
3619   xdg_data_dirs = _dbus_getenv ("XDG_DATA_DIRS");
3620
3621   if (xdg_data_dirs != NULL)
3622     {
3623       if (!_dbus_string_append (&servicedir_path, xdg_data_dirs))
3624         goto oom;
3625
3626       if (!_dbus_string_append (&servicedir_path, ":"))
3627         goto oom;
3628     }
3629   else
3630     {
3631       if (!_dbus_string_append (&servicedir_path, "/usr/local/share:/usr/share:"))
3632         goto oom;
3633     }
3634
3635   /*
3636    * Add configured datadir to defaults. This may be the same as one
3637    * of the XDG directories. However, the config parser should take
3638    * care of the duplicates.
3639    *
3640    * Also, append /lib as counterpart of /usr/share on the root
3641    * directory (the root directory does not know /share), in order to
3642    * facilitate early boot system bus activation where /usr might not
3643    * be available.
3644    */
3645   if (!_dbus_string_append (&servicedir_path,
3646                             DBUS_DATADIR":"
3647                             "/lib:"))
3648         goto oom;
3649
3650   if (!_dbus_split_paths_and_append (&servicedir_path,
3651                                      DBUS_UNIX_STANDARD_SYSTEM_SERVICEDIR,
3652                                      dirs))
3653     goto oom;
3654
3655   _dbus_string_free (&servicedir_path);
3656   return TRUE;
3657
3658  oom:
3659   _dbus_string_free (&servicedir_path);
3660   return FALSE;
3661 }
3662
3663 /**
3664  * Append the absolute path of the system.conf file
3665  * (there is no system bus on Windows so this can just
3666  * return FALSE and print a warning or something)
3667  *
3668  * @param str the string to append to
3669  * @returns #FALSE if no memory
3670  */
3671 dbus_bool_t
3672 _dbus_append_system_config_file (DBusString *str)
3673 {
3674   return _dbus_string_append (str, DBUS_SYSTEM_CONFIG_FILE);
3675 }
3676
3677 /**
3678  * Append the absolute path of the session.conf file.
3679  *
3680  * @param str the string to append to
3681  * @returns #FALSE if no memory
3682  */
3683 dbus_bool_t
3684 _dbus_append_session_config_file (DBusString *str)
3685 {
3686   return _dbus_string_append (str, DBUS_SESSION_CONFIG_FILE);
3687 }
3688
3689 /**
3690  * Called when the bus daemon is signaled to reload its configuration; any
3691  * caches should be nuked. Of course any caches that need explicit reload
3692  * are probably broken, but c'est la vie.
3693  *
3694  *
3695  */
3696 void
3697 _dbus_flush_caches (void)
3698 {
3699   _dbus_user_database_flush_system ();
3700 }
3701
3702 /**
3703  * Appends the directory in which a keyring for the given credentials
3704  * should be stored.  The credentials should have either a Windows or
3705  * UNIX user in them.  The directory should be an absolute path.
3706  *
3707  * On UNIX the directory is ~/.dbus-keyrings while on Windows it should probably
3708  * be something else, since the dotfile convention is not normal on Windows.
3709  *
3710  * @param directory string to append directory to
3711  * @param credentials credentials the directory should be for
3712  *
3713  * @returns #FALSE on no memory
3714  */
3715 dbus_bool_t
3716 _dbus_append_keyring_directory_for_credentials (DBusString      *directory,
3717                                                 DBusCredentials *credentials)
3718 {
3719   DBusString homedir;
3720   DBusString dotdir;
3721   dbus_uid_t uid;
3722
3723   _dbus_assert (credentials != NULL);
3724   _dbus_assert (!_dbus_credentials_are_anonymous (credentials));
3725
3726   if (!_dbus_string_init (&homedir))
3727     return FALSE;
3728
3729   uid = _dbus_credentials_get_unix_uid (credentials);
3730   _dbus_assert (uid != DBUS_UID_UNSET);
3731
3732   if (!_dbus_homedir_from_uid (uid, &homedir))
3733     goto failed;
3734
3735 #ifdef DBUS_BUILD_TESTS
3736   {
3737     const char *override;
3738
3739     override = _dbus_getenv ("DBUS_TEST_HOMEDIR");
3740     if (override != NULL && *override != '\0')
3741       {
3742         _dbus_string_set_length (&homedir, 0);
3743         if (!_dbus_string_append (&homedir, override))
3744           goto failed;
3745
3746         _dbus_verbose ("Using fake homedir for testing: %s\n",
3747                        _dbus_string_get_const_data (&homedir));
3748       }
3749     else
3750       {
3751         static dbus_bool_t already_warned = FALSE;
3752         if (!already_warned)
3753           {
3754             _dbus_warn ("Using your real home directory for testing, set DBUS_TEST_HOMEDIR to avoid\n");
3755             already_warned = TRUE;
3756           }
3757       }
3758   }
3759 #endif
3760
3761   _dbus_string_init_const (&dotdir, ".dbus-keyrings");
3762   if (!_dbus_concat_dir_and_file (&homedir,
3763                                   &dotdir))
3764     goto failed;
3765
3766   if (!_dbus_string_copy (&homedir, 0,
3767                           directory, _dbus_string_get_length (directory))) {
3768     goto failed;
3769   }
3770
3771   _dbus_string_free (&homedir);
3772   return TRUE;
3773
3774  failed:
3775   _dbus_string_free (&homedir);
3776   return FALSE;
3777 }
3778
3779 //PENDING(kdab) docs
3780 dbus_bool_t
3781 _dbus_daemon_publish_session_bus_address (const char* addr,
3782                                           const char *scope)
3783 {
3784   return TRUE;
3785 }
3786
3787 //PENDING(kdab) docs
3788 void
3789 _dbus_daemon_unpublish_session_bus_address (void)
3790 {
3791
3792 }
3793
3794 /**
3795  * See if errno is EAGAIN or EWOULDBLOCK (this has to be done differently
3796  * for Winsock so is abstracted)
3797  *
3798  * @returns #TRUE if errno == EAGAIN or errno == EWOULDBLOCK
3799  */
3800 dbus_bool_t
3801 _dbus_get_is_errno_eagain_or_ewouldblock (void)
3802 {
3803   return errno == EAGAIN || errno == EWOULDBLOCK;
3804 }
3805
3806 /**
3807  * Removes a directory; Directory must be empty
3808  *
3809  * @param filename directory filename
3810  * @param error initialized error object
3811  * @returns #TRUE on success
3812  */
3813 dbus_bool_t
3814 _dbus_delete_directory (const DBusString *filename,
3815                         DBusError        *error)
3816 {
3817   const char *filename_c;
3818
3819   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3820
3821   filename_c = _dbus_string_get_const_data (filename);
3822
3823   if (rmdir (filename_c) != 0)
3824     {
3825       dbus_set_error (error, DBUS_ERROR_FAILED,
3826                       "Failed to remove directory %s: %s\n",
3827                       filename_c, _dbus_strerror (errno));
3828       return FALSE;
3829     }
3830
3831   return TRUE;
3832 }
3833
3834 /**
3835  *  Checks whether file descriptors may be passed via the socket
3836  *
3837  *  @param fd the socket
3838  *  @return TRUE when fd passing over this socket is supported
3839  *
3840  */
3841 dbus_bool_t
3842 _dbus_socket_can_pass_unix_fd(int fd) {
3843
3844 #ifdef SCM_RIGHTS
3845   union {
3846     struct sockaddr sa;
3847     struct sockaddr_storage storage;
3848     struct sockaddr_un un;
3849   } sa_buf;
3850
3851   socklen_t sa_len = sizeof(sa_buf);
3852
3853   _DBUS_ZERO(sa_buf);
3854
3855   if (getsockname(fd, &sa_buf.sa, &sa_len) < 0)
3856     return FALSE;
3857
3858   return sa_buf.sa.sa_family == AF_UNIX;
3859
3860 #else
3861   return FALSE;
3862
3863 #endif
3864 }
3865
3866
3867 /*
3868  * replaces the term DBUS_PREFIX in configure_time_path by the
3869  * current dbus installation directory. On unix this function is a noop
3870  *
3871  * @param configure_time_path
3872  * @return real path
3873  */
3874 const char *
3875 _dbus_replace_install_prefix (const char *configure_time_path)
3876 {
3877   return configure_time_path;
3878 }
3879
3880 /* tests in dbus-sysdeps-util.c */