]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-bus/bus-socket.c
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/>.
28 #include "sd-daemon.h"
30 #include "bus-internal.h"
31 #include "bus-message.h"
32 #include "formats-util.h"
35 #include "signal-util.h"
36 #include "string-util.h"
39 #include "bus-socket.h"
41 #define SNDBUF_SIZE (8*1024*1024)
43 static void iovec_advance(struct iovec iov
[], unsigned *idx
, size_t size
) {
46 struct iovec
*i
= iov
+ *idx
;
48 if (i
->iov_len
> size
) {
49 i
->iov_base
= (uint8_t*) i
->iov_base
+ size
;
63 static int append_iovec(sd_bus_message
*m
, const void *p
, size_t sz
) {
68 m
->iovec
[m
->n_iovec
].iov_base
= (void*) p
;
69 m
->iovec
[m
->n_iovec
].iov_len
= sz
;
75 static int bus_message_setup_iovec(sd_bus_message
*m
) {
76 struct bus_body_part
*part
;
88 n
= 1 + m
->n_body_parts
;
89 if (n
< ELEMENTSOF(m
->iovec_fixed
))
90 m
->iovec
= m
->iovec_fixed
;
92 m
->iovec
= new(struct iovec
, n
);
99 r
= append_iovec(m
, m
->header
, BUS_MESSAGE_BODY_BEGIN(m
));
103 MESSAGE_FOREACH_PART(part
, i
, m
) {
104 r
= bus_body_part_map(part
);
108 r
= append_iovec(m
, part
->data
, part
->size
);
113 assert(n
== m
->n_iovec
);
122 bool bus_socket_auth_needs_write(sd_bus
*b
) {
126 if (b
->auth_index
>= ELEMENTSOF(b
->auth_iovec
))
129 for (i
= b
->auth_index
; i
< ELEMENTSOF(b
->auth_iovec
); i
++) {
130 struct iovec
*j
= b
->auth_iovec
+ i
;
139 static int bus_socket_write_auth(sd_bus
*b
) {
143 assert(b
->state
== BUS_AUTHENTICATING
);
145 if (!bus_socket_auth_needs_write(b
))
148 if (b
->prefer_writev
)
149 k
= writev(b
->output_fd
, b
->auth_iovec
+ b
->auth_index
, ELEMENTSOF(b
->auth_iovec
) - b
->auth_index
);
154 mh
.msg_iov
= b
->auth_iovec
+ b
->auth_index
;
155 mh
.msg_iovlen
= ELEMENTSOF(b
->auth_iovec
) - b
->auth_index
;
157 k
= sendmsg(b
->output_fd
, &mh
, MSG_DONTWAIT
|MSG_NOSIGNAL
);
158 if (k
< 0 && errno
== ENOTSOCK
) {
159 b
->prefer_writev
= true;
160 k
= writev(b
->output_fd
, b
->auth_iovec
+ b
->auth_index
, ELEMENTSOF(b
->auth_iovec
) - b
->auth_index
);
165 return errno
== EAGAIN
? 0 : -errno
;
167 iovec_advance(b
->auth_iovec
, &b
->auth_index
, (size_t) k
);
171 static int bus_socket_auth_verify_client(sd_bus
*b
) {
179 /* We expect two response lines: "OK" and possibly
182 e
= memmem_safe(b
->rbuffer
, b
->rbuffer_size
, "\r\n", 2);
186 if (b
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
) {
187 f
= memmem(e
+ 2, b
->rbuffer_size
- (e
- (char*) b
->rbuffer
) - 2, "\r\n", 2);
197 /* Nice! We got all the lines we need. First check the OK
200 if (e
- (char*) b
->rbuffer
!= 3 + 32)
203 if (memcmp(b
->rbuffer
, "OK ", 3))
206 b
->auth
= b
->anonymous_auth
? BUS_AUTH_ANONYMOUS
: BUS_AUTH_EXTERNAL
;
208 for (i
= 0; i
< 32; i
+= 2) {
211 x
= unhexchar(((char*) b
->rbuffer
)[3 + i
]);
212 y
= unhexchar(((char*) b
->rbuffer
)[3 + i
+ 1]);
217 peer
.bytes
[i
/2] = ((uint8_t) x
<< 4 | (uint8_t) y
);
220 if (!sd_id128_equal(b
->server_id
, SD_ID128_NULL
) &&
221 !sd_id128_equal(b
->server_id
, peer
))
226 /* And possibly check the second line, too */
230 (f
- e
== strlen("\r\nAGREE_UNIX_FD")) &&
231 memcmp(e
+ 2, "AGREE_UNIX_FD", strlen("AGREE_UNIX_FD")) == 0;
233 b
->rbuffer_size
-= (start
- (char*) b
->rbuffer
);
234 memmove(b
->rbuffer
, start
, b
->rbuffer_size
);
236 r
= bus_start_running(b
);
243 static bool line_equals(const char *s
, size_t m
, const char *line
) {
250 return memcmp(s
, line
, l
) == 0;
253 static bool line_begins(const char *s
, size_t m
, const char *word
) {
260 if (memcmp(s
, word
, l
) != 0)
263 return m
== l
|| (m
> l
&& s
[l
] == ' ');
266 static int verify_anonymous_token(sd_bus
*b
, const char *p
, size_t l
) {
267 _cleanup_free_
char *token
= NULL
;
271 if (!b
->anonymous_auth
)
283 r
= unhexmem(p
, l
, (void **) &token
, &len
);
287 if (memchr(token
, 0, len
))
290 return !!utf8_is_valid(token
);
293 static int verify_external_token(sd_bus
*b
, const char *p
, size_t l
) {
294 _cleanup_free_
char *token
= NULL
;
299 /* We don't do any real authentication here. Instead, we if
300 * the owner of this bus wanted authentication he should have
301 * checked SO_PEERCRED before even creating the bus object. */
303 if (!b
->anonymous_auth
&& !b
->ucred_valid
)
315 r
= unhexmem(p
, l
, (void**) &token
, &len
);
319 if (memchr(token
, 0, len
))
322 r
= parse_uid(token
, &u
);
326 /* We ignore the passed value if anonymous authentication is
328 if (!b
->anonymous_auth
&& u
!= b
->ucred
.uid
)
334 static int bus_socket_auth_write(sd_bus
*b
, const char *t
) {
341 /* We only make use of the first iovec */
342 assert(b
->auth_index
== 0 || b
->auth_index
== 1);
345 p
= malloc(b
->auth_iovec
[0].iov_len
+ l
);
349 memcpy(p
, b
->auth_iovec
[0].iov_base
, b
->auth_iovec
[0].iov_len
);
350 memcpy(p
+ b
->auth_iovec
[0].iov_len
, t
, l
);
352 b
->auth_iovec
[0].iov_base
= p
;
353 b
->auth_iovec
[0].iov_len
+= l
;
355 free(b
->auth_buffer
);
361 static int bus_socket_auth_write_ok(sd_bus
*b
) {
362 char t
[3 + 32 + 2 + 1];
366 xsprintf(t
, "OK " SD_ID128_FORMAT_STR
"\r\n", SD_ID128_FORMAT_VAL(b
->server_id
));
368 return bus_socket_auth_write(b
, t
);
371 static int bus_socket_auth_verify_server(sd_bus
*b
) {
375 bool processed
= false;
380 if (b
->rbuffer_size
< 1)
383 /* First char must be a NUL byte */
384 if (*(char*) b
->rbuffer
!= 0)
387 if (b
->rbuffer_size
< 3)
390 /* Begin with the first line */
391 if (b
->auth_rbegin
<= 0)
395 /* Check if line is complete */
396 line
= (char*) b
->rbuffer
+ b
->auth_rbegin
;
397 e
= memmem(line
, b
->rbuffer_size
- b
->auth_rbegin
, "\r\n", 2);
403 if (line_begins(line
, l
, "AUTH ANONYMOUS")) {
405 r
= verify_anonymous_token(b
, line
+ 14, l
- 14);
409 r
= bus_socket_auth_write(b
, "REJECTED\r\n");
411 b
->auth
= BUS_AUTH_ANONYMOUS
;
412 r
= bus_socket_auth_write_ok(b
);
415 } else if (line_begins(line
, l
, "AUTH EXTERNAL")) {
417 r
= verify_external_token(b
, line
+ 13, l
- 13);
421 r
= bus_socket_auth_write(b
, "REJECTED\r\n");
423 b
->auth
= BUS_AUTH_EXTERNAL
;
424 r
= bus_socket_auth_write_ok(b
);
427 } else if (line_begins(line
, l
, "AUTH"))
428 r
= bus_socket_auth_write(b
, "REJECTED EXTERNAL ANONYMOUS\r\n");
429 else if (line_equals(line
, l
, "CANCEL") ||
430 line_begins(line
, l
, "ERROR")) {
432 b
->auth
= _BUS_AUTH_INVALID
;
433 r
= bus_socket_auth_write(b
, "REJECTED\r\n");
435 } else if (line_equals(line
, l
, "BEGIN")) {
437 if (b
->auth
== _BUS_AUTH_INVALID
)
438 r
= bus_socket_auth_write(b
, "ERROR\r\n");
440 /* We can't leave from the auth phase
441 * before we haven't written
442 * everything queued, so let's check
445 if (bus_socket_auth_needs_write(b
))
448 b
->rbuffer_size
-= (e
+ 2 - (char*) b
->rbuffer
);
449 memmove(b
->rbuffer
, e
+ 2, b
->rbuffer_size
);
450 return bus_start_running(b
);
453 } else if (line_begins(line
, l
, "DATA")) {
455 if (b
->auth
== _BUS_AUTH_INVALID
)
456 r
= bus_socket_auth_write(b
, "ERROR\r\n");
458 if (b
->auth
== BUS_AUTH_ANONYMOUS
)
459 r
= verify_anonymous_token(b
, line
+ 4, l
- 4);
461 r
= verify_external_token(b
, line
+ 4, l
- 4);
466 b
->auth
= _BUS_AUTH_INVALID
;
467 r
= bus_socket_auth_write(b
, "REJECTED\r\n");
469 r
= bus_socket_auth_write_ok(b
);
471 } else if (line_equals(line
, l
, "NEGOTIATE_UNIX_FD")) {
472 if (b
->auth
== _BUS_AUTH_INVALID
|| !(b
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
473 r
= bus_socket_auth_write(b
, "ERROR\r\n");
476 r
= bus_socket_auth_write(b
, "AGREE_UNIX_FD\r\n");
479 r
= bus_socket_auth_write(b
, "ERROR\r\n");
484 b
->auth_rbegin
= e
+ 2 - (char*) b
->rbuffer
;
490 static int bus_socket_auth_verify(sd_bus
*b
) {
494 return bus_socket_auth_verify_server(b
);
496 return bus_socket_auth_verify_client(b
);
499 static int bus_socket_read_auth(sd_bus
*b
) {
501 struct iovec iov
= {};
507 struct cmsghdr cmsghdr
;
508 uint8_t buf
[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX
)];
510 bool handle_cmsg
= false;
513 assert(b
->state
== BUS_AUTHENTICATING
);
515 r
= bus_socket_auth_verify(b
);
519 n
= MAX(256u, b
->rbuffer_size
* 2);
521 if (n
> BUS_AUTH_SIZE_MAX
)
522 n
= BUS_AUTH_SIZE_MAX
;
524 if (b
->rbuffer_size
>= n
)
527 p
= realloc(b
->rbuffer
, n
);
533 iov
.iov_base
= (uint8_t*) b
->rbuffer
+ b
->rbuffer_size
;
534 iov
.iov_len
= n
- b
->rbuffer_size
;
537 k
= readv(b
->input_fd
, &iov
, 1);
542 mh
.msg_control
= &control
;
543 mh
.msg_controllen
= sizeof(control
);
545 k
= recvmsg(b
->input_fd
, &mh
, MSG_DONTWAIT
|MSG_NOSIGNAL
|MSG_CMSG_CLOEXEC
);
546 if (k
< 0 && errno
== ENOTSOCK
) {
547 b
->prefer_readv
= true;
548 k
= readv(b
->input_fd
, &iov
, 1);
553 return errno
== EAGAIN
? 0 : -errno
;
557 b
->rbuffer_size
+= k
;
560 struct cmsghdr
*cmsg
;
562 CMSG_FOREACH(cmsg
, &mh
)
563 if (cmsg
->cmsg_level
== SOL_SOCKET
&&
564 cmsg
->cmsg_type
== SCM_RIGHTS
) {
567 /* Whut? We received fds during the auth
568 * protocol? Somebody is playing games with
569 * us. Close them all, and fail */
570 j
= (cmsg
->cmsg_len
- CMSG_LEN(0)) / sizeof(int);
571 close_many((int*) CMSG_DATA(cmsg
), j
);
574 log_debug("Got unexpected auxiliary data with level=%d and type=%d",
575 cmsg
->cmsg_level
, cmsg
->cmsg_type
);
578 r
= bus_socket_auth_verify(b
);
585 void bus_socket_setup(sd_bus
*b
) {
588 /* Increase the buffers to 8 MB */
589 fd_inc_rcvbuf(b
->input_fd
, SNDBUF_SIZE
);
590 fd_inc_sndbuf(b
->output_fd
, SNDBUF_SIZE
);
592 b
->is_kernel
= false;
593 b
->message_version
= 1;
594 b
->message_endian
= 0;
597 static void bus_get_peercred(sd_bus
*b
) {
602 /* Get the peer for socketpair() sockets */
603 b
->ucred_valid
= getpeercred(b
->input_fd
, &b
->ucred
) >= 0;
605 /* Get the SELinux context of the peer */
606 r
= getpeersec(b
->input_fd
, &b
->label
);
607 if (r
< 0 && r
!= -EOPNOTSUPP
)
608 log_debug_errno(r
, "Failed to determine peer security context: %m");
611 static int bus_socket_start_auth_client(sd_bus
*b
) {
613 const char *auth_suffix
, *auth_prefix
;
617 if (b
->anonymous_auth
) {
618 auth_prefix
= "\0AUTH ANONYMOUS ";
620 /* For ANONYMOUS auth we send some arbitrary "trace" string */
622 b
->auth_buffer
= hexmem("anonymous", l
);
624 char text
[DECIMAL_STR_MAX(uid_t
) + 1];
626 auth_prefix
= "\0AUTH EXTERNAL ";
628 xsprintf(text
, UID_FMT
, geteuid());
631 b
->auth_buffer
= hexmem(text
, l
);
637 if (b
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
638 auth_suffix
= "\r\nNEGOTIATE_UNIX_FD\r\nBEGIN\r\n";
640 auth_suffix
= "\r\nBEGIN\r\n";
642 b
->auth_iovec
[0].iov_base
= (void*) auth_prefix
;
643 b
->auth_iovec
[0].iov_len
= 1 + strlen(auth_prefix
+ 1);
644 b
->auth_iovec
[1].iov_base
= (void*) b
->auth_buffer
;
645 b
->auth_iovec
[1].iov_len
= l
* 2;
646 b
->auth_iovec
[2].iov_base
= (void*) auth_suffix
;
647 b
->auth_iovec
[2].iov_len
= strlen(auth_suffix
);
649 return bus_socket_write_auth(b
);
652 int bus_socket_start_auth(sd_bus
*b
) {
657 b
->state
= BUS_AUTHENTICATING
;
658 b
->auth_timeout
= now(CLOCK_MONOTONIC
) + BUS_DEFAULT_TIMEOUT
;
660 if (sd_is_socket(b
->input_fd
, AF_UNIX
, 0, 0) <= 0)
661 b
->hello_flags
&= ~KDBUS_HELLO_ACCEPT_FD
;
663 if (b
->output_fd
!= b
->input_fd
)
664 if (sd_is_socket(b
->output_fd
, AF_UNIX
, 0, 0) <= 0)
665 b
->hello_flags
&= ~KDBUS_HELLO_ACCEPT_FD
;
668 return bus_socket_read_auth(b
);
670 return bus_socket_start_auth_client(b
);
673 int bus_socket_connect(sd_bus
*b
) {
677 assert(b
->input_fd
< 0);
678 assert(b
->output_fd
< 0);
679 assert(b
->sockaddr
.sa
.sa_family
!= AF_UNSPEC
);
681 b
->input_fd
= socket(b
->sockaddr
.sa
.sa_family
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
685 b
->output_fd
= b
->input_fd
;
689 r
= connect(b
->input_fd
, &b
->sockaddr
.sa
, b
->sockaddr_size
);
691 if (errno
== EINPROGRESS
)
697 return bus_socket_start_auth(b
);
700 int bus_socket_exec(sd_bus
*b
) {
705 assert(b
->input_fd
< 0);
706 assert(b
->output_fd
< 0);
707 assert(b
->exec_path
);
709 r
= socketpair(AF_UNIX
, SOCK_STREAM
|SOCK_NONBLOCK
|SOCK_CLOEXEC
, 0, s
);
721 (void) reset_all_signal_handlers();
722 (void) reset_signal_mask();
724 close_all_fds(s
+1, 1);
726 assert_se(dup3(s
[1], STDIN_FILENO
, 0) == STDIN_FILENO
);
727 assert_se(dup3(s
[1], STDOUT_FILENO
, 0) == STDOUT_FILENO
);
729 if (s
[1] != STDIN_FILENO
&& s
[1] != STDOUT_FILENO
)
732 fd_cloexec(STDIN_FILENO
, false);
733 fd_cloexec(STDOUT_FILENO
, false);
734 fd_nonblock(STDIN_FILENO
, false);
735 fd_nonblock(STDOUT_FILENO
, false);
738 execvp(b
->exec_path
, b
->exec_argv
);
740 const char *argv
[] = { b
->exec_path
, NULL
};
741 execvp(b
->exec_path
, (char**) argv
);
748 b
->output_fd
= b
->input_fd
= s
[0];
752 return bus_socket_start_auth(b
);
755 int bus_socket_take_fd(sd_bus
*b
) {
760 return bus_socket_start_auth(b
);
763 int bus_socket_write_message(sd_bus
*bus
, sd_bus_message
*m
, size_t *idx
) {
773 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
775 if (*idx
>= BUS_MESSAGE_SIZE(m
))
778 r
= bus_message_setup_iovec(m
);
782 n
= m
->n_iovec
* sizeof(struct iovec
);
784 memcpy(iov
, m
->iovec
, n
);
787 iovec_advance(iov
, &j
, *idx
);
789 if (bus
->prefer_writev
)
790 k
= writev(bus
->output_fd
, iov
, m
->n_iovec
);
794 .msg_iovlen
= m
->n_iovec
,
798 struct cmsghdr
*control
;
800 mh
.msg_control
= control
= alloca(CMSG_SPACE(sizeof(int) * m
->n_fds
));
801 mh
.msg_controllen
= control
->cmsg_len
= CMSG_LEN(sizeof(int) * m
->n_fds
);
802 control
->cmsg_level
= SOL_SOCKET
;
803 control
->cmsg_type
= SCM_RIGHTS
;
804 memcpy(CMSG_DATA(control
), m
->fds
, sizeof(int) * m
->n_fds
);
807 k
= sendmsg(bus
->output_fd
, &mh
, MSG_DONTWAIT
|MSG_NOSIGNAL
);
808 if (k
< 0 && errno
== ENOTSOCK
) {
809 bus
->prefer_writev
= true;
810 k
= writev(bus
->output_fd
, iov
, m
->n_iovec
);
815 return errno
== EAGAIN
? 0 : -errno
;
821 static int bus_socket_read_message_need(sd_bus
*bus
, size_t *need
) {
828 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
830 if (bus
->rbuffer_size
< sizeof(struct bus_header
)) {
831 *need
= sizeof(struct bus_header
) + 8;
833 /* Minimum message size:
837 * Method Call: +2 string headers
838 * Signal: +3 string headers
839 * Method Error: +1 string headers
841 * Method Reply: +1 uint32 headers
843 * A string header is at least 9 bytes
844 * A uint32 header is at least 8 bytes
846 * Hence the minimum message size of a valid message
847 * is header + 8 bytes */
852 a
= ((const uint32_t*) bus
->rbuffer
)[1];
853 b
= ((const uint32_t*) bus
->rbuffer
)[3];
855 e
= ((const uint8_t*) bus
->rbuffer
)[0];
856 if (e
== BUS_LITTLE_ENDIAN
) {
859 } else if (e
== BUS_BIG_ENDIAN
) {
865 sum
= (uint64_t) sizeof(struct bus_header
) + (uint64_t) ALIGN_TO(b
, 8) + (uint64_t) a
;
866 if (sum
>= BUS_MESSAGE_SIZE_MAX
)
869 *need
= (size_t) sum
;
873 static int bus_socket_make_message(sd_bus
*bus
, size_t size
) {
879 assert(bus
->rbuffer_size
>= size
);
880 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
882 r
= bus_rqueue_make_room(bus
);
886 if (bus
->rbuffer_size
> size
) {
887 b
= memdup((const uint8_t*) bus
->rbuffer
+ size
,
888 bus
->rbuffer_size
- size
);
894 r
= bus_message_from_malloc(bus
,
896 bus
->fds
, bus
->n_fds
,
905 bus
->rbuffer_size
-= size
;
910 bus
->rqueue
[bus
->rqueue_size
++] = t
;
915 int bus_socket_read_message(sd_bus
*bus
) {
917 struct iovec iov
= {};
923 struct cmsghdr cmsghdr
;
924 uint8_t buf
[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX
)];
926 bool handle_cmsg
= false;
929 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
931 r
= bus_socket_read_message_need(bus
, &need
);
935 if (bus
->rbuffer_size
>= need
)
936 return bus_socket_make_message(bus
, need
);
938 b
= realloc(bus
->rbuffer
, need
);
944 iov
.iov_base
= (uint8_t*) bus
->rbuffer
+ bus
->rbuffer_size
;
945 iov
.iov_len
= need
- bus
->rbuffer_size
;
947 if (bus
->prefer_readv
)
948 k
= readv(bus
->input_fd
, &iov
, 1);
953 mh
.msg_control
= &control
;
954 mh
.msg_controllen
= sizeof(control
);
956 k
= recvmsg(bus
->input_fd
, &mh
, MSG_DONTWAIT
|MSG_NOSIGNAL
|MSG_CMSG_CLOEXEC
);
957 if (k
< 0 && errno
== ENOTSOCK
) {
958 bus
->prefer_readv
= true;
959 k
= readv(bus
->input_fd
, &iov
, 1);
964 return errno
== EAGAIN
? 0 : -errno
;
968 bus
->rbuffer_size
+= k
;
971 struct cmsghdr
*cmsg
;
973 CMSG_FOREACH(cmsg
, &mh
)
974 if (cmsg
->cmsg_level
== SOL_SOCKET
&&
975 cmsg
->cmsg_type
== SCM_RIGHTS
) {
978 n
= (cmsg
->cmsg_len
- CMSG_LEN(0)) / sizeof(int);
981 /* Whut? We received fds but this
982 * isn't actually enabled? Close them,
985 close_many((int*) CMSG_DATA(cmsg
), n
);
989 f
= realloc(bus
->fds
, sizeof(int) * (bus
->n_fds
+ n
));
991 close_many((int*) CMSG_DATA(cmsg
), n
);
995 memcpy(f
+ bus
->n_fds
, CMSG_DATA(cmsg
), n
* sizeof(int));
999 log_debug("Got unexpected auxiliary data with level=%d and type=%d",
1000 cmsg
->cmsg_level
, cmsg
->cmsg_type
);
1003 r
= bus_socket_read_message_need(bus
, &need
);
1007 if (bus
->rbuffer_size
>= need
)
1008 return bus_socket_make_message(bus
, need
);
1013 int bus_socket_process_opening(sd_bus
*b
) {
1015 socklen_t slen
= sizeof(error
);
1022 assert(b
->state
== BUS_OPENING
);
1028 if (!(p
.revents
& (POLLOUT
|POLLERR
|POLLHUP
)))
1031 r
= getsockopt(b
->output_fd
, SOL_SOCKET
, SO_ERROR
, &error
, &slen
);
1033 b
->last_connect_error
= errno
;
1034 else if (error
!= 0)
1035 b
->last_connect_error
= error
;
1036 else if (p
.revents
& (POLLERR
|POLLHUP
))
1037 b
->last_connect_error
= ECONNREFUSED
;
1039 return bus_socket_start_auth(b
);
1041 return bus_next_address(b
);
1044 int bus_socket_process_authenticating(sd_bus
*b
) {
1048 assert(b
->state
== BUS_AUTHENTICATING
);
1050 if (now(CLOCK_MONOTONIC
) >= b
->auth_timeout
)
1053 r
= bus_socket_write_auth(b
);
1057 return bus_socket_read_auth(b
);