diff options
author | Mark Hindley <mark@hindley.org.uk> | 2018-10-29 15:58:23 +0000 |
---|---|---|
committer | Mark Hindley <mark@hindley.org.uk> | 2018-10-30 16:35:33 +0000 |
commit | a40b5201585a0fa96d1bcdfc4584b5d1ff7e2583 (patch) | |
tree | 605dc2f4ccaf782d2e928d72bbdeb6330abf521d /src/libelogind/sd-daemon/sd-daemon.c | |
parent | 48ae8adcd5d880d056a6ec6f68a31d38db24e55d (diff) | |
parent | 1f0d51f2fc42fcaa55d7fcd536dc722d69344454 (diff) |
Merge remote-tracking branch 'origin/upstream/latest' into merge_v239
Diffstat (limited to 'src/libelogind/sd-daemon/sd-daemon.c')
-rw-r--r-- | src/libelogind/sd-daemon/sd-daemon.c | 81 |
1 files changed, 37 insertions, 44 deletions
diff --git a/src/libelogind/sd-daemon/sd-daemon.c b/src/libelogind/sd-daemon/sd-daemon.c index 47fc3a422..b9815ebaa 100644 --- a/src/libelogind/sd-daemon/sd-daemon.c +++ b/src/libelogind/sd-daemon/sd-daemon.c @@ -1,20 +1,5 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ /*** - This file is part of systemd. - - Copyright 2010 Lennart Poettering - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see <http://www.gnu.org/licenses/>. ***/ #include <errno.h> @@ -38,10 +23,14 @@ #include "fs-util.h" #include "parse-util.h" #include "path-util.h" +//#include "process-util.h" #include "socket-util.h" #include "strv.h" #include "util.h" +/// Additional includes needed by elogind +#include "process-util.h" + #define SNDBUF_SIZE (8*1024*1024) static void unsetenv_all(bool unset_environment) { @@ -70,7 +59,7 @@ _public_ int sd_listen_fds(int unset_environment) { goto finish; /* Is this for us? */ - if (getpid() != pid) { + if (getpid_cached() != pid) { r = 0; goto finish; } @@ -139,8 +128,7 @@ _public_ int sd_listen_fds_with_names(int unset_environment, char ***names) { return r; } - *names = l; - l = NULL; + *names = TAKE_PTR(l); return n_fds; } @@ -161,7 +149,7 @@ _public_ int sd_is_fifo(int fd, const char *path) { if (stat(path, &st_path) < 0) { - if (errno == ENOENT || errno == ENOTDIR) + if (IN_SET(errno, ENOENT, ENOTDIR)) return 0; return -errno; @@ -191,7 +179,7 @@ _public_ int sd_is_special(int fd, const char *path) { if (stat(path, &st_path) < 0) { - if (errno == ENOENT || errno == ENOTDIR) + if (IN_SET(errno, ENOENT, ENOTDIR)) return 0; return -errno; @@ -297,8 +285,7 @@ _public_ int sd_is_socket_inet(int fd, int family, int type, int listening, uint if (l < sizeof(sa_family_t)) return -EINVAL; - if (sockaddr.sa.sa_family != AF_INET && - sockaddr.sa.sa_family != AF_INET6) + if (!IN_SET(sockaddr.sa.sa_family, AF_INET, AF_INET6)) return 0; if (family != 0) @@ -306,17 +293,13 @@ _public_ int sd_is_socket_inet(int fd, int family, int type, int listening, uint return 0; if (port > 0) { - if (sockaddr.sa.sa_family == AF_INET) { - if (l < sizeof(struct sockaddr_in)) - return -EINVAL; + unsigned sa_port; - return htobe16(port) == sockaddr.in.sin_port; - } else { - if (l < sizeof(struct sockaddr_in6)) - return -EINVAL; + r = sockaddr_port(&sockaddr.sa, &sa_port); + if (r < 0) + return r; - return htobe16(port) == sockaddr.in6.sin6_port; - } + return port == sa_port; } return 1; @@ -463,7 +446,13 @@ _public_ int sd_is_mq(int fd, const char *path) { } #endif // 0 -_public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char *state, const int *fds, unsigned n_fds) { +_public_ int sd_pid_notify_with_fds( + pid_t pid, + int unset_environment, + const char *state, + const int *fds, + unsigned n_fds) { + union sockaddr_union sockaddr = { .sa.sa_family = AF_UNIX, }; @@ -478,7 +467,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char _cleanup_close_ int fd = -1; struct cmsghdr *cmsg = NULL; const char *e; - bool have_pid; + bool send_ucred; int r; if (!state) { @@ -496,7 +485,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char return 0; /* Must be an abstract socket, or an absolute path */ - if ((e[0] != '@' && e[0] != '/') || e[1] == 0) { + if (!IN_SET(e[0], '@', '/') || e[1] == 0) { r = -EINVAL; goto finish; } @@ -512,7 +501,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char goto finish; } - fd_inc_sndbuf(fd, SNDBUF_SIZE); + (void) fd_inc_sndbuf(fd, SNDBUF_SIZE); iovec.iov_len = strlen(state); @@ -522,13 +511,16 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char msghdr.msg_namelen = SOCKADDR_UN_LEN(sockaddr.un); - have_pid = pid != 0 && pid != getpid(); + send_ucred = + (pid != 0 && pid != getpid_cached()) || + getuid() != geteuid() || + getgid() != getegid(); - if (n_fds > 0 || have_pid) { + if (n_fds > 0 || send_ucred) { /* CMSG_SPACE(0) may return value different than zero, which results in miscalculated controllen. */ msghdr.msg_controllen = (n_fds > 0 ? CMSG_SPACE(sizeof(int) * n_fds) : 0) + - (have_pid ? CMSG_SPACE(sizeof(struct ucred)) : 0); + (send_ucred ? CMSG_SPACE(sizeof(struct ucred)) : 0); msghdr.msg_control = alloca0(msghdr.msg_controllen); @@ -540,11 +532,11 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char memcpy(CMSG_DATA(cmsg), fds, sizeof(int) * n_fds); - if (have_pid) + if (send_ucred) assert_se(cmsg = CMSG_NXTHDR(&msghdr, cmsg)); } - if (have_pid) { + if (send_ucred) { struct ucred *ucred; cmsg->cmsg_level = SOL_SOCKET; @@ -552,7 +544,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred)); ucred = (struct ucred*) CMSG_DATA(cmsg); - ucred->pid = pid; + ucred->pid = pid != 0 ? pid : getpid_cached(); ucred->uid = getuid(); ucred->gid = getgid(); } @@ -565,7 +557,7 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char } /* If that failed, try with our own ucred instead */ - if (have_pid) { + if (send_ucred) { msghdr.msg_controllen -= CMSG_SPACE(sizeof(struct ucred)); if (msghdr.msg_controllen == 0) msghdr.msg_control = NULL; @@ -635,6 +627,7 @@ _public_ int sd_booted(void) { * created. This takes place in mount-setup.c, so is * guaranteed to happen very early during boot. */ +#if 0 /// elogind is always used without systemd running the show. (Well, it should...) return laccess("/run/systemd/system/", F_OK) >= 0; #else return 0; @@ -667,7 +660,7 @@ _public_ int sd_watchdog_enabled(int unset_environment, uint64_t *usec) { goto finish; /* Is this for us? */ - if (getpid() != pid) { + if (getpid_cached() != pid) { r = 0; goto finish; } |