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)
4 * Copyright (C) 2002, 2003, 2006 Red Hat, Inc.
5 * Copyright (C) 2003 CodeFactory AB
7 * Licensed under the Academic Free License version 2.1
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.
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.
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
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"
39 #include <sys/types.h>
46 #include <sys/socket.h>
55 #include <netinet/in.h>
71 #ifdef HAVE_GETPEERUCRED
84 #define AI_ADDRCONFIG 0
87 #ifndef HAVE_SOCKLEN_T
92 _dbus_open_socket (int *fd_p,
99 dbus_bool_t cloexec_done;
101 *fd_p = socket (domain, type | SOCK_CLOEXEC, protocol);
102 cloexec_done = *fd_p >= 0;
104 /* Check if kernel seems to be too old to know SOCK_CLOEXEC */
105 if (*fd_p < 0 && errno == EINVAL)
108 *fd_p = socket (domain, type, protocol);
117 _dbus_fd_set_close_on_exec(*fd_p);
120 _dbus_verbose ("socket fd %d opened\n", *fd_p);
125 dbus_set_error(error,
126 _dbus_error_from_errno (errno),
127 "Failed to open socket: %s",
128 _dbus_strerror (errno));
134 _dbus_open_tcp_socket (int *fd,
137 return _dbus_open_socket(fd, AF_INET, SOCK_STREAM, 0, error);
141 * Opens a UNIX domain socket (as in the socket() call).
142 * Does not bind the socket.
144 * This will set FD_CLOEXEC for the socket returned
146 * @param fd return location for socket descriptor
147 * @param error return location for an error
148 * @returns #FALSE if error is set
151 _dbus_open_unix_socket (int *fd,
154 return _dbus_open_socket(fd, PF_UNIX, SOCK_STREAM, 0, error);
158 * Closes a socket. Should not be used on non-socket
159 * file descriptors or handles.
161 * @param fd the socket
162 * @param error return location for an error
163 * @returns #FALSE if error is set
166 _dbus_close_socket (int fd,
169 return _dbus_close (fd, error);
173 * Like _dbus_read(), but only works on sockets so is
174 * available on Windows.
176 * @param fd the socket
177 * @param buffer string to append data to
178 * @param count max amount of data to read
179 * @returns number of bytes appended to the string
182 _dbus_read_socket (int fd,
186 return _dbus_read (fd, buffer, count);
190 * Like _dbus_write(), but only supports sockets
191 * and is thus available on Windows.
193 * @param fd the file descriptor to write
194 * @param buffer the buffer to write data from
195 * @param start the first byte in the buffer to write
196 * @param len the number of bytes to try to write
197 * @returns the number of bytes written or -1 on error
200 _dbus_write_socket (int fd,
201 const DBusString *buffer,
209 data = _dbus_string_get_const_data_len (buffer, start, len);
213 bytes_written = send (fd, data, len, MSG_NOSIGNAL);
215 if (bytes_written < 0 && errno == EINTR)
218 return bytes_written;
221 return _dbus_write (fd, buffer, start, len);
226 * Like _dbus_read_socket() but also tries to read unix fds from the
227 * socket. When there are more fds to read than space in the array
228 * passed this function will fail with ENOSPC.
230 * @param fd the socket
231 * @param buffer string to append data to
232 * @param count max amount of data to read
233 * @param fds array to place read file descriptors in
234 * @param n_fds on input space in fds array, on output how many fds actually got read
235 * @returns number of bytes appended to string
238 _dbus_read_socket_with_unix_fds (int fd,
243 #ifndef HAVE_UNIX_FD_PASSING
246 if ((r = _dbus_read_socket(fd, buffer, count)) < 0)
258 _dbus_assert (count >= 0);
259 _dbus_assert (*n_fds >= 0);
261 start = _dbus_string_get_length (buffer);
263 if (!_dbus_string_lengthen (buffer, count))
270 iov.iov_base = _dbus_string_get_data_len (buffer, start, count);
277 /* Hmm, we have no clue how long the control data will actually be
278 that is queued for us. The least we can do is assume that the
279 caller knows. Hence let's make space for the number of fds that
280 we shall read at max plus the cmsg header. */
281 m.msg_controllen = CMSG_SPACE(*n_fds * sizeof(int));
283 /* It's probably safe to assume that systems with SCM_RIGHTS also
285 m.msg_control = alloca(m.msg_controllen);
286 memset(m.msg_control, 0, m.msg_controllen);
290 bytes_read = recvmsg(fd, &m, 0
291 #ifdef MSG_CMSG_CLOEXEC
302 /* put length back (note that this doesn't actually realloc anything) */
303 _dbus_string_set_length (buffer, start);
310 dbus_bool_t found = FALSE;
312 if (m.msg_flags & MSG_CTRUNC)
314 /* Hmm, apparently the control data was truncated. The bad
315 thing is that we might have completely lost a couple of fds
316 without chance to recover them. Hence let's treat this as a
320 _dbus_string_set_length (buffer, start);
324 for (cm = CMSG_FIRSTHDR(&m); cm; cm = CMSG_NXTHDR(&m, cm))
325 if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SCM_RIGHTS)
329 _dbus_assert(cm->cmsg_len <= CMSG_LEN(*n_fds * sizeof(int)));
330 *n_fds = (cm->cmsg_len - CMSG_LEN(0)) / sizeof(int);
332 memcpy(fds, CMSG_DATA(cm), *n_fds * sizeof(int));
335 /* Linux doesn't tell us whether MSG_CMSG_CLOEXEC actually
336 worked, hence we need to go through this list and set
337 CLOEXEC everywhere in any case */
338 for (i = 0; i < *n_fds; i++)
339 _dbus_fd_set_close_on_exec(fds[i]);
347 /* put length back (doesn't actually realloc) */
348 _dbus_string_set_length (buffer, start + bytes_read);
352 _dbus_verbose_bytes_of_string (buffer, start, bytes_read);
361 _dbus_write_socket_with_unix_fds(int fd,
362 const DBusString *buffer,
368 #ifndef HAVE_UNIX_FD_PASSING
375 return _dbus_write_socket(fd, buffer, start, len);
377 return _dbus_write_socket_with_unix_fds_two(fd, buffer, start, len, NULL, 0, 0, fds, n_fds);
382 _dbus_write_socket_with_unix_fds_two(int fd,
383 const DBusString *buffer1,
386 const DBusString *buffer2,
392 #ifndef HAVE_UNIX_FD_PASSING
399 return _dbus_write_socket_two(fd,
400 buffer1, start1, len1,
401 buffer2, start2, len2);
409 _dbus_assert (len1 >= 0);
410 _dbus_assert (len2 >= 0);
411 _dbus_assert (n_fds >= 0);
414 iov[0].iov_base = (char*) _dbus_string_get_const_data_len (buffer1, start1, len1);
415 iov[0].iov_len = len1;
419 iov[1].iov_base = (char*) _dbus_string_get_const_data_len (buffer2, start2, len2);
420 iov[1].iov_len = len2;
425 m.msg_iovlen = buffer2 ? 2 : 1;
429 m.msg_controllen = CMSG_SPACE(n_fds * sizeof(int));
430 m.msg_control = alloca(m.msg_controllen);
431 memset(m.msg_control, 0, m.msg_controllen);
433 cm = CMSG_FIRSTHDR(&m);
434 cm->cmsg_level = SOL_SOCKET;
435 cm->cmsg_type = SCM_RIGHTS;
436 cm->cmsg_len = CMSG_LEN(n_fds * sizeof(int));
437 memcpy(CMSG_DATA(cm), fds, n_fds * sizeof(int));
442 bytes_written = sendmsg (fd, &m, 0
448 if (bytes_written < 0 && errno == EINTR)
452 if (bytes_written > 0)
453 _dbus_verbose_bytes_of_string (buffer, start, bytes_written);
456 return bytes_written;
461 * Like _dbus_write_two() but only works on sockets and is thus
462 * available on Windows.
464 * @param fd the file descriptor
465 * @param buffer1 first buffer
466 * @param start1 first byte to write in first buffer
467 * @param len1 number of bytes to write from first buffer
468 * @param buffer2 second buffer, or #NULL
469 * @param start2 first byte to write in second buffer
470 * @param len2 number of bytes to write in second buffer
471 * @returns total bytes written from both buffers, or -1 on error
474 _dbus_write_socket_two (int fd,
475 const DBusString *buffer1,
478 const DBusString *buffer2,
483 struct iovec vectors[2];
489 _dbus_assert (buffer1 != NULL);
490 _dbus_assert (start1 >= 0);
491 _dbus_assert (start2 >= 0);
492 _dbus_assert (len1 >= 0);
493 _dbus_assert (len2 >= 0);
495 data1 = _dbus_string_get_const_data_len (buffer1, start1, len1);
498 data2 = _dbus_string_get_const_data_len (buffer2, start2, len2);
506 vectors[0].iov_base = (char*) data1;
507 vectors[0].iov_len = len1;
508 vectors[1].iov_base = (char*) data2;
509 vectors[1].iov_len = len2;
513 m.msg_iovlen = data2 ? 2 : 1;
517 bytes_written = sendmsg (fd, &m, MSG_NOSIGNAL);
519 if (bytes_written < 0 && errno == EINTR)
522 return bytes_written;
525 return _dbus_write_two (fd, buffer1, start1, len1,
526 buffer2, start2, len2);
531 _dbus_socket_is_invalid (int fd)
533 return fd < 0 ? TRUE : FALSE;
537 * Thin wrapper around the read() system call that appends
538 * the data it reads to the DBusString buffer. It appends
539 * up to the given count, and returns the same value
540 * and same errno as read(). The only exception is that
541 * _dbus_read() handles EINTR for you. Also, _dbus_read() can
542 * return ENOMEM, even though regular UNIX read doesn't.
544 * Unlike _dbus_read_socket(), _dbus_read() is not available
547 * @param fd the file descriptor to read from
548 * @param buffer the buffer to append data to
549 * @param count the amount of data to read
550 * @returns the number of bytes read or -1
561 _dbus_assert (count >= 0);
563 start = _dbus_string_get_length (buffer);
565 if (!_dbus_string_lengthen (buffer, count))
571 data = _dbus_string_get_data_len (buffer, start, count);
575 bytes_read = read (fd, data, count);
583 /* put length back (note that this doesn't actually realloc anything) */
584 _dbus_string_set_length (buffer, start);
590 /* put length back (doesn't actually realloc) */
591 _dbus_string_set_length (buffer, start + bytes_read);
595 _dbus_verbose_bytes_of_string (buffer, start, bytes_read);
603 * Thin wrapper around the write() system call that writes a part of a
604 * DBusString and handles EINTR for you.
606 * @param fd the file descriptor to write
607 * @param buffer the buffer to write data from
608 * @param start the first byte in the buffer to write
609 * @param len the number of bytes to try to write
610 * @returns the number of bytes written or -1 on error
614 const DBusString *buffer,
621 data = _dbus_string_get_const_data_len (buffer, start, len);
625 bytes_written = write (fd, data, len);
627 if (bytes_written < 0 && errno == EINTR)
631 if (bytes_written > 0)
632 _dbus_verbose_bytes_of_string (buffer, start, bytes_written);
635 return bytes_written;
639 * Like _dbus_write() but will use writev() if possible
640 * to write both buffers in sequence. The return value
641 * is the number of bytes written in the first buffer,
642 * plus the number written in the second. If the first
643 * buffer is written successfully and an error occurs
644 * writing the second, the number of bytes in the first
645 * is returned (i.e. the error is ignored), on systems that
646 * don't have writev. Handles EINTR for you.
647 * The second buffer may be #NULL.
649 * @param fd the file descriptor
650 * @param buffer1 first buffer
651 * @param start1 first byte to write in first buffer
652 * @param len1 number of bytes to write from first buffer
653 * @param buffer2 second buffer, or #NULL
654 * @param start2 first byte to write in second buffer
655 * @param len2 number of bytes to write in second buffer
656 * @returns total bytes written from both buffers, or -1 on error
659 _dbus_write_two (int fd,
660 const DBusString *buffer1,
663 const DBusString *buffer2,
667 _dbus_assert (buffer1 != NULL);
668 _dbus_assert (start1 >= 0);
669 _dbus_assert (start2 >= 0);
670 _dbus_assert (len1 >= 0);
671 _dbus_assert (len2 >= 0);
675 struct iovec vectors[2];
680 data1 = _dbus_string_get_const_data_len (buffer1, start1, len1);
683 data2 = _dbus_string_get_const_data_len (buffer2, start2, len2);
691 vectors[0].iov_base = (char*) data1;
692 vectors[0].iov_len = len1;
693 vectors[1].iov_base = (char*) data2;
694 vectors[1].iov_len = len2;
698 bytes_written = writev (fd,
702 if (bytes_written < 0 && errno == EINTR)
705 return bytes_written;
707 #else /* HAVE_WRITEV */
711 ret1 = _dbus_write (fd, buffer1, start1, len1);
712 if (ret1 == len1 && buffer2 != NULL)
714 ret2 = _dbus_write (fd, buffer2, start2, len2);
716 ret2 = 0; /* we can't report an error as the first write was OK */
723 #endif /* !HAVE_WRITEV */
726 #define _DBUS_MAX_SUN_PATH_LENGTH 99
729 * @def _DBUS_MAX_SUN_PATH_LENGTH
731 * Maximum length of the path to a UNIX domain socket,
732 * sockaddr_un::sun_path member. POSIX requires that all systems
733 * support at least 100 bytes here, including the nul termination.
734 * We use 99 for the max value to allow for the nul.
736 * We could probably also do sizeof (addr.sun_path)
737 * but this way we are the same on all platforms
738 * which is probably a good idea.
742 * Creates a socket and connects it to the UNIX domain socket at the
743 * given path. The connection fd is returned, and is set up as
746 * Uses abstract sockets instead of filesystem-linked sockets if
747 * requested (it's possible only on Linux; see "man 7 unix" on Linux).
748 * On non-Linux abstract socket usage always fails.
750 * This will set FD_CLOEXEC for the socket returned.
752 * @param path the path to UNIX domain socket
753 * @param abstract #TRUE to use abstract namespace
754 * @param error return location for error code
755 * @returns connection file descriptor or -1 on error
758 _dbus_connect_unix_socket (const char *path,
759 dbus_bool_t abstract,
764 struct sockaddr_un addr;
766 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
768 _dbus_verbose ("connecting to unix socket %s abstract=%d\n",
772 if (!_dbus_open_unix_socket (&fd, error))
774 _DBUS_ASSERT_ERROR_IS_SET(error);
777 _DBUS_ASSERT_ERROR_IS_CLEAR(error);
780 addr.sun_family = AF_UNIX;
781 path_len = strlen (path);
785 #ifdef HAVE_ABSTRACT_SOCKETS
786 addr.sun_path[0] = '\0'; /* this is what says "use abstract" */
787 path_len++; /* Account for the extra nul byte added to the start of sun_path */
789 if (path_len > _DBUS_MAX_SUN_PATH_LENGTH)
791 dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
792 "Abstract socket name too long\n");
793 _dbus_close (fd, NULL);
797 strncpy (&addr.sun_path[1], path, path_len);
798 /* _dbus_verbose_bytes (addr.sun_path, sizeof (addr.sun_path)); */
799 #else /* HAVE_ABSTRACT_SOCKETS */
800 dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED,
801 "Operating system does not support abstract socket namespace\n");
802 _dbus_close (fd, NULL);
804 #endif /* ! HAVE_ABSTRACT_SOCKETS */
808 if (path_len > _DBUS_MAX_SUN_PATH_LENGTH)
810 dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
811 "Socket name too long\n");
812 _dbus_close (fd, NULL);
816 strncpy (addr.sun_path, path, path_len);
819 if (connect (fd, (struct sockaddr*) &addr, _DBUS_STRUCT_OFFSET (struct sockaddr_un, sun_path) + path_len) < 0)
821 dbus_set_error (error,
822 _dbus_error_from_errno (errno),
823 "Failed to connect to socket %s: %s",
824 path, _dbus_strerror (errno));
826 _dbus_close (fd, NULL);
832 if (!_dbus_set_fd_nonblocking (fd, error))
834 _DBUS_ASSERT_ERROR_IS_SET (error);
836 _dbus_close (fd, NULL);
846 * Enables or disables the reception of credentials on the given socket during
847 * the next message transmission. This is only effective if the #LOCAL_CREDS
848 * system feature exists, in which case the other side of the connection does
849 * not have to do anything special to send the credentials.
851 * @param fd socket on which to change the #LOCAL_CREDS flag.
852 * @param on whether to enable or disable the #LOCAL_CREDS flag.
855 _dbus_set_local_creds (int fd, dbus_bool_t on)
857 dbus_bool_t retval = TRUE;
859 #if defined(HAVE_CMSGCRED)
860 /* NOOP just to make sure only one codepath is used
861 * and to prefer CMSGCRED
863 #elif defined(LOCAL_CREDS)
864 int val = on ? 1 : 0;
865 if (setsockopt (fd, 0, LOCAL_CREDS, &val, sizeof (val)) < 0)
867 _dbus_verbose ("Unable to set LOCAL_CREDS socket option on fd %d\n", fd);
871 _dbus_verbose ("LOCAL_CREDS %s for further messages on fd %d\n",
872 on ? "enabled" : "disabled", fd);
879 * Creates a socket and binds it to the given path,
880 * then listens on the socket. The socket is
881 * set to be nonblocking.
883 * Uses abstract sockets instead of filesystem-linked
884 * sockets if requested (it's possible only on Linux;
885 * see "man 7 unix" on Linux).
886 * On non-Linux abstract socket usage always fails.
888 * This will set FD_CLOEXEC for the socket returned
890 * @param path the socket name
891 * @param abstract #TRUE to use abstract namespace
892 * @param error return location for errors
893 * @returns the listening file descriptor or -1 on error
896 _dbus_listen_unix_socket (const char *path,
897 dbus_bool_t abstract,
901 struct sockaddr_un addr;
904 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
906 _dbus_verbose ("listening on unix socket %s abstract=%d\n",
909 if (!_dbus_open_unix_socket (&listen_fd, error))
911 _DBUS_ASSERT_ERROR_IS_SET(error);
914 _DBUS_ASSERT_ERROR_IS_CLEAR(error);
917 addr.sun_family = AF_UNIX;
918 path_len = strlen (path);
922 #ifdef HAVE_ABSTRACT_SOCKETS
923 /* remember that abstract names aren't nul-terminated so we rely
924 * on sun_path being filled in with zeroes above.
926 addr.sun_path[0] = '\0'; /* this is what says "use abstract" */
927 path_len++; /* Account for the extra nul byte added to the start of sun_path */
929 if (path_len > _DBUS_MAX_SUN_PATH_LENGTH)
931 dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
932 "Abstract socket name too long\n");
933 _dbus_close (listen_fd, NULL);
937 strncpy (&addr.sun_path[1], path, path_len);
938 /* _dbus_verbose_bytes (addr.sun_path, sizeof (addr.sun_path)); */
939 #else /* HAVE_ABSTRACT_SOCKETS */
940 dbus_set_error (error, DBUS_ERROR_NOT_SUPPORTED,
941 "Operating system does not support abstract socket namespace\n");
942 _dbus_close (listen_fd, NULL);
944 #endif /* ! HAVE_ABSTRACT_SOCKETS */
948 /* Discussed security implications of this with Nalin,
949 * and we couldn't think of where it would kick our ass, but
950 * it still seems a bit sucky. It also has non-security suckage;
951 * really we'd prefer to exit if the socket is already in use.
952 * But there doesn't seem to be a good way to do this.
954 * Just to be extra careful, I threw in the stat() - clearly
955 * the stat() can't *fix* any security issue, but it at least
956 * avoids inadvertent/accidental data loss.
961 if (stat (path, &sb) == 0 &&
962 S_ISSOCK (sb.st_mode))
966 if (path_len > _DBUS_MAX_SUN_PATH_LENGTH)
968 dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
969 "Abstract socket name too long\n");
970 _dbus_close (listen_fd, NULL);
974 strncpy (addr.sun_path, path, path_len);
977 if (bind (listen_fd, (struct sockaddr*) &addr, _DBUS_STRUCT_OFFSET (struct sockaddr_un, sun_path) + path_len) < 0)
979 dbus_set_error (error, _dbus_error_from_errno (errno),
980 "Failed to bind socket \"%s\": %s",
981 path, _dbus_strerror (errno));
982 _dbus_close (listen_fd, NULL);
986 if (listen (listen_fd, 30 /* backlog */) < 0)
988 dbus_set_error (error, _dbus_error_from_errno (errno),
989 "Failed to listen on socket \"%s\": %s",
990 path, _dbus_strerror (errno));
991 _dbus_close (listen_fd, NULL);
995 if (!_dbus_set_local_creds (listen_fd, TRUE))
997 dbus_set_error (error, _dbus_error_from_errno (errno),
998 "Failed to enable LOCAL_CREDS on socket \"%s\": %s",
999 path, _dbus_strerror (errno));
1004 if (!_dbus_set_fd_nonblocking (listen_fd, error))
1006 _DBUS_ASSERT_ERROR_IS_SET (error);
1007 _dbus_close (listen_fd, NULL);
1011 /* Try opening up the permissions, but if we can't, just go ahead
1012 * and continue, maybe it will be good enough.
1014 if (!abstract && chmod (path, 0777) < 0)
1015 _dbus_warn ("Could not set mode 0777 on socket %s\n",
1022 * Creates a socket and connects to a socket at the given host
1023 * and port. The connection fd is returned, and is set up as
1026 * This will set FD_CLOEXEC for the socket returned
1028 * @param host the host name to connect to
1029 * @param port the port to connect to
1030 * @param family the address family to listen on, NULL for all
1031 * @param error return location for error code
1032 * @returns connection file descriptor or -1 on error
1035 _dbus_connect_tcp_socket (const char *host,
1040 return _dbus_connect_tcp_socket_with_nonce (host, port, family, (const char*)NULL, error);
1044 _dbus_connect_tcp_socket_with_nonce (const char *host,
1047 const char *noncefile,
1050 int saved_errno = 0;
1052 struct addrinfo hints;
1053 struct addrinfo *ai, *tmp;
1055 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1057 if (!_dbus_open_tcp_socket (&fd, error))
1059 _DBUS_ASSERT_ERROR_IS_SET(error);
1063 _DBUS_ASSERT_ERROR_IS_CLEAR(error);
1068 hints.ai_family = AF_UNSPEC;
1069 else if (!strcmp(family, "ipv4"))
1070 hints.ai_family = AF_INET;
1071 else if (!strcmp(family, "ipv6"))
1072 hints.ai_family = AF_INET6;
1075 dbus_set_error (error,
1076 DBUS_ERROR_BAD_ADDRESS,
1077 "Unknown address family %s", family);
1080 hints.ai_protocol = IPPROTO_TCP;
1081 hints.ai_socktype = SOCK_STREAM;
1082 hints.ai_flags = AI_ADDRCONFIG;
1084 if ((res = getaddrinfo(host, port, &hints, &ai)) != 0)
1086 dbus_set_error (error,
1087 _dbus_error_from_errno (errno),
1088 "Failed to lookup host/port: \"%s:%s\": %s (%d)",
1089 host, port, gai_strerror(res), res);
1090 _dbus_close (fd, NULL);
1097 if (!_dbus_open_socket (&fd, tmp->ai_family, SOCK_STREAM, 0, error))
1100 _DBUS_ASSERT_ERROR_IS_SET(error);
1103 _DBUS_ASSERT_ERROR_IS_CLEAR(error);
1105 if (connect (fd, (struct sockaddr*) tmp->ai_addr, tmp->ai_addrlen) < 0)
1107 saved_errno = errno;
1108 _dbus_close(fd, NULL);
1120 dbus_set_error (error,
1121 _dbus_error_from_errno (saved_errno),
1122 "Failed to connect to socket \"%s:%s\" %s",
1123 host, port, _dbus_strerror(saved_errno));
1127 if (noncefile != NULL)
1129 DBusString noncefileStr;
1131 _dbus_string_init_const (&noncefileStr, noncefile);
1132 ret = _dbus_send_nonce (fd, &noncefileStr, error);
1133 _dbus_string_free (&noncefileStr);
1137 _dbus_close (fd, NULL);
1142 if (!_dbus_set_fd_nonblocking (fd, error))
1144 _dbus_close (fd, NULL);
1152 * Creates a socket and binds it to the given path, then listens on
1153 * the socket. The socket is set to be nonblocking. In case of port=0
1154 * a random free port is used and returned in the port parameter.
1155 * If inaddr_any is specified, the hostname is ignored.
1157 * This will set FD_CLOEXEC for the socket returned
1159 * @param host the host name to listen on
1160 * @param port the port to listen on, if zero a free port will be used
1161 * @param family the address family to listen on, NULL for all
1162 * @param retport string to return the actual port listened on
1163 * @param fds_p location to store returned file descriptors
1164 * @param error return location for errors
1165 * @returns the number of listening file descriptors or -1 on error
1168 _dbus_listen_tcp_socket (const char *host,
1171 DBusString *retport,
1176 int nlisten_fd = 0, *listen_fd = NULL, res, i;
1177 struct addrinfo hints;
1178 struct addrinfo *ai, *tmp;
1181 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1186 hints.ai_family = AF_UNSPEC;
1187 else if (!strcmp(family, "ipv4"))
1188 hints.ai_family = AF_INET;
1189 else if (!strcmp(family, "ipv6"))
1190 hints.ai_family = AF_INET6;
1193 dbus_set_error (error,
1194 DBUS_ERROR_BAD_ADDRESS,
1195 "Unknown address family %s", family);
1199 hints.ai_protocol = IPPROTO_TCP;
1200 hints.ai_socktype = SOCK_STREAM;
1201 hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;
1203 redo_lookup_with_port:
1204 if ((res = getaddrinfo(host, port, &hints, &ai)) != 0 || !ai)
1206 dbus_set_error (error,
1207 _dbus_error_from_errno (errno),
1208 "Failed to lookup host/port: \"%s:%s\": %s (%d)",
1209 host ? host : "*", port, gai_strerror(res), res);
1216 int fd = -1, *newlisten_fd;
1217 if (!_dbus_open_socket (&fd, tmp->ai_family, SOCK_STREAM, 0, error))
1219 _DBUS_ASSERT_ERROR_IS_SET(error);
1222 _DBUS_ASSERT_ERROR_IS_CLEAR(error);
1224 if (bind (fd, (struct sockaddr*) tmp->ai_addr, tmp->ai_addrlen) < 0)
1226 saved_errno = errno;
1227 _dbus_close(fd, NULL);
1228 if (saved_errno == EADDRINUSE)
1230 /* Depending on kernel policy, it may or may not
1231 be neccessary to bind to both IPv4 & 6 addresses
1232 so ignore EADDRINUSE here */
1236 dbus_set_error (error, _dbus_error_from_errno (saved_errno),
1237 "Failed to bind socket \"%s:%s\": %s",
1238 host ? host : "*", port, _dbus_strerror (saved_errno));
1242 if (listen (fd, 30 /* backlog */) < 0)
1244 saved_errno = errno;
1245 _dbus_close (fd, NULL);
1246 dbus_set_error (error, _dbus_error_from_errno (saved_errno),
1247 "Failed to listen on socket \"%s:%s\": %s",
1248 host ? host : "*", port, _dbus_strerror (saved_errno));
1252 newlisten_fd = dbus_realloc(listen_fd, sizeof(int)*(nlisten_fd+1));
1255 saved_errno = errno;
1256 _dbus_close (fd, NULL);
1257 dbus_set_error (error, _dbus_error_from_errno (saved_errno),
1258 "Failed to allocate file handle array: %s",
1259 _dbus_strerror (saved_errno));
1262 listen_fd = newlisten_fd;
1263 listen_fd[nlisten_fd] = fd;
1266 if (!_dbus_string_get_length(retport))
1268 /* If the user didn't specify a port, or used 0, then
1269 the kernel chooses a port. After the first address
1270 is bound to, we need to force all remaining addresses
1271 to use the same port */
1272 if (!port || !strcmp(port, "0"))
1274 struct sockaddr_storage addr;
1278 addrlen = sizeof(addr);
1279 getsockname(fd, (struct sockaddr*) &addr, &addrlen);
1281 if ((res = getnameinfo((struct sockaddr*)&addr, addrlen, NULL, 0,
1282 portbuf, sizeof(portbuf),
1283 NI_NUMERICHOST)) != 0)
1285 dbus_set_error (error, _dbus_error_from_errno (errno),
1286 "Failed to resolve port \"%s:%s\": %s (%s)",
1287 host ? host : "*", port, gai_strerror(res), res);
1290 if (!_dbus_string_append(retport, portbuf))
1292 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1296 /* Release current address list & redo lookup */
1297 port = _dbus_string_get_const_data(retport);
1299 goto redo_lookup_with_port;
1303 if (!_dbus_string_append(retport, port))
1305 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1319 dbus_set_error (error, _dbus_error_from_errno (errno),
1320 "Failed to bind socket \"%s:%s\": %s",
1321 host ? host : "*", port, _dbus_strerror (errno));
1325 for (i = 0 ; i < nlisten_fd ; i++)
1327 if (!_dbus_set_fd_nonblocking (listen_fd[i], error))
1340 for (i = 0 ; i < nlisten_fd ; i++)
1341 _dbus_close(listen_fd[i], NULL);
1342 dbus_free(listen_fd);
1347 write_credentials_byte (int server_fd,
1351 char buf[1] = { '\0' };
1352 #if defined(HAVE_CMSGCRED)
1355 char cred[CMSG_SPACE (sizeof (struct cmsgcred))];
1366 msg.msg_control = (caddr_t) &cmsg;
1367 msg.msg_controllen = CMSG_SPACE (sizeof (struct cmsgcred));
1369 cmsg.hdr.cmsg_len = CMSG_LEN (sizeof (struct cmsgcred));
1370 cmsg.hdr.cmsg_level = SOL_SOCKET;
1371 cmsg.hdr.cmsg_type = SCM_CREDS;
1374 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1378 #if defined(HAVE_CMSGCRED)
1379 bytes_written = sendmsg (server_fd, &msg, 0);
1381 bytes_written = write (server_fd, buf, 1);
1384 if (bytes_written < 0 && errno == EINTR)
1387 if (bytes_written < 0)
1389 dbus_set_error (error, _dbus_error_from_errno (errno),
1390 "Failed to write credentials byte: %s",
1391 _dbus_strerror (errno));
1394 else if (bytes_written == 0)
1396 dbus_set_error (error, DBUS_ERROR_IO_ERROR,
1397 "wrote zero bytes writing credentials byte");
1402 _dbus_assert (bytes_written == 1);
1403 _dbus_verbose ("wrote credentials byte\n");
1409 * Reads a single byte which must be nul (an error occurs otherwise),
1410 * and reads unix credentials if available. Clears the credentials
1411 * object, then adds pid/uid if available, so any previous credentials
1412 * stored in the object are lost.
1414 * Return value indicates whether a byte was read, not whether
1415 * we got valid credentials. On some systems, such as Linux,
1416 * reading/writing the byte isn't actually required, but we do it
1417 * anyway just to avoid multiple codepaths.
1419 * Fails if no byte is available, so you must select() first.
1421 * The point of the byte is that on some systems we have to
1422 * use sendmsg()/recvmsg() to transmit credentials.
1424 * @param client_fd the client file descriptor
1425 * @param credentials object to add client credentials to
1426 * @param error location to store error code
1427 * @returns #TRUE on success
1430 _dbus_read_credentials_socket (int client_fd,
1431 DBusCredentials *credentials,
1437 dbus_uid_t uid_read;
1438 dbus_pid_t pid_read;
1441 #ifdef HAVE_CMSGCRED
1444 char cred[CMSG_SPACE (sizeof (struct cmsgcred))];
1447 #elif defined(LOCAL_CREDS)
1450 struct sockcred cred;
1454 uid_read = DBUS_UID_UNSET;
1455 pid_read = DBUS_PID_UNSET;
1457 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1459 /* The POSIX spec certainly doesn't promise this, but
1460 * we need these assertions to fail as soon as we're wrong about
1461 * it so we can do the porting fixups
1463 _dbus_assert (sizeof (pid_t) <= sizeof (dbus_pid_t));
1464 _dbus_assert (sizeof (uid_t) <= sizeof (dbus_uid_t));
1465 _dbus_assert (sizeof (gid_t) <= sizeof (dbus_gid_t));
1467 _dbus_credentials_clear (credentials);
1469 /* Systems supporting LOCAL_CREDS are configured to have this feature
1470 * enabled (if it does not conflict with HAVE_CMSGCRED) prior accepting
1471 * the connection. Therefore, the received message must carry the
1472 * credentials information without doing anything special.
1475 iov.iov_base = &buf;
1482 #if defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS)
1484 msg.msg_control = (caddr_t) &cmsg;
1485 msg.msg_controllen = CMSG_SPACE (sizeof (struct cmsgcred));
1489 bytes_read = recvmsg (client_fd, &msg, 0);
1496 /* EAGAIN or EWOULDBLOCK would be unexpected here since we would
1497 * normally only call read_credentials if the socket was ready
1501 dbus_set_error (error, _dbus_error_from_errno (errno),
1502 "Failed to read credentials byte: %s",
1503 _dbus_strerror (errno));
1506 else if (bytes_read == 0)
1508 /* this should not happen unless we are using recvmsg wrong,
1509 * so is essentially here for paranoia
1511 dbus_set_error (error, DBUS_ERROR_FAILED,
1512 "Failed to read credentials byte (zero-length read)");
1515 else if (buf != '\0')
1517 dbus_set_error (error, DBUS_ERROR_FAILED,
1518 "Credentials byte was not nul");
1522 #if defined(HAVE_CMSGCRED) || defined(LOCAL_CREDS)
1523 if (cmsg.hdr.cmsg_len < CMSG_LEN (sizeof (struct cmsgcred))
1524 || cmsg.hdr.cmsg_type != SCM_CREDS)
1526 dbus_set_error (error, DBUS_ERROR_FAILED,
1527 "Message from recvmsg() was not SCM_CREDS");
1532 _dbus_verbose ("read credentials byte\n");
1537 int cr_len = sizeof (cr);
1539 if (getsockopt (client_fd, SOL_SOCKET, SO_PEERCRED, &cr, &cr_len) == 0 &&
1540 cr_len == sizeof (cr))
1547 _dbus_verbose ("Failed to getsockopt() credentials, returned len %d/%d: %s\n",
1548 cr_len, (int) sizeof (cr), _dbus_strerror (errno));
1550 #elif defined(HAVE_CMSGCRED)
1551 struct cmsgcred *cred;
1553 cred = (struct cmsgcred *) CMSG_DATA (&cmsg.hdr);
1554 pid_read = cred->cmcred_pid;
1555 uid_read = cred->cmcred_euid;
1556 #elif defined(LOCAL_CREDS)
1557 pid_read = DBUS_PID_UNSET;
1558 uid_read = cmsg.cred.sc_uid;
1559 /* Since we have already got the credentials from this socket, we can
1560 * disable its LOCAL_CREDS flag if it was ever set. */
1561 _dbus_set_local_creds (client_fd, FALSE);
1562 #elif defined(HAVE_GETPEEREID)
1565 if (getpeereid (client_fd, &euid, &egid) == 0)
1571 _dbus_verbose ("Failed to getpeereid() credentials: %s\n", _dbus_strerror (errno));
1573 #elif defined(HAVE_GETPEERUCRED)
1574 ucred_t * ucred = NULL;
1575 if (getpeerucred (client_fd, &ucred) == 0)
1577 pid_read = ucred_getpid (ucred);
1578 uid_read = ucred_geteuid (ucred);
1580 /* generate audit session data based on socket ucred */
1581 adt_session_data_t *adth = NULL;
1582 adt_export_data_t *data = NULL;
1584 if (adt_start_session (&adth, NULL, 0) || (adth == NULL))
1586 _dbus_verbose ("Failed to adt_start_session(): %s\n", _dbus_strerror (errno));
1590 if (adt_set_from_ucred (adth, ucred, ADT_NEW))
1592 _dbus_verbose ("Failed to adt_set_from_ucred(): %s\n", _dbus_strerror (errno));
1596 size = adt_export_session_data (adth, &data);
1599 _dbus_verbose ("Failed to adt_export_session_data(): %s\n", _dbus_strerror (errno));
1603 _dbus_credentials_add_adt_audit_data (credentials, data, size);
1607 (void) adt_end_session (adth);
1609 #endif /* HAVE_ADT */
1613 _dbus_verbose ("Failed to getpeerucred() credentials: %s\n", _dbus_strerror (errno));
1617 #else /* !SO_PEERCRED && !HAVE_CMSGCRED && !HAVE_GETPEEREID && !HAVE_GETPEERUCRED */
1618 _dbus_verbose ("Socket credentials not supported on this OS\n");
1622 _dbus_verbose ("Credentials:"
1623 " pid "DBUS_PID_FORMAT
1624 " uid "DBUS_UID_FORMAT
1629 if (pid_read != DBUS_PID_UNSET)
1631 if (!_dbus_credentials_add_unix_pid (credentials, pid_read))
1633 _DBUS_SET_OOM (error);
1638 if (uid_read != DBUS_UID_UNSET)
1640 if (!_dbus_credentials_add_unix_uid (credentials, uid_read))
1642 _DBUS_SET_OOM (error);
1651 * Sends a single nul byte with our UNIX credentials as ancillary
1652 * data. Returns #TRUE if the data was successfully written. On
1653 * systems that don't support sending credentials, just writes a byte,
1654 * doesn't send any credentials. On some systems, such as Linux,
1655 * reading/writing the byte isn't actually required, but we do it
1656 * anyway just to avoid multiple codepaths.
1658 * Fails if no byte can be written, so you must select() first.
1660 * The point of the byte is that on some systems we have to
1661 * use sendmsg()/recvmsg() to transmit credentials.
1663 * @param server_fd file descriptor for connection to server
1664 * @param error return location for error code
1665 * @returns #TRUE if the byte was sent
1668 _dbus_send_credentials_socket (int server_fd,
1671 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1673 if (write_credentials_byte (server_fd, error))
1680 * Accepts a connection on a listening socket.
1681 * Handles EINTR for you.
1683 * This will enable FD_CLOEXEC for the returned socket.
1685 * @param listen_fd the listen file descriptor
1686 * @returns the connection fd of the client, or -1 on error
1689 _dbus_accept (int listen_fd)
1692 struct sockaddr addr;
1695 dbus_bool_t cloexec_done;
1698 addrlen = sizeof (addr);
1703 /* We assume that if accept4 is available SOCK_CLOEXEC is too */
1704 client_fd = accept4 (listen_fd, &addr, &addrlen, SOCK_CLOEXEC);
1705 cloexec_done = client_fd >= 0;
1707 if (client_fd < 0 && errno == ENOSYS)
1710 client_fd = accept (listen_fd, &addr, &addrlen);
1719 _dbus_verbose ("client fd %d accepted\n", client_fd);
1725 _dbus_fd_set_close_on_exec(client_fd);
1732 * Checks to make sure the given directory is
1733 * private to the user
1735 * @param dir the name of the directory
1736 * @param error error return
1737 * @returns #FALSE on failure
1740 _dbus_check_dir_is_private_to_user (DBusString *dir, DBusError *error)
1742 const char *directory;
1745 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1747 directory = _dbus_string_get_const_data (dir);
1749 if (stat (directory, &sb) < 0)
1751 dbus_set_error (error, _dbus_error_from_errno (errno),
1752 "%s", _dbus_strerror (errno));
1757 if ((S_IROTH & sb.st_mode) || (S_IWOTH & sb.st_mode) ||
1758 (S_IRGRP & sb.st_mode) || (S_IWGRP & sb.st_mode))
1760 dbus_set_error (error, DBUS_ERROR_FAILED,
1761 "%s directory is not private to the user", directory);
1769 fill_user_info_from_passwd (struct passwd *p,
1773 _dbus_assert (p->pw_name != NULL);
1774 _dbus_assert (p->pw_dir != NULL);
1776 info->uid = p->pw_uid;
1777 info->primary_gid = p->pw_gid;
1778 info->username = _dbus_strdup (p->pw_name);
1779 info->homedir = _dbus_strdup (p->pw_dir);
1781 if (info->username == NULL ||
1782 info->homedir == NULL)
1784 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1792 fill_user_info (DBusUserInfo *info,
1794 const DBusString *username,
1797 const char *username_c;
1799 /* exactly one of username/uid provided */
1800 _dbus_assert (username != NULL || uid != DBUS_UID_UNSET);
1801 _dbus_assert (username == NULL || uid == DBUS_UID_UNSET);
1803 info->uid = DBUS_UID_UNSET;
1804 info->primary_gid = DBUS_GID_UNSET;
1805 info->group_ids = NULL;
1806 info->n_group_ids = 0;
1807 info->username = NULL;
1808 info->homedir = NULL;
1810 if (username != NULL)
1811 username_c = _dbus_string_get_const_data (username);
1815 /* For now assuming that the getpwnam() and getpwuid() flavors
1816 * are always symmetrical, if not we have to add more configure
1820 #if defined (HAVE_POSIX_GETPWNAM_R) || defined (HAVE_NONPOSIX_GETPWNAM_R)
1826 struct passwd p_str;
1828 /* retrieve maximum needed size for buf */
1829 buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
1831 /* sysconf actually returns a long, but everything else expects size_t,
1832 * so just recast here.
1833 * https://bugs.freedesktop.org/show_bug.cgi?id=17061
1835 if ((long) buflen <= 0)
1841 buf = dbus_malloc (buflen);
1844 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1849 #ifdef HAVE_POSIX_GETPWNAM_R
1850 if (uid != DBUS_UID_UNSET)
1851 result = getpwuid_r (uid, &p_str, buf, buflen,
1854 result = getpwnam_r (username_c, &p_str, buf, buflen,
1857 if (uid != DBUS_UID_UNSET)
1858 p = getpwuid_r (uid, &p_str, buf, buflen);
1860 p = getpwnam_r (username_c, &p_str, buf, buflen);
1862 #endif /* !HAVE_POSIX_GETPWNAM_R */
1863 //Try a bigger buffer if ERANGE was returned
1864 if (result == ERANGE && buflen < 512 * 1024)
1874 if (result == 0 && p == &p_str)
1876 if (!fill_user_info_from_passwd (p, info, error))
1885 dbus_set_error (error, _dbus_error_from_errno (errno),
1886 "User \"%s\" unknown or no memory to allocate password entry\n",
1887 username_c ? username_c : "???");
1888 _dbus_verbose ("User %s unknown\n", username_c ? username_c : "???");
1893 #else /* ! HAVE_GETPWNAM_R */
1895 /* I guess we're screwed on thread safety here */
1898 if (uid != DBUS_UID_UNSET)
1901 p = getpwnam (username_c);
1905 if (!fill_user_info_from_passwd (p, info, error))
1912 dbus_set_error (error, _dbus_error_from_errno (errno),
1913 "User \"%s\" unknown or no memory to allocate password entry\n",
1914 username_c ? username_c : "???");
1915 _dbus_verbose ("User %s unknown\n", username_c ? username_c : "???");
1919 #endif /* ! HAVE_GETPWNAM_R */
1921 /* Fill this in so we can use it to get groups */
1922 username_c = info->username;
1924 #ifdef HAVE_GETGROUPLIST
1929 int initial_buf_count;
1931 initial_buf_count = 17;
1932 buf_count = initial_buf_count;
1933 buf = dbus_new (gid_t, buf_count);
1936 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1940 if (getgrouplist (username_c,
1942 buf, &buf_count) < 0)
1945 /* Presumed cause of negative return code: buf has insufficient
1946 entries to hold the entire group list. The Linux behavior in this
1947 case is to pass back the actual number of groups in buf_count, but
1948 on Mac OS X 10.5, buf_count is unhelpfully left alone.
1949 So as a hack, try to help out a bit by guessing a larger
1950 number of groups, within reason.. might still fail, of course,
1951 but we can at least print a more informative message. I looked up
1952 the "right way" to do this by downloading Apple's own source code
1953 for the "id" command, and it turns out that they use an
1954 undocumented library function getgrouplist_2 (!) which is not
1955 declared in any header in /usr/include (!!). That did not seem
1956 like the way to go here.
1958 if (buf_count == initial_buf_count)
1960 buf_count *= 16; /* Retry with an arbitrarily scaled-up array */
1962 new = dbus_realloc (buf, buf_count * sizeof (buf[0]));
1965 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
1973 if (getgrouplist (username_c, info->primary_gid, buf, &buf_count) < 0)
1977 _dbus_warn ("It appears that username \"%s\" is in more than %d groups.\nProceeding with just the first %d groups.",
1978 username_c, buf_count, buf_count);
1982 dbus_set_error (error,
1983 _dbus_error_from_errno (errno),
1984 "Failed to get groups for username \"%s\" primary GID "
1985 DBUS_GID_FORMAT ": %s\n",
1986 username_c, info->primary_gid,
1987 _dbus_strerror (errno));
1994 info->group_ids = dbus_new (dbus_gid_t, buf_count);
1995 if (info->group_ids == NULL)
1997 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
2002 for (i = 0; i < buf_count; ++i)
2003 info->group_ids[i] = buf[i];
2005 info->n_group_ids = buf_count;
2009 #else /* HAVE_GETGROUPLIST */
2011 /* We just get the one group ID */
2012 info->group_ids = dbus_new (dbus_gid_t, 1);
2013 if (info->group_ids == NULL)
2015 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
2019 info->n_group_ids = 1;
2021 (info->group_ids)[0] = info->primary_gid;
2023 #endif /* HAVE_GETGROUPLIST */
2025 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2030 _DBUS_ASSERT_ERROR_IS_SET (error);
2035 * Gets user info for the given username.
2037 * @param info user info object to initialize
2038 * @param username the username
2039 * @param error error return
2040 * @returns #TRUE on success
2043 _dbus_user_info_fill (DBusUserInfo *info,
2044 const DBusString *username,
2047 return fill_user_info (info, DBUS_UID_UNSET,
2052 * Gets user info for the given user ID.
2054 * @param info user info object to initialize
2055 * @param uid the user ID
2056 * @param error error return
2057 * @returns #TRUE on success
2060 _dbus_user_info_fill_uid (DBusUserInfo *info,
2064 return fill_user_info (info, uid,
2069 * Adds the credentials of the current process to the
2070 * passed-in credentials object.
2072 * @param credentials credentials to add to
2073 * @returns #FALSE if no memory; does not properly roll back on failure, so only some credentials may have been added
2076 _dbus_credentials_add_from_current_process (DBusCredentials *credentials)
2078 /* The POSIX spec certainly doesn't promise this, but
2079 * we need these assertions to fail as soon as we're wrong about
2080 * it so we can do the porting fixups
2082 _dbus_assert (sizeof (pid_t) <= sizeof (dbus_pid_t));
2083 _dbus_assert (sizeof (uid_t) <= sizeof (dbus_uid_t));
2084 _dbus_assert (sizeof (gid_t) <= sizeof (dbus_gid_t));
2086 if (!_dbus_credentials_add_unix_pid(credentials, _dbus_getpid()))
2088 if (!_dbus_credentials_add_unix_uid(credentials, _dbus_geteuid()))
2095 * Append to the string the identity we would like to have when we
2096 * authenticate, on UNIX this is the current process UID and on
2097 * Windows something else, probably a Windows SID string. No escaping
2098 * is required, that is done in dbus-auth.c. The username here
2099 * need not be anything human-readable, it can be the machine-readable
2100 * form i.e. a user id.
2102 * @param str the string to append to
2103 * @returns #FALSE on no memory
2106 _dbus_append_user_from_current_process (DBusString *str)
2108 return _dbus_string_append_uint (str,
2113 * Gets our process ID
2114 * @returns process ID
2123 * @returns process UID
2131 /** Gets our effective UID
2132 * @returns process effective UID
2135 _dbus_geteuid (void)
2141 * The only reason this is separate from _dbus_getpid() is to allow it
2142 * on Windows for logging but not for other purposes.
2144 * @returns process ID to put in log messages
2147 _dbus_pid_for_log (void)
2153 * Gets a UID from a UID string.
2155 * @param uid_str the UID in string form
2156 * @param uid UID to fill in
2157 * @returns #TRUE if successfully filled in UID
2160 _dbus_parse_uid (const DBusString *uid_str,
2166 if (_dbus_string_get_length (uid_str) == 0)
2168 _dbus_verbose ("UID string was zero length\n");
2174 if (!_dbus_string_parse_int (uid_str, 0, &val,
2177 _dbus_verbose ("could not parse string as a UID\n");
2181 if (end != _dbus_string_get_length (uid_str))
2183 _dbus_verbose ("string contained trailing stuff after UID\n");
2193 _DBUS_DEFINE_GLOBAL_LOCK (atomic);
2197 * Atomically increments an integer
2199 * @param atomic pointer to the integer to increment
2200 * @returns the value before incrementing
2203 _dbus_atomic_inc (DBusAtomic *atomic)
2206 return __sync_add_and_fetch(&atomic->value, 1)-1;
2209 _DBUS_LOCK (atomic);
2210 res = atomic->value;
2212 _DBUS_UNLOCK (atomic);
2218 * Atomically decrement an integer
2220 * @param atomic pointer to the integer to decrement
2221 * @returns the value before decrementing
2224 _dbus_atomic_dec (DBusAtomic *atomic)
2227 return __sync_sub_and_fetch(&atomic->value, 1)+1;
2231 _DBUS_LOCK (atomic);
2232 res = atomic->value;
2234 _DBUS_UNLOCK (atomic);
2239 #ifdef DBUS_BUILD_TESTS
2241 * @returns process GID
2251 * Wrapper for poll().
2253 * @param fds the file descriptors to poll
2254 * @param n_fds number of descriptors in the array
2255 * @param timeout_milliseconds timeout or -1 for infinite
2256 * @returns numbers of fds with revents, or <0 on error
2259 _dbus_poll (DBusPollFD *fds,
2261 int timeout_milliseconds)
2263 #if defined(HAVE_POLL) && !defined(BROKEN_POLL)
2264 /* This big thing is a constant expression and should get optimized
2265 * out of existence. So it's more robust than a configure check at
2268 if (_DBUS_POLLIN == POLLIN &&
2269 _DBUS_POLLPRI == POLLPRI &&
2270 _DBUS_POLLOUT == POLLOUT &&
2271 _DBUS_POLLERR == POLLERR &&
2272 _DBUS_POLLHUP == POLLHUP &&
2273 _DBUS_POLLNVAL == POLLNVAL &&
2274 sizeof (DBusPollFD) == sizeof (struct pollfd) &&
2275 _DBUS_STRUCT_OFFSET (DBusPollFD, fd) ==
2276 _DBUS_STRUCT_OFFSET (struct pollfd, fd) &&
2277 _DBUS_STRUCT_OFFSET (DBusPollFD, events) ==
2278 _DBUS_STRUCT_OFFSET (struct pollfd, events) &&
2279 _DBUS_STRUCT_OFFSET (DBusPollFD, revents) ==
2280 _DBUS_STRUCT_OFFSET (struct pollfd, revents))
2282 return poll ((struct pollfd*) fds,
2284 timeout_milliseconds);
2288 /* We have to convert the DBusPollFD to an array of
2289 * struct pollfd, poll, and convert back.
2291 _dbus_warn ("didn't implement poll() properly for this system yet\n");
2294 #else /* ! HAVE_POLL */
2296 fd_set read_set, write_set, err_set;
2302 FD_ZERO (&read_set);
2303 FD_ZERO (&write_set);
2306 for (i = 0; i < n_fds; i++)
2308 DBusPollFD *fdp = &fds[i];
2310 if (fdp->events & _DBUS_POLLIN)
2311 FD_SET (fdp->fd, &read_set);
2313 if (fdp->events & _DBUS_POLLOUT)
2314 FD_SET (fdp->fd, &write_set);
2316 FD_SET (fdp->fd, &err_set);
2318 max_fd = MAX (max_fd, fdp->fd);
2321 tv.tv_sec = timeout_milliseconds / 1000;
2322 tv.tv_usec = (timeout_milliseconds % 1000) * 1000;
2324 ready = select (max_fd + 1, &read_set, &write_set, &err_set,
2325 timeout_milliseconds < 0 ? NULL : &tv);
2329 for (i = 0; i < n_fds; i++)
2331 DBusPollFD *fdp = &fds[i];
2335 if (FD_ISSET (fdp->fd, &read_set))
2336 fdp->revents |= _DBUS_POLLIN;
2338 if (FD_ISSET (fdp->fd, &write_set))
2339 fdp->revents |= _DBUS_POLLOUT;
2341 if (FD_ISSET (fdp->fd, &err_set))
2342 fdp->revents |= _DBUS_POLLERR;
2351 * Get current time, as in gettimeofday(). Use the monotonic clock if
2352 * available, to avoid problems when the system time changes.
2354 * @param tv_sec return location for number of seconds
2355 * @param tv_usec return location for number of microseconds (thousandths)
2358 _dbus_get_current_time (long *tv_sec,
2363 #ifdef HAVE_MONOTONIC_CLOCK
2365 clock_gettime (CLOCK_MONOTONIC, &ts);
2368 *tv_sec = ts.tv_sec;
2370 *tv_usec = ts.tv_nsec / 1000;
2372 gettimeofday (&t, NULL);
2377 *tv_usec = t.tv_usec;
2382 * Creates a directory; succeeds if the directory
2383 * is created or already existed.
2385 * @param filename directory filename
2386 * @param error initialized error object
2387 * @returns #TRUE on success
2390 _dbus_create_directory (const DBusString *filename,
2393 const char *filename_c;
2395 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2397 filename_c = _dbus_string_get_const_data (filename);
2399 if (mkdir (filename_c, 0700) < 0)
2401 if (errno == EEXIST)
2404 dbus_set_error (error, DBUS_ERROR_FAILED,
2405 "Failed to create directory %s: %s\n",
2406 filename_c, _dbus_strerror (errno));
2414 * Appends the given filename to the given directory.
2416 * @todo it might be cute to collapse multiple '/' such as "foo//"
2419 * @param dir the directory name
2420 * @param next_component the filename
2421 * @returns #TRUE on success
2424 _dbus_concat_dir_and_file (DBusString *dir,
2425 const DBusString *next_component)
2427 dbus_bool_t dir_ends_in_slash;
2428 dbus_bool_t file_starts_with_slash;
2430 if (_dbus_string_get_length (dir) == 0 ||
2431 _dbus_string_get_length (next_component) == 0)
2434 dir_ends_in_slash = '/' == _dbus_string_get_byte (dir,
2435 _dbus_string_get_length (dir) - 1);
2437 file_starts_with_slash = '/' == _dbus_string_get_byte (next_component, 0);
2439 if (dir_ends_in_slash && file_starts_with_slash)
2441 _dbus_string_shorten (dir, 1);
2443 else if (!(dir_ends_in_slash || file_starts_with_slash))
2445 if (!_dbus_string_append_byte (dir, '/'))
2449 return _dbus_string_copy (next_component, 0, dir,
2450 _dbus_string_get_length (dir));
2453 /** nanoseconds in a second */
2454 #define NANOSECONDS_PER_SECOND 1000000000
2455 /** microseconds in a second */
2456 #define MICROSECONDS_PER_SECOND 1000000
2457 /** milliseconds in a second */
2458 #define MILLISECONDS_PER_SECOND 1000
2459 /** nanoseconds in a millisecond */
2460 #define NANOSECONDS_PER_MILLISECOND 1000000
2461 /** microseconds in a millisecond */
2462 #define MICROSECONDS_PER_MILLISECOND 1000
2465 * Sleeps the given number of milliseconds.
2466 * @param milliseconds number of milliseconds
2469 _dbus_sleep_milliseconds (int milliseconds)
2471 #ifdef HAVE_NANOSLEEP
2472 struct timespec req;
2473 struct timespec rem;
2475 req.tv_sec = milliseconds / MILLISECONDS_PER_SECOND;
2476 req.tv_nsec = (milliseconds % MILLISECONDS_PER_SECOND) * NANOSECONDS_PER_MILLISECOND;
2480 while (nanosleep (&req, &rem) < 0 && errno == EINTR)
2482 #elif defined (HAVE_USLEEP)
2483 usleep (milliseconds * MICROSECONDS_PER_MILLISECOND);
2484 #else /* ! HAVE_USLEEP */
2485 sleep (MAX (milliseconds / 1000, 1));
2490 _dbus_generate_pseudorandom_bytes (DBusString *str,
2496 old_len = _dbus_string_get_length (str);
2498 if (!_dbus_string_lengthen (str, n_bytes))
2501 p = _dbus_string_get_data_len (str, old_len, n_bytes);
2503 _dbus_generate_pseudorandom_bytes_buffer (p, n_bytes);
2509 * Generates the given number of random bytes,
2510 * using the best mechanism we can come up with.
2512 * @param str the string
2513 * @param n_bytes the number of random bytes to append to string
2514 * @returns #TRUE on success, #FALSE if no memory
2517 _dbus_generate_random_bytes (DBusString *str,
2523 /* FALSE return means "no memory", if it could
2524 * mean something else then we'd need to return
2525 * a DBusError. So we always fall back to pseudorandom
2529 old_len = _dbus_string_get_length (str);
2532 /* note, urandom on linux will fall back to pseudorandom */
2533 fd = open ("/dev/urandom", O_RDONLY);
2535 return _dbus_generate_pseudorandom_bytes (str, n_bytes);
2537 _dbus_verbose ("/dev/urandom fd %d opened\n", fd);
2539 if (_dbus_read (fd, str, n_bytes) != n_bytes)
2541 _dbus_close (fd, NULL);
2542 _dbus_string_set_length (str, old_len);
2543 return _dbus_generate_pseudorandom_bytes (str, n_bytes);
2546 _dbus_verbose ("Read %d bytes from /dev/urandom\n",
2549 _dbus_close (fd, NULL);
2555 * Exit the process, returning the given value.
2557 * @param code the exit code
2560 _dbus_exit (int code)
2566 * A wrapper around strerror() because some platforms
2567 * may be lame and not have strerror(). Also, never
2570 * @param error_number errno.
2571 * @returns error description.
2574 _dbus_strerror (int error_number)
2578 msg = strerror (error_number);
2586 * signal (SIGPIPE, SIG_IGN);
2589 _dbus_disable_sigpipe (void)
2591 signal (SIGPIPE, SIG_IGN);
2595 * Sets the file descriptor to be close
2596 * on exec. Should be called for all file
2597 * descriptors in D-Bus code.
2599 * @param fd the file descriptor
2602 _dbus_fd_set_close_on_exec (int fd)
2606 val = fcntl (fd, F_GETFD, 0);
2613 fcntl (fd, F_SETFD, val);
2617 * Closes a file descriptor.
2619 * @param fd the file descriptor
2620 * @param error error object
2621 * @returns #FALSE if error set
2624 _dbus_close (int fd,
2627 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2635 dbus_set_error (error, _dbus_error_from_errno (errno),
2636 "Could not close fd %d", fd);
2644 * Duplicates a file descriptor. Makes sure the fd returned is >= 3
2645 * (i.e. avoids stdin/stdout/stderr). Sets O_CLOEXEC.
2647 * @param fd the file descriptor to duplicate
2648 * @returns duplicated file descriptor
2656 #ifdef F_DUPFD_CLOEXEC
2657 dbus_bool_t cloexec_done;
2659 new_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3);
2660 cloexec_done = new_fd >= 0;
2662 if (new_fd < 0 && errno == EINVAL)
2665 new_fd = fcntl(fd, F_DUPFD, 3);
2670 dbus_set_error (error, _dbus_error_from_errno (errno),
2671 "Could not duplicate fd %d", fd);
2675 #ifdef F_DUPFD_CLOEXEC
2679 _dbus_fd_set_close_on_exec(new_fd);
2686 * Sets a file descriptor to be nonblocking.
2688 * @param fd the file descriptor.
2689 * @param error address of error location.
2690 * @returns #TRUE on success.
2693 _dbus_set_fd_nonblocking (int fd,
2698 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2700 val = fcntl (fd, F_GETFL, 0);
2703 dbus_set_error (error, _dbus_error_from_errno (errno),
2704 "Failed to get flags from file descriptor %d: %s",
2705 fd, _dbus_strerror (errno));
2706 _dbus_verbose ("Failed to get flags for fd %d: %s\n", fd,
2707 _dbus_strerror (errno));
2711 if (fcntl (fd, F_SETFL, val | O_NONBLOCK) < 0)
2713 dbus_set_error (error, _dbus_error_from_errno (errno),
2714 "Failed to set nonblocking flag of file descriptor %d: %s",
2715 fd, _dbus_strerror (errno));
2716 _dbus_verbose ("Failed to set fd %d nonblocking: %s\n",
2717 fd, _dbus_strerror (errno));
2726 * On GNU libc systems, print a crude backtrace to stderr. On other
2727 * systems, print "no backtrace support" and block for possible gdb
2728 * attachment if an appropriate environment variable is set.
2731 _dbus_print_backtrace (void)
2733 #if defined (HAVE_BACKTRACE) && defined (DBUS_BUILT_R_DYNAMIC)
2739 bt_size = backtrace (bt, 500);
2741 syms = backtrace_symbols (bt, bt_size);
2746 /* don't use dbus_warn since it can _dbus_abort() */
2747 fprintf (stderr, " %s\n", syms[i]);
2753 #elif defined (HAVE_BACKTRACE) && ! defined (DBUS_BUILT_R_DYNAMIC)
2754 fprintf (stderr, " D-Bus not built with -rdynamic so unable to print a backtrace\n");
2756 fprintf (stderr, " D-Bus not compiled with backtrace support so unable to print a backtrace\n");
2761 * Creates a full-duplex pipe (as in socketpair()).
2762 * Sets both ends of the pipe nonblocking.
2764 * Marks both file descriptors as close-on-exec
2766 * @todo libdbus only uses this for the debug-pipe server, so in
2767 * principle it could be in dbus-sysdeps-util.c, except that
2768 * dbus-sysdeps-util.c isn't in libdbus when tests are enabled and the
2769 * debug-pipe server is used.
2771 * @param fd1 return location for one end
2772 * @param fd2 return location for the other end
2773 * @param blocking #TRUE if pipe should be blocking
2774 * @param error error return
2775 * @returns #FALSE on failure (if error is set)
2778 _dbus_full_duplex_pipe (int *fd1,
2780 dbus_bool_t blocking,
2783 #ifdef HAVE_SOCKETPAIR
2788 dbus_bool_t cloexec_done;
2790 retval = socketpair(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0, fds);
2791 cloexec_done = retval >= 0;
2793 if (retval < 0 && errno == EINVAL)
2796 retval = socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
2801 dbus_set_error (error, _dbus_error_from_errno (errno),
2802 "Could not create full-duplex pipe");
2806 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2812 _dbus_fd_set_close_on_exec (fds[0]);
2813 _dbus_fd_set_close_on_exec (fds[1]);
2817 (!_dbus_set_fd_nonblocking (fds[0], NULL) ||
2818 !_dbus_set_fd_nonblocking (fds[1], NULL)))
2820 dbus_set_error (error, _dbus_error_from_errno (errno),
2821 "Could not set full-duplex pipe nonblocking");
2823 _dbus_close (fds[0], NULL);
2824 _dbus_close (fds[1], NULL);
2832 _dbus_verbose ("full-duplex pipe %d <-> %d\n",
2837 _dbus_warn ("_dbus_full_duplex_pipe() not implemented on this OS\n");
2838 dbus_set_error (error, DBUS_ERROR_FAILED,
2839 "_dbus_full_duplex_pipe() not implemented on this OS");
2845 * Measure the length of the given format string and arguments,
2846 * not including the terminating nul.
2848 * @param format a printf-style format string
2849 * @param args arguments for the format string
2850 * @returns length of the given format string and args
2853 _dbus_printf_string_upper_bound (const char *format,
2857 return vsnprintf (&c, 1, format, args);
2861 * Gets the temporary files directory by inspecting the environment variables
2862 * TMPDIR, TMP, and TEMP in that order. If none of those are set "/tmp" is returned
2864 * @returns location of temp directory
2867 _dbus_get_tmpdir(void)
2869 static const char* tmpdir = NULL;
2873 /* TMPDIR is what glibc uses, then
2874 * glibc falls back to the P_tmpdir macro which
2875 * just expands to "/tmp"
2878 tmpdir = getenv("TMPDIR");
2880 /* These two env variables are probably
2881 * broken, but maybe some OS uses them?
2884 tmpdir = getenv("TMP");
2886 tmpdir = getenv("TEMP");
2888 /* And this is the sane fallback. */
2893 _dbus_assert(tmpdir != NULL);
2899 * Execute a subprocess, returning up to 1024 bytes of output
2902 * If successful, returns #TRUE and appends the output to @p
2903 * result. If a failure happens, returns #FALSE and
2904 * sets an error in @p error.
2906 * @note It's not an error if the subprocess terminates normally
2907 * without writing any data to stdout. Verify the @p result length
2908 * before and after this function call to cover this case.
2910 * @param progname initial path to exec (may or may not be absolute)
2911 * @param path_fallback if %TRUE, search PATH for executable
2912 * @param argv NULL-terminated list of arguments
2913 * @param result a DBusString where the output can be append
2914 * @param error a DBusError to store the error in case of failure
2915 * @returns #TRUE on success, #FALSE if an error happened
2918 _read_subprocess_line_argv (const char *progpath,
2919 dbus_bool_t path_fallback,
2924 int result_pipe[2] = { -1, -1 };
2925 int errors_pipe[2] = { -1, -1 };
2933 sigset_t new_set, old_set;
2935 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
2938 /* We need to block any existing handlers for SIGCHLD temporarily; they
2939 * will cause waitpid() below to fail.
2940 * https://bugs.freedesktop.org/show_bug.cgi?id=21347
2942 sigemptyset (&new_set);
2943 sigaddset (&new_set, SIGCHLD);
2944 sigprocmask (SIG_BLOCK, &new_set, &old_set);
2946 orig_len = _dbus_string_get_length (result);
2950 if (pipe (result_pipe) < 0)
2952 dbus_set_error (error, _dbus_error_from_errno (errno),
2953 "Failed to create a pipe to call %s: %s",
2954 progpath, _dbus_strerror (errno));
2955 _dbus_verbose ("Failed to create a pipe to call %s: %s\n",
2956 progpath, _dbus_strerror (errno));
2959 if (pipe (errors_pipe) < 0)
2961 dbus_set_error (error, _dbus_error_from_errno (errno),
2962 "Failed to create a pipe to call %s: %s",
2963 progpath, _dbus_strerror (errno));
2964 _dbus_verbose ("Failed to create a pipe to call %s: %s\n",
2965 progpath, _dbus_strerror (errno));
2972 dbus_set_error (error, _dbus_error_from_errno (errno),
2973 "Failed to fork() to call %s: %s",
2974 progpath, _dbus_strerror (errno));
2975 _dbus_verbose ("Failed to fork() to call %s: %s\n",
2976 progpath, _dbus_strerror (errno));
2986 fd = open ("/dev/null", O_RDWR);
2988 /* huh?! can't open /dev/null? */
2991 _dbus_verbose ("/dev/null fd %d opened\n", fd);
2994 close (result_pipe[READ_END]);
2995 close (errors_pipe[READ_END]);
2996 close (0); /* close stdin */
2997 close (1); /* close stdout */
2998 close (2); /* close stderr */
3000 if (dup2 (fd, 0) == -1)
3002 if (dup2 (result_pipe[WRITE_END], 1) == -1)
3004 if (dup2 (errors_pipe[WRITE_END], 2) == -1)
3007 maxfds = sysconf (_SC_OPEN_MAX);
3008 /* Pick something reasonable if for some reason sysconf
3013 /* close all inherited fds */
3014 for (i = 3; i < maxfds; i++)
3017 sigprocmask (SIG_SETMASK, &old_set, NULL);
3019 /* If it looks fully-qualified, try execv first */
3020 if (progpath[0] == '/')
3022 execv (progpath, argv);
3023 /* Ok, that failed. Now if path_fallback is given, let's
3024 * try unqualified. This is mostly a hack to work
3025 * around systems which ship dbus-launch in /usr/bin
3026 * but everything else in /bin (because dbus-launch
3030 /* We must have a slash, because we checked above */
3031 execvp (strrchr (progpath, '/')+1, argv);
3034 execvp (progpath, argv);
3036 /* still nothing, we failed */
3040 /* parent process */
3041 close (result_pipe[WRITE_END]);
3042 close (errors_pipe[WRITE_END]);
3043 result_pipe[WRITE_END] = -1;
3044 errors_pipe[WRITE_END] = -1;
3049 ret = _dbus_read (result_pipe[READ_END], result, 1024);
3053 /* reap the child process to avoid it lingering as zombie */
3056 ret = waitpid (pid, &status, 0);
3058 while (ret == -1 && errno == EINTR);
3060 /* We succeeded if the process exited with status 0 and
3061 anything was read */
3062 if (!WIFEXITED (status) || WEXITSTATUS (status) != 0 )
3064 /* The process ended with error */
3065 DBusString error_message;
3066 _dbus_string_init (&error_message);
3070 ret = _dbus_read (errors_pipe[READ_END], &error_message, 1024);
3074 _dbus_string_set_length (result, orig_len);
3075 if (_dbus_string_get_length (&error_message) > 0)
3076 dbus_set_error (error, DBUS_ERROR_SPAWN_EXEC_FAILED,
3077 "%s terminated abnormally with the following error: %s",
3078 progpath, _dbus_string_get_data (&error_message));
3080 dbus_set_error (error, DBUS_ERROR_SPAWN_EXEC_FAILED,
3081 "%s terminated abnormally without any error message",
3089 sigprocmask (SIG_SETMASK, &old_set, NULL);
3092 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3094 _DBUS_ASSERT_ERROR_IS_SET (error);
3096 if (result_pipe[0] != -1)
3097 close (result_pipe[0]);
3098 if (result_pipe[1] != -1)
3099 close (result_pipe[1]);
3100 if (errors_pipe[0] != -1)
3101 close (errors_pipe[0]);
3102 if (errors_pipe[1] != -1)
3103 close (errors_pipe[1]);
3109 * Returns the address of a new session bus.
3111 * If successful, returns #TRUE and appends the address to @p
3112 * address. If a failure happens, returns #FALSE and
3113 * sets an error in @p error.
3115 * @param address a DBusString where the address can be stored
3116 * @param error a DBusError to store the error in case of failure
3117 * @returns #TRUE on success, #FALSE if an error happened
3120 _dbus_get_autolaunch_address (DBusString *address,
3123 static char *argv[6];
3128 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3131 if (!_dbus_string_init (&uuid))
3133 _DBUS_SET_OOM (error);
3137 if (!_dbus_get_local_machine_uuid_encoded (&uuid))
3139 _DBUS_SET_OOM (error);
3144 argv[i] = "dbus-launch";
3146 argv[i] = "--autolaunch";
3148 argv[i] = _dbus_string_get_data (&uuid);
3150 argv[i] = "--binary-syntax";
3152 argv[i] = "--close-stderr";
3157 _dbus_assert (i == _DBUS_N_ELEMENTS (argv));
3159 retval = _read_subprocess_line_argv (DBUS_BINDIR "/dbus-launch",
3161 argv, address, error);
3164 _dbus_string_free (&uuid);
3169 * Reads the uuid of the machine we're running on from
3170 * the dbus configuration. Optionally try to create it
3171 * (only root can do this usually).
3173 * On UNIX, reads a file that gets created by dbus-uuidgen
3174 * in a post-install script. On Windows, if there's a standard
3175 * machine uuid we could just use that, but I can't find one
3176 * with the right properties (the hardware profile guid can change
3177 * without rebooting I believe). If there's no standard one
3178 * we might want to use the registry instead of a file for
3179 * this, and I'm not sure how we'd ensure the uuid gets created.
3181 * @param machine_id guid to init with the machine's uuid
3182 * @param create_if_not_found try to create the uuid if it doesn't exist
3183 * @param error the error return
3184 * @returns #FALSE if the error is set
3187 _dbus_read_local_machine_uuid (DBusGUID *machine_id,
3188 dbus_bool_t create_if_not_found,
3191 DBusString filename;
3192 _dbus_string_init_const (&filename, DBUS_MACHINE_UUID_FILE);
3193 return _dbus_read_uuid_file (&filename, machine_id, create_if_not_found, error);
3196 #define DBUS_UNIX_STANDARD_SESSION_SERVICEDIR "/dbus-1/services"
3197 #define DBUS_UNIX_STANDARD_SYSTEM_SERVICEDIR "/dbus-1/system-services"
3200 * Determines the address of the session bus by querying a
3201 * platform-specific method.
3203 * The first parameter will be a boolean specifying whether
3204 * or not a dynamic session lookup is supported on this platform.
3206 * If supported is TRUE and the return value is #TRUE, the
3207 * address will be appended to @p address.
3208 * If a failure happens, returns #FALSE and sets an error in
3211 * If supported is FALSE, ignore the return value.
3213 * @param supported returns whether this method is supported
3214 * @param address a DBusString where the address can be stored
3215 * @param error a DBusError to store the error in case of failure
3216 * @returns #TRUE on success, #FALSE if an error happened
3219 _dbus_lookup_session_address (dbus_bool_t *supported,
3220 DBusString *address,
3223 /* On non-Mac Unix platforms, if the session address isn't already
3224 * set in DBUS_SESSION_BUS_ADDRESS environment variable, we punt and
3225 * fall back to the autolaunch: global default; see
3226 * init_session_address in dbus/dbus-bus.c. */
3232 * Returns the standard directories for a session bus to look for service
3235 * On UNIX this should be the standard xdg freedesktop.org data directories:
3237 * XDG_DATA_HOME=${XDG_DATA_HOME-$HOME/.local/share}
3238 * XDG_DATA_DIRS=${XDG_DATA_DIRS-/usr/local/share:/usr/share}
3244 * @param dirs the directory list we are returning
3245 * @returns #FALSE on OOM
3249 _dbus_get_standard_session_servicedirs (DBusList **dirs)
3251 const char *xdg_data_home;
3252 const char *xdg_data_dirs;
3253 DBusString servicedir_path;
3255 if (!_dbus_string_init (&servicedir_path))
3258 xdg_data_home = _dbus_getenv ("XDG_DATA_HOME");
3259 xdg_data_dirs = _dbus_getenv ("XDG_DATA_DIRS");
3261 if (xdg_data_dirs != NULL)
3263 if (!_dbus_string_append (&servicedir_path, xdg_data_dirs))
3266 if (!_dbus_string_append (&servicedir_path, ":"))
3271 if (!_dbus_string_append (&servicedir_path, "/usr/local/share:/usr/share:"))
3276 * add configured datadir to defaults
3277 * this may be the same as an xdg dir
3278 * however the config parser should take
3279 * care of duplicates
3281 if (!_dbus_string_append (&servicedir_path, DBUS_DATADIR":"))
3284 if (xdg_data_home != NULL)
3286 if (!_dbus_string_append (&servicedir_path, xdg_data_home))
3291 const DBusString *homedir;
3292 DBusString local_share;
3294 if (!_dbus_homedir_from_current_process (&homedir))
3297 if (!_dbus_string_append (&servicedir_path, _dbus_string_get_const_data (homedir)))
3300 _dbus_string_init_const (&local_share, "/.local/share");
3301 if (!_dbus_concat_dir_and_file (&servicedir_path, &local_share))
3305 if (!_dbus_split_paths_and_append (&servicedir_path,
3306 DBUS_UNIX_STANDARD_SESSION_SERVICEDIR,
3310 _dbus_string_free (&servicedir_path);
3314 _dbus_string_free (&servicedir_path);
3320 * Returns the standard directories for a system bus to look for service
3323 * On UNIX this should be the standard xdg freedesktop.org data directories:
3325 * XDG_DATA_DIRS=${XDG_DATA_DIRS-/usr/local/share:/usr/share}
3331 * On Windows there is no system bus and this function can return nothing.
3333 * @param dirs the directory list we are returning
3334 * @returns #FALSE on OOM
3338 _dbus_get_standard_system_servicedirs (DBusList **dirs)
3340 const char *xdg_data_dirs;
3341 DBusString servicedir_path;
3343 if (!_dbus_string_init (&servicedir_path))
3346 xdg_data_dirs = _dbus_getenv ("XDG_DATA_DIRS");
3348 if (xdg_data_dirs != NULL)
3350 if (!_dbus_string_append (&servicedir_path, xdg_data_dirs))
3353 if (!_dbus_string_append (&servicedir_path, ":"))
3358 if (!_dbus_string_append (&servicedir_path, "/usr/local/share:/usr/share:"))
3363 * add configured datadir to defaults
3364 * this may be the same as an xdg dir
3365 * however the config parser should take
3366 * care of duplicates
3368 if (!_dbus_string_append (&servicedir_path, DBUS_DATADIR":"))
3371 if (!_dbus_split_paths_and_append (&servicedir_path,
3372 DBUS_UNIX_STANDARD_SYSTEM_SERVICEDIR,
3376 _dbus_string_free (&servicedir_path);
3380 _dbus_string_free (&servicedir_path);
3385 * Append the absolute path of the system.conf file
3386 * (there is no system bus on Windows so this can just
3387 * return FALSE and print a warning or something)
3389 * @param str the string to append to
3390 * @returns #FALSE if no memory
3393 _dbus_append_system_config_file (DBusString *str)
3395 return _dbus_string_append (str, DBUS_SYSTEM_CONFIG_FILE);
3399 * Append the absolute path of the session.conf file.
3401 * @param str the string to append to
3402 * @returns #FALSE if no memory
3405 _dbus_append_session_config_file (DBusString *str)
3407 return _dbus_string_append (str, DBUS_SESSION_CONFIG_FILE);
3411 * Called when the bus daemon is signaled to reload its configuration; any
3412 * caches should be nuked. Of course any caches that need explicit reload
3413 * are probably broken, but c'est la vie.
3418 _dbus_flush_caches (void)
3420 _dbus_user_database_flush_system ();
3424 * Appends the directory in which a keyring for the given credentials
3425 * should be stored. The credentials should have either a Windows or
3426 * UNIX user in them. The directory should be an absolute path.
3428 * On UNIX the directory is ~/.dbus-keyrings while on Windows it should probably
3429 * be something else, since the dotfile convention is not normal on Windows.
3431 * @param directory string to append directory to
3432 * @param credentials credentials the directory should be for
3434 * @returns #FALSE on no memory
3437 _dbus_append_keyring_directory_for_credentials (DBusString *directory,
3438 DBusCredentials *credentials)
3444 _dbus_assert (credentials != NULL);
3445 _dbus_assert (!_dbus_credentials_are_anonymous (credentials));
3447 if (!_dbus_string_init (&homedir))
3450 uid = _dbus_credentials_get_unix_uid (credentials);
3451 _dbus_assert (uid != DBUS_UID_UNSET);
3453 if (!_dbus_homedir_from_uid (uid, &homedir))
3456 #ifdef DBUS_BUILD_TESTS
3458 const char *override;
3460 override = _dbus_getenv ("DBUS_TEST_HOMEDIR");
3461 if (override != NULL && *override != '\0')
3463 _dbus_string_set_length (&homedir, 0);
3464 if (!_dbus_string_append (&homedir, override))
3467 _dbus_verbose ("Using fake homedir for testing: %s\n",
3468 _dbus_string_get_const_data (&homedir));
3472 static dbus_bool_t already_warned = FALSE;
3473 if (!already_warned)
3475 _dbus_warn ("Using your real home directory for testing, set DBUS_TEST_HOMEDIR to avoid\n");
3476 already_warned = TRUE;
3482 _dbus_string_init_const (&dotdir, ".dbus-keyrings");
3483 if (!_dbus_concat_dir_and_file (&homedir,
3487 if (!_dbus_string_copy (&homedir, 0,
3488 directory, _dbus_string_get_length (directory))) {
3492 _dbus_string_free (&homedir);
3496 _dbus_string_free (&homedir);
3500 //PENDING(kdab) docs
3502 _dbus_daemon_publish_session_bus_address (const char* addr)
3507 //PENDING(kdab) docs
3509 _dbus_daemon_unpublish_session_bus_address (void)
3515 * See if errno is EAGAIN or EWOULDBLOCK (this has to be done differently
3516 * for Winsock so is abstracted)
3518 * @returns #TRUE if errno == EAGAIN or errno == EWOULDBLOCK
3521 _dbus_get_is_errno_eagain_or_ewouldblock (void)
3523 return errno == EAGAIN || errno == EWOULDBLOCK;
3527 * Removes a directory; Directory must be empty
3529 * @param filename directory filename
3530 * @param error initialized error object
3531 * @returns #TRUE on success
3534 _dbus_delete_directory (const DBusString *filename,
3537 const char *filename_c;
3539 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
3541 filename_c = _dbus_string_get_const_data (filename);
3543 if (rmdir (filename_c) != 0)
3545 dbus_set_error (error, DBUS_ERROR_FAILED,
3546 "Failed to remove directory %s: %s\n",
3547 filename_c, _dbus_strerror (errno));
3555 * Checks whether file descriptors may be passed via the socket
3557 * @param fd the socket
3558 * @return TRUE when fd passing over this socket is supported
3562 _dbus_socket_can_pass_unix_fd(int fd) {
3567 struct sockaddr_storage storage;
3568 struct sockaddr_un un;
3571 socklen_t sa_len = sizeof(sa_buf);
3575 if (getsockname(fd, &sa_buf.sa, &sa_len) < 0)
3578 return sa_buf.sa.sa_family == AF_UNIX;
3586 /* tests in dbus-sysdeps-util.c */