mirror of
https://github.com/systemd/systemd
synced 2024-09-16 06:43:18 +00:00
manager: turn notify socket into abstract namespace socket again
sd_notify() should work for daemons that chroot() as part of their initilization, hence it's a good idea to use an abstract namespace socket which is not affected by chroot.
This commit is contained in:
parent
59cea26a34
commit
29252e9e5b
3
TODO
3
TODO
|
@ -51,9 +51,6 @@ Features:
|
||||||
|
|
||||||
* change Requires=basic.target to RequisiteOverride=basic.target
|
* change Requires=basic.target to RequisiteOverride=basic.target
|
||||||
|
|
||||||
* turn $NOTIFY_SOCKET back into an abstract namespace socket for
|
|
||||||
compatibility with services which chroot()
|
|
||||||
|
|
||||||
* exclude processes marked with argv[0][0]=@ from the normal service killing too
|
* exclude processes marked with argv[0][0]=@ from the normal service killing too
|
||||||
|
|
||||||
* support rd.luks.allow-discards= kernel cmdline params in cryptsetup generator
|
* support rd.luks.allow-discards= kernel cmdline params in cryptsetup generator
|
||||||
|
|
|
@ -74,8 +74,7 @@
|
||||||
#define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
|
#define GC_QUEUE_USEC_MAX (10*USEC_PER_SEC)
|
||||||
|
|
||||||
/* Where clients shall send notification messages to */
|
/* Where clients shall send notification messages to */
|
||||||
#define NOTIFY_SOCKET_SYSTEM "/run/systemd/notify"
|
#define NOTIFY_SOCKET "@/org/freedesktop/systemd1/notify"
|
||||||
#define NOTIFY_SOCKET_USER "@/org/freedesktop/systemd1/notify"
|
|
||||||
|
|
||||||
static int manager_setup_notify(Manager *m) {
|
static int manager_setup_notify(Manager *m) {
|
||||||
union {
|
union {
|
||||||
|
@ -83,13 +82,13 @@ static int manager_setup_notify(Manager *m) {
|
||||||
struct sockaddr_un un;
|
struct sockaddr_un un;
|
||||||
} sa;
|
} sa;
|
||||||
struct epoll_event ev;
|
struct epoll_event ev;
|
||||||
int one = 1, r;
|
int one = 1;
|
||||||
mode_t u;
|
|
||||||
|
|
||||||
assert(m);
|
assert(m);
|
||||||
|
|
||||||
m->notify_watch.type = WATCH_NOTIFY;
|
m->notify_watch.type = WATCH_NOTIFY;
|
||||||
if ((m->notify_watch.fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0)) < 0) {
|
m->notify_watch.fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
|
||||||
|
if (m->notify_watch.fd < 0) {
|
||||||
log_error("Failed to allocate notification socket: %m");
|
log_error("Failed to allocate notification socket: %m");
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
@ -98,20 +97,13 @@ static int manager_setup_notify(Manager *m) {
|
||||||
sa.sa.sa_family = AF_UNIX;
|
sa.sa.sa_family = AF_UNIX;
|
||||||
|
|
||||||
if (getpid() != 1)
|
if (getpid() != 1)
|
||||||
snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET_USER "/%llu", random_ull());
|
snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET "/%llu", random_ull());
|
||||||
else {
|
else
|
||||||
unlink(NOTIFY_SOCKET_SYSTEM);
|
strncpy(sa.un.sun_path, NOTIFY_SOCKET, sizeof(sa.un.sun_path));
|
||||||
strncpy(sa.un.sun_path, NOTIFY_SOCKET_SYSTEM, sizeof(sa.un.sun_path));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sa.un.sun_path[0] == '@')
|
sa.un.sun_path[0] = 0;
|
||||||
sa.un.sun_path[0] = 0;
|
|
||||||
|
|
||||||
u = umask(0111);
|
if (bind(m->notify_watch.fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
|
||||||
r = bind(m->notify_watch.fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1));
|
|
||||||
umask(u);
|
|
||||||
|
|
||||||
if (r < 0) {
|
|
||||||
log_error("bind() failed: %m");
|
log_error("bind() failed: %m");
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
@ -128,10 +120,9 @@ static int manager_setup_notify(Manager *m) {
|
||||||
if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->notify_watch.fd, &ev) < 0)
|
if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->notify_watch.fd, &ev) < 0)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
if (sa.un.sun_path[0] == 0)
|
sa.un.sun_path[0] = '@';
|
||||||
sa.un.sun_path[0] = '@';
|
m->notify_socket = strdup(sa.un.sun_path);
|
||||||
|
if (!m->notify_socket)
|
||||||
if (!(m->notify_socket = strdup(sa.un.sun_path)))
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
log_debug("Using notification socket %s", m->notify_socket);
|
log_debug("Using notification socket %s", m->notify_socket);
|
||||||
|
|
Loading…
Reference in a new issue