]>
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 "alloc-util.h"
31 #include "bus-internal.h"
32 #include "bus-message.h"
33 #include "bus-socket.h"
35 #include "formats-util.h"
36 #include "hexdecoct.h"
39 #include "signal-util.h"
40 #include "stdio-util.h"
41 #include "string-util.h"
42 #include "user-util.h"
46 #define SNDBUF_SIZE (8*1024*1024)
48 static void iovec_advance(struct iovec iov
[], unsigned *idx
, size_t size
) {
51 struct iovec
*i
= iov
+ *idx
;
53 if (i
->iov_len
> size
) {
54 i
->iov_base
= (uint8_t*) i
->iov_base
+ size
;
68 static int append_iovec(sd_bus_message
*m
, const void *p
, size_t sz
) {
73 m
->iovec
[m
->n_iovec
].iov_base
= (void*) p
;
74 m
->iovec
[m
->n_iovec
].iov_len
= sz
;
80 static int bus_message_setup_iovec(sd_bus_message
*m
) {
81 struct bus_body_part
*part
;
93 n
= 1 + m
->n_body_parts
;
94 if (n
< ELEMENTSOF(m
->iovec_fixed
))
95 m
->iovec
= m
->iovec_fixed
;
97 m
->iovec
= new(struct iovec
, n
);
104 r
= append_iovec(m
, m
->header
, BUS_MESSAGE_BODY_BEGIN(m
));
108 MESSAGE_FOREACH_PART(part
, i
, m
) {
109 r
= bus_body_part_map(part
);
113 r
= append_iovec(m
, part
->data
, part
->size
);
118 assert(n
== m
->n_iovec
);
127 bool bus_socket_auth_needs_write(sd_bus
*b
) {
131 if (b
->auth_index
>= ELEMENTSOF(b
->auth_iovec
))
134 for (i
= b
->auth_index
; i
< ELEMENTSOF(b
->auth_iovec
); i
++) {
135 struct iovec
*j
= b
->auth_iovec
+ i
;
144 static int bus_socket_write_auth(sd_bus
*b
) {
148 assert(b
->state
== BUS_AUTHENTICATING
);
150 if (!bus_socket_auth_needs_write(b
))
153 if (b
->prefer_writev
)
154 k
= writev(b
->output_fd
, b
->auth_iovec
+ b
->auth_index
, ELEMENTSOF(b
->auth_iovec
) - b
->auth_index
);
159 mh
.msg_iov
= b
->auth_iovec
+ b
->auth_index
;
160 mh
.msg_iovlen
= ELEMENTSOF(b
->auth_iovec
) - b
->auth_index
;
162 k
= sendmsg(b
->output_fd
, &mh
, MSG_DONTWAIT
|MSG_NOSIGNAL
);
163 if (k
< 0 && errno
== ENOTSOCK
) {
164 b
->prefer_writev
= true;
165 k
= writev(b
->output_fd
, b
->auth_iovec
+ b
->auth_index
, ELEMENTSOF(b
->auth_iovec
) - b
->auth_index
);
170 return errno
== EAGAIN
? 0 : -errno
;
172 iovec_advance(b
->auth_iovec
, &b
->auth_index
, (size_t) k
);
176 static int bus_socket_auth_verify_client(sd_bus
*b
) {
184 /* We expect two response lines: "OK" and possibly
187 e
= memmem_safe(b
->rbuffer
, b
->rbuffer_size
, "\r\n", 2);
191 if (b
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
) {
192 f
= memmem(e
+ 2, b
->rbuffer_size
- (e
- (char*) b
->rbuffer
) - 2, "\r\n", 2);
202 /* Nice! We got all the lines we need. First check the OK
205 if (e
- (char*) b
->rbuffer
!= 3 + 32)
208 if (memcmp(b
->rbuffer
, "OK ", 3))
211 b
->auth
= b
->anonymous_auth
? BUS_AUTH_ANONYMOUS
: BUS_AUTH_EXTERNAL
;
213 for (i
= 0; i
< 32; i
+= 2) {
216 x
= unhexchar(((char*) b
->rbuffer
)[3 + i
]);
217 y
= unhexchar(((char*) b
->rbuffer
)[3 + i
+ 1]);
222 peer
.bytes
[i
/2] = ((uint8_t) x
<< 4 | (uint8_t) y
);
225 if (!sd_id128_equal(b
->server_id
, SD_ID128_NULL
) &&
226 !sd_id128_equal(b
->server_id
, peer
))
231 /* And possibly check the second line, too */
235 (f
- e
== strlen("\r\nAGREE_UNIX_FD")) &&
236 memcmp(e
+ 2, "AGREE_UNIX_FD", strlen("AGREE_UNIX_FD")) == 0;
238 b
->rbuffer_size
-= (start
- (char*) b
->rbuffer
);
239 memmove(b
->rbuffer
, start
, b
->rbuffer_size
);
241 r
= bus_start_running(b
);
248 static bool line_equals(const char *s
, size_t m
, const char *line
) {
255 return memcmp(s
, line
, l
) == 0;
258 static bool line_begins(const char *s
, size_t m
, const char *word
) {
265 if (memcmp(s
, word
, l
) != 0)
268 return m
== l
|| (m
> l
&& s
[l
] == ' ');
271 static int verify_anonymous_token(sd_bus
*b
, const char *p
, size_t l
) {
272 _cleanup_free_
char *token
= NULL
;
276 if (!b
->anonymous_auth
)
288 r
= unhexmem(p
, l
, (void **) &token
, &len
);
292 if (memchr(token
, 0, len
))
295 return !!utf8_is_valid(token
);
298 static int verify_external_token(sd_bus
*b
, const char *p
, size_t l
) {
299 _cleanup_free_
char *token
= NULL
;
304 /* We don't do any real authentication here. Instead, we if
305 * the owner of this bus wanted authentication he should have
306 * checked SO_PEERCRED before even creating the bus object. */
308 if (!b
->anonymous_auth
&& !b
->ucred_valid
)
320 r
= unhexmem(p
, l
, (void**) &token
, &len
);
324 if (memchr(token
, 0, len
))
327 r
= parse_uid(token
, &u
);
331 /* We ignore the passed value if anonymous authentication is
333 if (!b
->anonymous_auth
&& u
!= b
->ucred
.uid
)
339 static int bus_socket_auth_write(sd_bus
*b
, const char *t
) {
346 /* We only make use of the first iovec */
347 assert(b
->auth_index
== 0 || b
->auth_index
== 1);
350 p
= malloc(b
->auth_iovec
[0].iov_len
+ l
);
354 memcpy(p
, b
->auth_iovec
[0].iov_base
, b
->auth_iovec
[0].iov_len
);
355 memcpy(p
+ b
->auth_iovec
[0].iov_len
, t
, l
);
357 b
->auth_iovec
[0].iov_base
= p
;
358 b
->auth_iovec
[0].iov_len
+= l
;
360 free(b
->auth_buffer
);
366 static int bus_socket_auth_write_ok(sd_bus
*b
) {
367 char t
[3 + 32 + 2 + 1];
371 xsprintf(t
, "OK " SD_ID128_FORMAT_STR
"\r\n", SD_ID128_FORMAT_VAL(b
->server_id
));
373 return bus_socket_auth_write(b
, t
);
376 static int bus_socket_auth_verify_server(sd_bus
*b
) {
380 bool processed
= false;
385 if (b
->rbuffer_size
< 1)
388 /* First char must be a NUL byte */
389 if (*(char*) b
->rbuffer
!= 0)
392 if (b
->rbuffer_size
< 3)
395 /* Begin with the first line */
396 if (b
->auth_rbegin
<= 0)
400 /* Check if line is complete */
401 line
= (char*) b
->rbuffer
+ b
->auth_rbegin
;
402 e
= memmem(line
, b
->rbuffer_size
- b
->auth_rbegin
, "\r\n", 2);
408 if (line_begins(line
, l
, "AUTH ANONYMOUS")) {
410 r
= verify_anonymous_token(b
, line
+ 14, l
- 14);
414 r
= bus_socket_auth_write(b
, "REJECTED\r\n");
416 b
->auth
= BUS_AUTH_ANONYMOUS
;
417 r
= bus_socket_auth_write_ok(b
);
420 } else if (line_begins(line
, l
, "AUTH EXTERNAL")) {
422 r
= verify_external_token(b
, line
+ 13, l
- 13);
426 r
= bus_socket_auth_write(b
, "REJECTED\r\n");
428 b
->auth
= BUS_AUTH_EXTERNAL
;
429 r
= bus_socket_auth_write_ok(b
);
432 } else if (line_begins(line
, l
, "AUTH"))
433 r
= bus_socket_auth_write(b
, "REJECTED EXTERNAL ANONYMOUS\r\n");
434 else if (line_equals(line
, l
, "CANCEL") ||
435 line_begins(line
, l
, "ERROR")) {
437 b
->auth
= _BUS_AUTH_INVALID
;
438 r
= bus_socket_auth_write(b
, "REJECTED\r\n");
440 } else if (line_equals(line
, l
, "BEGIN")) {
442 if (b
->auth
== _BUS_AUTH_INVALID
)
443 r
= bus_socket_auth_write(b
, "ERROR\r\n");
445 /* We can't leave from the auth phase
446 * before we haven't written
447 * everything queued, so let's check
450 if (bus_socket_auth_needs_write(b
))
453 b
->rbuffer_size
-= (e
+ 2 - (char*) b
->rbuffer
);
454 memmove(b
->rbuffer
, e
+ 2, b
->rbuffer_size
);
455 return bus_start_running(b
);
458 } else if (line_begins(line
, l
, "DATA")) {
460 if (b
->auth
== _BUS_AUTH_INVALID
)
461 r
= bus_socket_auth_write(b
, "ERROR\r\n");
463 if (b
->auth
== BUS_AUTH_ANONYMOUS
)
464 r
= verify_anonymous_token(b
, line
+ 4, l
- 4);
466 r
= verify_external_token(b
, line
+ 4, l
- 4);
471 b
->auth
= _BUS_AUTH_INVALID
;
472 r
= bus_socket_auth_write(b
, "REJECTED\r\n");
474 r
= bus_socket_auth_write_ok(b
);
476 } else if (line_equals(line
, l
, "NEGOTIATE_UNIX_FD")) {
477 if (b
->auth
== _BUS_AUTH_INVALID
|| !(b
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
))
478 r
= bus_socket_auth_write(b
, "ERROR\r\n");
481 r
= bus_socket_auth_write(b
, "AGREE_UNIX_FD\r\n");
484 r
= bus_socket_auth_write(b
, "ERROR\r\n");
489 b
->auth_rbegin
= e
+ 2 - (char*) b
->rbuffer
;
495 static int bus_socket_auth_verify(sd_bus
*b
) {
499 return bus_socket_auth_verify_server(b
);
501 return bus_socket_auth_verify_client(b
);
504 static int bus_socket_read_auth(sd_bus
*b
) {
506 struct iovec iov
= {};
512 struct cmsghdr cmsghdr
;
513 uint8_t buf
[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX
)];
515 bool handle_cmsg
= false;
518 assert(b
->state
== BUS_AUTHENTICATING
);
520 r
= bus_socket_auth_verify(b
);
524 n
= MAX(256u, b
->rbuffer_size
* 2);
526 if (n
> BUS_AUTH_SIZE_MAX
)
527 n
= BUS_AUTH_SIZE_MAX
;
529 if (b
->rbuffer_size
>= n
)
532 p
= realloc(b
->rbuffer
, n
);
538 iov
.iov_base
= (uint8_t*) b
->rbuffer
+ b
->rbuffer_size
;
539 iov
.iov_len
= n
- b
->rbuffer_size
;
542 k
= readv(b
->input_fd
, &iov
, 1);
547 mh
.msg_control
= &control
;
548 mh
.msg_controllen
= sizeof(control
);
550 k
= recvmsg(b
->input_fd
, &mh
, MSG_DONTWAIT
|MSG_NOSIGNAL
|MSG_CMSG_CLOEXEC
);
551 if (k
< 0 && errno
== ENOTSOCK
) {
552 b
->prefer_readv
= true;
553 k
= readv(b
->input_fd
, &iov
, 1);
558 return errno
== EAGAIN
? 0 : -errno
;
562 b
->rbuffer_size
+= k
;
565 struct cmsghdr
*cmsg
;
567 CMSG_FOREACH(cmsg
, &mh
)
568 if (cmsg
->cmsg_level
== SOL_SOCKET
&&
569 cmsg
->cmsg_type
== SCM_RIGHTS
) {
572 /* Whut? We received fds during the auth
573 * protocol? Somebody is playing games with
574 * us. Close them all, and fail */
575 j
= (cmsg
->cmsg_len
- CMSG_LEN(0)) / sizeof(int);
576 close_many((int*) CMSG_DATA(cmsg
), j
);
579 log_debug("Got unexpected auxiliary data with level=%d and type=%d",
580 cmsg
->cmsg_level
, cmsg
->cmsg_type
);
583 r
= bus_socket_auth_verify(b
);
590 void bus_socket_setup(sd_bus
*b
) {
593 /* Increase the buffers to 8 MB */
594 fd_inc_rcvbuf(b
->input_fd
, SNDBUF_SIZE
);
595 fd_inc_sndbuf(b
->output_fd
, SNDBUF_SIZE
);
597 b
->is_kernel
= false;
598 b
->message_version
= 1;
599 b
->message_endian
= 0;
602 static void bus_get_peercred(sd_bus
*b
) {
607 /* Get the peer for socketpair() sockets */
608 b
->ucred_valid
= getpeercred(b
->input_fd
, &b
->ucred
) >= 0;
610 /* Get the SELinux context of the peer */
611 r
= getpeersec(b
->input_fd
, &b
->label
);
612 if (r
< 0 && r
!= -EOPNOTSUPP
)
613 log_debug_errno(r
, "Failed to determine peer security context: %m");
616 static int bus_socket_start_auth_client(sd_bus
*b
) {
618 const char *auth_suffix
, *auth_prefix
;
622 if (b
->anonymous_auth
) {
623 auth_prefix
= "\0AUTH ANONYMOUS ";
625 /* For ANONYMOUS auth we send some arbitrary "trace" string */
627 b
->auth_buffer
= hexmem("anonymous", l
);
629 char text
[DECIMAL_STR_MAX(uid_t
) + 1];
631 auth_prefix
= "\0AUTH EXTERNAL ";
633 xsprintf(text
, UID_FMT
, geteuid());
636 b
->auth_buffer
= hexmem(text
, l
);
642 if (b
->hello_flags
& KDBUS_HELLO_ACCEPT_FD
)
643 auth_suffix
= "\r\nNEGOTIATE_UNIX_FD\r\nBEGIN\r\n";
645 auth_suffix
= "\r\nBEGIN\r\n";
647 b
->auth_iovec
[0].iov_base
= (void*) auth_prefix
;
648 b
->auth_iovec
[0].iov_len
= 1 + strlen(auth_prefix
+ 1);
649 b
->auth_iovec
[1].iov_base
= (void*) b
->auth_buffer
;
650 b
->auth_iovec
[1].iov_len
= l
* 2;
651 b
->auth_iovec
[2].iov_base
= (void*) auth_suffix
;
652 b
->auth_iovec
[2].iov_len
= strlen(auth_suffix
);
654 return bus_socket_write_auth(b
);
657 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
->hello_flags
&= ~KDBUS_HELLO_ACCEPT_FD
;
668 if (b
->output_fd
!= b
->input_fd
)
669 if (sd_is_socket(b
->output_fd
, AF_UNIX
, 0, 0) <= 0)
670 b
->hello_flags
&= ~KDBUS_HELLO_ACCEPT_FD
;
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
;
694 r
= connect(b
->input_fd
, &b
->sockaddr
.sa
, b
->sockaddr_size
);
696 if (errno
== EINPROGRESS
)
702 return bus_socket_start_auth(b
);
705 int bus_socket_exec(sd_bus
*b
) {
710 assert(b
->input_fd
< 0);
711 assert(b
->output_fd
< 0);
712 assert(b
->exec_path
);
714 r
= socketpair(AF_UNIX
, SOCK_STREAM
|SOCK_NONBLOCK
|SOCK_CLOEXEC
, 0, s
);
726 (void) reset_all_signal_handlers();
727 (void) reset_signal_mask();
729 close_all_fds(s
+1, 1);
731 assert_se(dup3(s
[1], STDIN_FILENO
, 0) == STDIN_FILENO
);
732 assert_se(dup3(s
[1], STDOUT_FILENO
, 0) == STDOUT_FILENO
);
734 if (s
[1] != STDIN_FILENO
&& s
[1] != STDOUT_FILENO
)
737 fd_cloexec(STDIN_FILENO
, false);
738 fd_cloexec(STDOUT_FILENO
, false);
739 fd_nonblock(STDIN_FILENO
, false);
740 fd_nonblock(STDOUT_FILENO
, false);
743 execvp(b
->exec_path
, b
->exec_argv
);
745 const char *argv
[] = { b
->exec_path
, NULL
};
746 execvp(b
->exec_path
, (char**) argv
);
753 b
->output_fd
= b
->input_fd
= s
[0];
757 return bus_socket_start_auth(b
);
760 int bus_socket_take_fd(sd_bus
*b
) {
765 return bus_socket_start_auth(b
);
768 int bus_socket_write_message(sd_bus
*bus
, sd_bus_message
*m
, size_t *idx
) {
778 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
780 if (*idx
>= BUS_MESSAGE_SIZE(m
))
783 r
= bus_message_setup_iovec(m
);
787 n
= m
->n_iovec
* sizeof(struct iovec
);
789 memcpy(iov
, m
->iovec
, n
);
792 iovec_advance(iov
, &j
, *idx
);
794 if (bus
->prefer_writev
)
795 k
= writev(bus
->output_fd
, iov
, m
->n_iovec
);
799 .msg_iovlen
= m
->n_iovec
,
803 struct cmsghdr
*control
;
805 mh
.msg_control
= control
= alloca(CMSG_SPACE(sizeof(int) * m
->n_fds
));
806 mh
.msg_controllen
= control
->cmsg_len
= CMSG_LEN(sizeof(int) * m
->n_fds
);
807 control
->cmsg_level
= SOL_SOCKET
;
808 control
->cmsg_type
= SCM_RIGHTS
;
809 memcpy(CMSG_DATA(control
), m
->fds
, sizeof(int) * m
->n_fds
);
812 k
= sendmsg(bus
->output_fd
, &mh
, MSG_DONTWAIT
|MSG_NOSIGNAL
);
813 if (k
< 0 && errno
== ENOTSOCK
) {
814 bus
->prefer_writev
= true;
815 k
= writev(bus
->output_fd
, iov
, m
->n_iovec
);
820 return errno
== EAGAIN
? 0 : -errno
;
826 static int bus_socket_read_message_need(sd_bus
*bus
, size_t *need
) {
833 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
835 if (bus
->rbuffer_size
< sizeof(struct bus_header
)) {
836 *need
= sizeof(struct bus_header
) + 8;
838 /* Minimum message size:
842 * Method Call: +2 string headers
843 * Signal: +3 string headers
844 * Method Error: +1 string headers
846 * Method Reply: +1 uint32 headers
848 * A string header is at least 9 bytes
849 * A uint32 header is at least 8 bytes
851 * Hence the minimum message size of a valid message
852 * is header + 8 bytes */
857 a
= ((const uint32_t*) bus
->rbuffer
)[1];
858 b
= ((const uint32_t*) bus
->rbuffer
)[3];
860 e
= ((const uint8_t*) bus
->rbuffer
)[0];
861 if (e
== BUS_LITTLE_ENDIAN
) {
864 } else if (e
== BUS_BIG_ENDIAN
) {
870 sum
= (uint64_t) sizeof(struct bus_header
) + (uint64_t) ALIGN_TO(b
, 8) + (uint64_t) a
;
871 if (sum
>= BUS_MESSAGE_SIZE_MAX
)
874 *need
= (size_t) sum
;
878 static int bus_socket_make_message(sd_bus
*bus
, size_t size
) {
884 assert(bus
->rbuffer_size
>= size
);
885 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
887 r
= bus_rqueue_make_room(bus
);
891 if (bus
->rbuffer_size
> size
) {
892 b
= memdup((const uint8_t*) bus
->rbuffer
+ size
,
893 bus
->rbuffer_size
- size
);
899 r
= bus_message_from_malloc(bus
,
901 bus
->fds
, bus
->n_fds
,
910 bus
->rbuffer_size
-= size
;
915 bus
->rqueue
[bus
->rqueue_size
++] = t
;
920 int bus_socket_read_message(sd_bus
*bus
) {
922 struct iovec iov
= {};
928 struct cmsghdr cmsghdr
;
929 uint8_t buf
[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX
)];
931 bool handle_cmsg
= false;
934 assert(bus
->state
== BUS_RUNNING
|| bus
->state
== BUS_HELLO
);
936 r
= bus_socket_read_message_need(bus
, &need
);
940 if (bus
->rbuffer_size
>= need
)
941 return bus_socket_make_message(bus
, need
);
943 b
= realloc(bus
->rbuffer
, need
);
949 iov
.iov_base
= (uint8_t*) bus
->rbuffer
+ bus
->rbuffer_size
;
950 iov
.iov_len
= need
- bus
->rbuffer_size
;
952 if (bus
->prefer_readv
)
953 k
= readv(bus
->input_fd
, &iov
, 1);
958 mh
.msg_control
= &control
;
959 mh
.msg_controllen
= sizeof(control
);
961 k
= recvmsg(bus
->input_fd
, &mh
, MSG_DONTWAIT
|MSG_NOSIGNAL
|MSG_CMSG_CLOEXEC
);
962 if (k
< 0 && errno
== ENOTSOCK
) {
963 bus
->prefer_readv
= true;
964 k
= readv(bus
->input_fd
, &iov
, 1);
969 return errno
== EAGAIN
? 0 : -errno
;
973 bus
->rbuffer_size
+= k
;
976 struct cmsghdr
*cmsg
;
978 CMSG_FOREACH(cmsg
, &mh
)
979 if (cmsg
->cmsg_level
== SOL_SOCKET
&&
980 cmsg
->cmsg_type
== SCM_RIGHTS
) {
983 n
= (cmsg
->cmsg_len
- CMSG_LEN(0)) / sizeof(int);
986 /* Whut? We received fds but this
987 * isn't actually enabled? Close them,
990 close_many((int*) CMSG_DATA(cmsg
), n
);
994 f
= realloc(bus
->fds
, sizeof(int) * (bus
->n_fds
+ n
));
996 close_many((int*) CMSG_DATA(cmsg
), n
);
1000 memcpy(f
+ bus
->n_fds
, CMSG_DATA(cmsg
), n
* sizeof(int));
1004 log_debug("Got unexpected auxiliary data with level=%d and type=%d",
1005 cmsg
->cmsg_level
, cmsg
->cmsg_type
);
1008 r
= bus_socket_read_message_need(bus
, &need
);
1012 if (bus
->rbuffer_size
>= need
)
1013 return bus_socket_make_message(bus
, need
);
1018 int bus_socket_process_opening(sd_bus
*b
) {
1020 socklen_t slen
= sizeof(error
);
1027 assert(b
->state
== BUS_OPENING
);
1033 if (!(p
.revents
& (POLLOUT
|POLLERR
|POLLHUP
)))
1036 r
= getsockopt(b
->output_fd
, SOL_SOCKET
, SO_ERROR
, &error
, &slen
);
1038 b
->last_connect_error
= errno
;
1039 else if (error
!= 0)
1040 b
->last_connect_error
= error
;
1041 else if (p
.revents
& (POLLERR
|POLLHUP
))
1042 b
->last_connect_error
= ECONNREFUSED
;
1044 return bus_socket_start_auth(b
);
1046 return bus_next_address(b
);
1049 int bus_socket_process_authenticating(sd_bus
*b
) {
1053 assert(b
->state
== BUS_AUTHENTICATING
);
1055 if (now(CLOCK_MONOTONIC
) >= b
->auth_timeout
)
1058 r
= bus_socket_write_auth(b
);
1062 return bus_socket_read_auth(b
);