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