]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-bus/bus-container.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
6 #include "bus-container.h"
7 #include "bus-internal.h"
8 #include "bus-socket.h"
10 #include "namespace-util.h"
11 #include "process-util.h"
12 #include "string-util.h"
14 int bus_container_connect_socket(sd_bus
*b
) {
15 _cleanup_close_pair_
int pair
[2] = { -1, -1 };
16 _cleanup_close_
int pidnsfd
= -EBADF
, mntnsfd
= -EBADF
, usernsfd
= -EBADF
, rootfd
= -EBADF
;
22 assert(b
->input_fd
< 0);
23 assert(b
->output_fd
< 0);
24 assert(b
->nspid
> 0 || b
->machine
);
27 log_debug("sd-bus: connecting bus%s%s to machine %s...",
28 b
->description
? " " : "", strempty(b
->description
), b
->machine
);
30 r
= container_get_leader(b
->machine
, &b
->nspid
);
34 log_debug("sd-bus: connecting bus%s%s to namespace of PID "PID_FMT
"...",
35 b
->description
? " " : "", strempty(b
->description
), b
->nspid
);
37 r
= namespace_open(b
->nspid
, &pidnsfd
, &mntnsfd
, NULL
, &usernsfd
, &rootfd
);
39 return log_debug_errno(r
, "Failed to open namespace of PID "PID_FMT
": %m", b
->nspid
);
41 b
->input_fd
= socket(b
->sockaddr
.sa
.sa_family
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
43 return log_debug_errno(errno
, "Failed to create a socket: %m");
45 b
->input_fd
= fd_move_above_stdio(b
->input_fd
);
47 b
->output_fd
= b
->input_fd
;
51 if (socketpair(AF_UNIX
, SOCK_SEQPACKET
|SOCK_CLOEXEC
, 0, pair
) < 0)
52 return log_debug_errno(errno
, "Failed to create a socket pair: %m");
54 r
= namespace_fork("(sd-buscntrns)", "(sd-buscntr)", NULL
, 0, FORK_RESET_SIGNALS
|FORK_DEATHSIG
,
55 pidnsfd
, mntnsfd
, -1, usernsfd
, rootfd
, &child
);
57 return log_debug_errno(r
, "Failed to create namespace for (sd-buscntr): %m");
59 pair
[0] = safe_close(pair
[0]);
61 r
= connect(b
->input_fd
, &b
->sockaddr
.sa
, b
->sockaddr_size
);
63 /* Try to send error up */
65 (void) write(pair
[1], &error_buf
, sizeof(error_buf
));
72 pair
[1] = safe_close(pair
[1]);
74 r
= wait_for_terminate_and_check("(sd-buscntrns)", child
, 0);
77 bool nonzero_exit_status
= r
!= EXIT_SUCCESS
;
79 n
= read(pair
[0], &error_buf
, sizeof(error_buf
));
81 return log_debug_errno(errno
, "Failed to read error status from (sd-buscntr): %m");
84 if (n
!= sizeof(error_buf
))
85 return log_debug_errno(SYNTHETIC_ERRNO(EIO
),
86 "Read error status of unexpected length %zd from (sd-buscntr): %m", n
);
89 return log_debug_errno(SYNTHETIC_ERRNO(EBADMSG
),
90 "Got unexpected error status from (sd-buscntr): %m");
92 if (error_buf
== EINPROGRESS
)
96 return log_debug_errno(error_buf
, "(sd-buscntr) failed to connect to D-Bus socket: %m");
99 if (nonzero_exit_status
)
102 return bus_socket_start_auth(b
);