1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
34 #include "sd-daemon.h"
37 #include "bus-socket.h"
38 #include "bus-internal.h"
39 #include "bus-message.h"
41 static void iovec_advance(struct iovec iov[], unsigned *idx, size_t size) {
44 struct iovec *i = iov + *idx;
46 if (i->iov_len > size) {
47 i->iov_base = (uint8_t*) i->iov_base + size;
61 static int append_iovec(sd_bus_message *m, const void *p, size_t sz) {
66 m->iovec[m->n_iovec].iov_base = (void*) p;
67 m->iovec[m->n_iovec].iov_len = sz;
73 static int bus_message_setup_iovec(sd_bus_message *m) {
74 struct bus_body_part *part;
86 n = 1 + m->n_body_parts;
87 if (n < ELEMENTSOF(m->iovec_fixed))
88 m->iovec = m->iovec_fixed;
90 m->iovec = new(struct iovec, n);
95 r = append_iovec(m, m->header, BUS_MESSAGE_BODY_BEGIN(m));
99 MESSAGE_FOREACH_PART(part, i, m) {
100 r = append_iovec(m, part->data, part->size);
105 assert(n == m->n_iovec);
110 bool bus_socket_auth_needs_write(sd_bus *b) {
114 if (b->auth_index >= ELEMENTSOF(b->auth_iovec))
117 for (i = b->auth_index; i < ELEMENTSOF(b->auth_iovec); i++) {
118 struct iovec *j = b->auth_iovec + i;
127 static int bus_socket_write_auth(sd_bus *b) {
131 assert(b->state == BUS_AUTHENTICATING);
133 if (!bus_socket_auth_needs_write(b))
136 if (b->prefer_writev)
137 k = writev(b->output_fd, b->auth_iovec + b->auth_index, ELEMENTSOF(b->auth_iovec) - b->auth_index);
142 mh.msg_iov = b->auth_iovec + b->auth_index;
143 mh.msg_iovlen = ELEMENTSOF(b->auth_iovec) - b->auth_index;
145 k = sendmsg(b->output_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL);
146 if (k < 0 && errno == ENOTSOCK) {
147 b->prefer_writev = true;
148 k = writev(b->output_fd, b->auth_iovec + b->auth_index, ELEMENTSOF(b->auth_iovec) - b->auth_index);
153 return errno == EAGAIN ? 0 : -errno;
155 iovec_advance(b->auth_iovec, &b->auth_index, (size_t) k);
159 static int bus_socket_auth_verify_client(sd_bus *b) {
167 /* We expect two response lines: "OK" and possibly
170 e = memmem(b->rbuffer, b->rbuffer_size, "\r\n", 2);
174 if (b->negotiate_fds) {
175 f = memmem(e + 2, b->rbuffer_size - (e - (char*) b->rbuffer) - 2, "\r\n", 2);
185 /* Nice! We got all the lines we need. First check the OK
188 if (e - (char*) b->rbuffer != 3 + 32)
191 if (memcmp(b->rbuffer, "OK ", 3))
194 b->auth = b->anonymous_auth ? BUS_AUTH_ANONYMOUS : BUS_AUTH_EXTERNAL;
196 for (i = 0; i < 32; i += 2) {
199 x = unhexchar(((char*) b->rbuffer)[3 + i]);
200 y = unhexchar(((char*) b->rbuffer)[3 + i + 1]);
205 peer.bytes[i/2] = ((uint8_t) x << 4 | (uint8_t) y);
208 if (!sd_id128_equal(b->server_id, SD_ID128_NULL) &&
209 !sd_id128_equal(b->server_id, peer))
214 /* And possibly check the second line, too */
218 (f - e == sizeof("\r\nAGREE_UNIX_FD") - 1) &&
219 memcmp(e + 2, "AGREE_UNIX_FD", sizeof("AGREE_UNIX_FD") - 1) == 0;
221 b->rbuffer_size -= (start - (char*) b->rbuffer);
222 memmove(b->rbuffer, start, b->rbuffer_size);
224 r = bus_start_running(b);
231 static bool line_equals(const char *s, size_t m, const char *line) {
238 return memcmp(s, line, l) == 0;
241 static bool line_begins(const char *s, size_t m, const char *word) {
248 if (memcmp(s, word, l) != 0)
251 return m == l || (m > l && s[l] == ' ');
254 static int verify_anonymous_token(sd_bus *b, const char *p, size_t l) {
255 _cleanup_free_ char *token = NULL;
257 if (!b->anonymous_auth)
268 token = unhexmem(p, l);
272 if (memchr(token, 0, l/2))
275 return !!utf8_is_valid(token);
278 static int verify_external_token(sd_bus *b, const char *p, size_t l) {
279 _cleanup_free_ char *token = NULL;
283 /* We don't do any real authentication here. Instead, we if
284 * the owner of this bus wanted authentication he should have
285 * checked SO_PEERCRED before even creating the bus object. */
287 if (!b->anonymous_auth && !b->ucred_valid)
299 token = unhexmem(p, l);
303 if (memchr(token, 0, l/2))
306 r = parse_uid(token, &u);
310 /* We ignore the passed value if anonymous authentication is
312 if (!b->anonymous_auth && u != b->ucred.uid)
318 static int bus_socket_auth_write(sd_bus *b, const char *t) {
325 /* We only make use of the first iovec */
326 assert(b->auth_index == 0 || b->auth_index == 1);
329 p = malloc(b->auth_iovec[0].iov_len + l);
333 memcpy(p, b->auth_iovec[0].iov_base, b->auth_iovec[0].iov_len);
334 memcpy(p + b->auth_iovec[0].iov_len, t, l);
336 b->auth_iovec[0].iov_base = p;
337 b->auth_iovec[0].iov_len += l;
339 free(b->auth_buffer);
345 static int bus_socket_auth_write_ok(sd_bus *b) {
346 char t[3 + 32 + 2 + 1];
350 snprintf(t, sizeof(t), "OK " SD_ID128_FORMAT_STR "\r\n", SD_ID128_FORMAT_VAL(b->server_id));
353 return bus_socket_auth_write(b, t);
356 static int bus_socket_auth_verify_server(sd_bus *b) {
360 bool processed = false;
365 if (b->rbuffer_size < 1)
368 /* First char must be a NUL byte */
369 if (*(char*) b->rbuffer != 0)
372 if (b->rbuffer_size < 3)
375 /* Begin with the first line */
376 if (b->auth_rbegin <= 0)
380 /* Check if line is complete */
381 line = (char*) b->rbuffer + b->auth_rbegin;
382 e = memmem(line, b->rbuffer_size - b->auth_rbegin, "\r\n", 2);
388 if (line_begins(line, l, "AUTH ANONYMOUS")) {
390 r = verify_anonymous_token(b, line + 14, l - 14);
394 r = bus_socket_auth_write(b, "REJECTED\r\n");
396 b->auth = BUS_AUTH_ANONYMOUS;
397 r = bus_socket_auth_write_ok(b);
400 } else if (line_begins(line, l, "AUTH EXTERNAL")) {
402 r = verify_external_token(b, line + 13, l - 13);
406 r = bus_socket_auth_write(b, "REJECTED\r\n");
408 b->auth = BUS_AUTH_EXTERNAL;
409 r = bus_socket_auth_write_ok(b);
412 } else if (line_begins(line, l, "AUTH"))
413 r = bus_socket_auth_write(b, "REJECTED EXTERNAL ANONYMOUS\r\n");
414 else if (line_equals(line, l, "CANCEL") ||
415 line_begins(line, l, "ERROR")) {
417 b->auth = _BUS_AUTH_INVALID;
418 r = bus_socket_auth_write(b, "REJECTED\r\n");
420 } else if (line_equals(line, l, "BEGIN")) {
422 if (b->auth == _BUS_AUTH_INVALID)
423 r = bus_socket_auth_write(b, "ERROR\r\n");
425 /* We can't leave from the auth phase
426 * before we haven't written
427 * everything queued, so let's check
430 if (bus_socket_auth_needs_write(b))
433 b->rbuffer_size -= (e + 2 - (char*) b->rbuffer);
434 memmove(b->rbuffer, e + 2, b->rbuffer_size);
435 return bus_start_running(b);
438 } else if (line_begins(line, l, "DATA")) {
440 if (b->auth == _BUS_AUTH_INVALID)
441 r = bus_socket_auth_write(b, "ERROR\r\n");
443 if (b->auth == BUS_AUTH_ANONYMOUS)
444 r = verify_anonymous_token(b, line + 4, l - 4);
446 r = verify_external_token(b, line + 4, l - 4);
451 b->auth = _BUS_AUTH_INVALID;
452 r = bus_socket_auth_write(b, "REJECTED\r\n");
454 r = bus_socket_auth_write_ok(b);
456 } else if (line_equals(line, l, "NEGOTIATE_UNIX_FD")) {
457 if (b->auth == _BUS_AUTH_INVALID || !b->negotiate_fds)
458 r = bus_socket_auth_write(b, "ERROR\r\n");
461 r = bus_socket_auth_write(b, "AGREE_UNIX_FD\r\n");
464 r = bus_socket_auth_write(b, "ERROR\r\n");
469 b->auth_rbegin = e + 2 - (char*) b->rbuffer;
475 static int bus_socket_auth_verify(sd_bus *b) {
479 return bus_socket_auth_verify_server(b);
481 return bus_socket_auth_verify_client(b);
484 static int bus_socket_read_auth(sd_bus *b) {
492 struct cmsghdr cmsghdr;
493 uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX) +
494 CMSG_SPACE(sizeof(struct ucred)) +
495 CMSG_SPACE(NAME_MAX)]; /*selinux label */
497 struct cmsghdr *cmsg;
498 bool handle_cmsg = false;
501 assert(b->state == BUS_AUTHENTICATING);
503 r = bus_socket_auth_verify(b);
507 n = MAX(256u, b->rbuffer_size * 2);
509 if (n > BUS_AUTH_SIZE_MAX)
510 n = BUS_AUTH_SIZE_MAX;
512 if (b->rbuffer_size >= n)
515 p = realloc(b->rbuffer, n);
522 iov.iov_base = (uint8_t*) b->rbuffer + b->rbuffer_size;
523 iov.iov_len = n - b->rbuffer_size;
526 k = readv(b->input_fd, &iov, 1);
531 mh.msg_control = &control;
532 mh.msg_controllen = sizeof(control);
534 k = recvmsg(b->input_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL|MSG_CMSG_CLOEXEC);
535 if (k < 0 && errno == ENOTSOCK) {
536 b->prefer_readv = true;
537 k = readv(b->input_fd, &iov, 1);
542 return errno == EAGAIN ? 0 : -errno;
546 b->rbuffer_size += k;
549 for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
550 if (cmsg->cmsg_level == SOL_SOCKET &&
551 cmsg->cmsg_type == SCM_RIGHTS) {
554 /* Whut? We received fds during the auth
555 * protocol? Somebody is playing games with
556 * us. Close them all, and fail */
557 j = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
558 close_many((int*) CMSG_DATA(cmsg), j);
561 } else if (cmsg->cmsg_level == SOL_SOCKET &&
562 cmsg->cmsg_type == SCM_CREDENTIALS &&
563 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
565 /* Ignore bogus data, which we might
566 * get on socketpair() sockets */
567 if (((struct ucred*) CMSG_DATA(cmsg))->pid != 0) {
568 memcpy(&b->ucred, CMSG_DATA(cmsg), sizeof(struct ucred));
569 b->ucred_valid = true;
572 } else if (cmsg->cmsg_level == SOL_SOCKET &&
573 cmsg->cmsg_type == SCM_SECURITY) {
577 l = cmsg->cmsg_len - CMSG_LEN(0);
579 memcpy(&b->label, CMSG_DATA(cmsg), l);
586 r = bus_socket_auth_verify(b);
593 static int bus_socket_setup(sd_bus *b) {
599 /* Enable SO_PASSCRED + SO_PASSEC. We try this on any
600 * socket, just in case. */
601 enable = !b->bus_client;
602 setsockopt(b->input_fd, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable));
603 setsockopt(b->input_fd, SOL_SOCKET, SO_PASSSEC, &enable, sizeof(enable));
605 /* Increase the buffers to a MB */
606 fd_inc_rcvbuf(b->input_fd, 1024*1024);
607 fd_inc_sndbuf(b->output_fd, 1024*1024);
609 /* Get the peer for socketpair() sockets */
610 l = sizeof(b->ucred);
611 if (getsockopt(b->input_fd, SOL_SOCKET, SO_PEERCRED, &b->ucred, &l) >= 0 && l >= sizeof(b->ucred))
612 b->ucred_valid = b->ucred.pid > 0;
617 static int bus_socket_start_auth_client(sd_bus *b) {
619 const char *auth_suffix, *auth_prefix;
623 if (b->anonymous_auth) {
624 auth_prefix = "\0AUTH ANONYMOUS ";
626 /* For ANONYMOUS auth we send some arbitrary "trace" string */
628 b->auth_buffer = hexmem("anonymous", l);
630 char text[20 + 1]; /* enough space for a 64bit integer plus NUL */
632 auth_prefix = "\0AUTH EXTERNAL ";
634 snprintf(text, sizeof(text), "%lu", (unsigned long) geteuid());
638 b->auth_buffer = hexmem(text, l);
644 if (b->negotiate_fds)
645 auth_suffix = "\r\nNEGOTIATE_UNIX_FD\r\nBEGIN\r\n";
647 auth_suffix = "\r\nBEGIN\r\n";
649 b->auth_iovec[0].iov_base = (void*) auth_prefix;
650 b->auth_iovec[0].iov_len = 1 + strlen(auth_prefix + 1);
651 b->auth_iovec[1].iov_base = (void*) b->auth_buffer;
652 b->auth_iovec[1].iov_len = l * 2;
653 b->auth_iovec[2].iov_base = (void*) auth_suffix;
654 b->auth_iovec[2].iov_len = strlen(auth_suffix);
656 return bus_socket_write_auth(b);
659 static int bus_socket_start_auth(sd_bus *b) {
662 b->state = BUS_AUTHENTICATING;
663 b->auth_timeout = now(CLOCK_MONOTONIC) + BUS_DEFAULT_TIMEOUT;
665 if (sd_is_socket(b->input_fd, AF_UNIX, 0, 0) <= 0)
666 b->negotiate_fds = false;
668 if (b->output_fd != b->input_fd)
669 if (sd_is_socket(b->output_fd, AF_UNIX, 0, 0) <= 0)
670 b->negotiate_fds = false;
673 return bus_socket_read_auth(b);
675 return bus_socket_start_auth_client(b);
678 int bus_socket_connect(sd_bus *b) {
682 assert(b->input_fd < 0);
683 assert(b->output_fd < 0);
684 assert(b->sockaddr.sa.sa_family != AF_UNSPEC);
686 b->input_fd = socket(b->sockaddr.sa.sa_family, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
690 b->output_fd = b->input_fd;
692 r = bus_socket_setup(b);
696 r = connect(b->input_fd, &b->sockaddr.sa, b->sockaddr_size);
698 if (errno == EINPROGRESS)
704 return bus_socket_start_auth(b);
707 int bus_socket_exec(sd_bus *b) {
712 assert(b->input_fd < 0);
713 assert(b->output_fd < 0);
714 assert(b->exec_path);
716 r = socketpair(AF_UNIX, SOCK_STREAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0, s);
728 reset_all_signal_handlers();
730 close_all_fds(s+1, 1);
732 assert_se(dup3(s[1], STDIN_FILENO, 0) == STDIN_FILENO);
733 assert_se(dup3(s[1], STDOUT_FILENO, 0) == STDOUT_FILENO);
735 if (s[1] != STDIN_FILENO && s[1] != STDOUT_FILENO)
736 close_nointr_nofail(s[1]);
738 fd_cloexec(STDIN_FILENO, false);
739 fd_cloexec(STDOUT_FILENO, false);
740 fd_nonblock(STDIN_FILENO, false);
741 fd_nonblock(STDOUT_FILENO, false);
744 execvp(b->exec_path, b->exec_argv);
746 const char *argv[] = { b->exec_path, NULL };
747 execvp(b->exec_path, (char**) argv);
753 close_nointr_nofail(s[1]);
754 b->output_fd = b->input_fd = s[0];
756 return bus_socket_start_auth(b);
759 int bus_socket_take_fd(sd_bus *b) {
763 r = bus_socket_setup(b);
767 return bus_socket_start_auth(b);
770 int bus_socket_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
780 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
782 if (*idx >= BUS_MESSAGE_SIZE(m))
785 r = bus_message_setup_iovec(m);
789 n = m->n_iovec * sizeof(struct iovec);
791 memcpy(iov, m->iovec, n);
794 iovec_advance(iov, &j, *idx);
796 if (bus->prefer_writev)
797 k = writev(bus->output_fd, iov, m->n_iovec);
803 struct cmsghdr *control;
804 control = alloca(CMSG_SPACE(sizeof(int) * m->n_fds));
806 mh.msg_control = control;
807 control->cmsg_level = SOL_SOCKET;
808 control->cmsg_type = SCM_RIGHTS;
809 mh.msg_controllen = control->cmsg_len = CMSG_LEN(sizeof(int) * m->n_fds);
810 memcpy(CMSG_DATA(control), m->fds, sizeof(int) * m->n_fds);
814 mh.msg_iovlen = m->n_iovec;
816 k = sendmsg(bus->output_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL);
817 if (k < 0 && errno == ENOTSOCK) {
818 bus->prefer_writev = true;
819 k = writev(bus->output_fd, iov, m->n_iovec);
824 return errno == EAGAIN ? 0 : -errno;
830 static int bus_socket_read_message_need(sd_bus *bus, size_t *need) {
837 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
839 if (bus->rbuffer_size < sizeof(struct bus_header)) {
840 *need = sizeof(struct bus_header) + 8;
842 /* Minimum message size:
846 * Method Call: +2 string headers
847 * Signal: +3 string headers
848 * Method Error: +1 string headers
850 * Method Reply: +1 uint32 headers
852 * A string header is at least 9 bytes
853 * A uint32 header is at least 8 bytes
855 * Hence the minimum message size of a valid message
856 * is header + 8 bytes */
861 a = ((const uint32_t*) bus->rbuffer)[1];
862 b = ((const uint32_t*) bus->rbuffer)[3];
864 e = ((const uint8_t*) bus->rbuffer)[0];
865 if (e == SD_BUS_LITTLE_ENDIAN) {
868 } else if (e == SD_BUS_BIG_ENDIAN) {
874 sum = (uint64_t) sizeof(struct bus_header) + (uint64_t) ALIGN_TO(b, 8) + (uint64_t) a;
875 if (sum >= BUS_MESSAGE_SIZE_MAX)
878 *need = (size_t) sum;
882 static int bus_socket_make_message(sd_bus *bus, size_t size, sd_bus_message **m) {
889 assert(bus->rbuffer_size >= size);
890 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
892 if (bus->rbuffer_size > size) {
893 b = memdup((const uint8_t*) bus->rbuffer + size,
894 bus->rbuffer_size - size);
900 r = bus_message_from_malloc(bus->rbuffer, size,
901 bus->fds, bus->n_fds,
902 bus->ucred_valid ? &bus->ucred : NULL,
903 bus->label[0] ? bus->label : NULL,
911 bus->rbuffer_size -= size;
920 int bus_socket_read_message(sd_bus *bus, sd_bus_message **m) {
928 struct cmsghdr cmsghdr;
929 uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX) +
930 CMSG_SPACE(sizeof(struct ucred)) +
931 CMSG_SPACE(NAME_MAX)]; /*selinux label */
933 struct cmsghdr *cmsg;
934 bool handle_cmsg = false;
938 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
940 r = bus_socket_read_message_need(bus, &need);
944 if (bus->rbuffer_size >= need)
945 return bus_socket_make_message(bus, need, m);
947 b = realloc(bus->rbuffer, need);
954 iov.iov_base = (uint8_t*) bus->rbuffer + bus->rbuffer_size;
955 iov.iov_len = need - bus->rbuffer_size;
957 if (bus->prefer_readv)
958 k = readv(bus->input_fd, &iov, 1);
963 mh.msg_control = &control;
964 mh.msg_controllen = sizeof(control);
966 k = recvmsg(bus->input_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL|MSG_CMSG_CLOEXEC);
967 if (k < 0 && errno == ENOTSOCK) {
968 bus->prefer_readv = true;
969 k = readv(bus->input_fd, &iov, 1);
974 return errno == EAGAIN ? 0 : -errno;
978 bus->rbuffer_size += k;
981 for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
982 if (cmsg->cmsg_level == SOL_SOCKET &&
983 cmsg->cmsg_type == SCM_RIGHTS) {
986 n = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
989 /* Whut? We received fds but this
990 * isn't actually enabled? Close them,
993 close_many((int*) CMSG_DATA(cmsg), n);
997 f = realloc(bus->fds, sizeof(int) + (bus->n_fds + n));
999 close_many((int*) CMSG_DATA(cmsg), n);
1003 memcpy(f + bus->n_fds, CMSG_DATA(cmsg), n * sizeof(int));
1006 } else if (cmsg->cmsg_level == SOL_SOCKET &&
1007 cmsg->cmsg_type == SCM_CREDENTIALS &&
1008 cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
1010 /* Ignore bogus data, which we might
1011 * get on socketpair() sockets */
1012 if (((struct ucred*) CMSG_DATA(cmsg))->pid != 0) {
1013 memcpy(&bus->ucred, CMSG_DATA(cmsg), sizeof(struct ucred));
1014 bus->ucred_valid = true;
1017 } else if (cmsg->cmsg_level == SOL_SOCKET &&
1018 cmsg->cmsg_type == SCM_SECURITY) {
1021 l = cmsg->cmsg_len - CMSG_LEN(0);
1023 memcpy(&bus->label, CMSG_DATA(cmsg), l);
1030 r = bus_socket_read_message_need(bus, &need);
1034 if (bus->rbuffer_size >= need)
1035 return bus_socket_make_message(bus, need, m);
1040 int bus_socket_process_opening(sd_bus *b) {
1042 socklen_t slen = sizeof(error);
1049 assert(b->state == BUS_OPENING);
1055 if (!(p.revents & (POLLOUT|POLLERR|POLLHUP)))
1058 r = getsockopt(b->output_fd, SOL_SOCKET, SO_ERROR, &error, &slen);
1060 b->last_connect_error = errno;
1061 else if (error != 0)
1062 b->last_connect_error = error;
1063 else if (p.revents & (POLLERR|POLLHUP))
1064 b->last_connect_error = ECONNREFUSED;
1066 return bus_socket_start_auth(b);
1068 return bus_next_address(b);
1071 int bus_socket_process_authenticating(sd_bus *b) {
1075 assert(b->state == BUS_AUTHENTICATING);
1077 if (now(CLOCK_MONOTONIC) >= b->auth_timeout)
1080 r = bus_socket_write_auth(b);
1084 return bus_socket_read_auth(b);