From 6279f0e3c4f064a040ef6b60633afac71c2619b5 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 5 Jun 2014 09:55:53 +0200
Subject: [PATCH] socket: add SocketUser= and SocketGroup= for chown()ing
sockets in the file system
This is relatively complex, as we cannot invoke NSS from PID 1, and thus
need to fork a helper process temporarily.
(cherry picked from commit 3900e5fdff688dc3c273f177d9d913b7389d5561)
Conflicts:
src/core/dbus-socket.c
src/core/socket.c
src/shared/exit-status.c
src/shared/exit-status.h
(cherry picked from commit 45d1e4a9908ca1e152fe0b0e8da236d5a6b40b75)
Conflicts:
all over the place :(
---
src/core/shutdown.c | 1 +
src/core/socket.c | 41 +++++++++++++++++++----------------------
src/shared/socket-util.c | 12 ++++++++++++
src/shared/socket-util.h | 2 ++
src/shared/util.h | 7 +++++++
5 files changed, 41 insertions(+), 22 deletions(-)
diff --git a/src/core/shutdown.c b/src/core/shutdown.c
index edebc37f26..be211a6155 100644
--- a/src/core/shutdown.c
+++ b/src/core/shutdown.c
@@ -45,6 +45,7 @@
#include "virt.h"
#include "watchdog.h"
#include "killall.h"
+#include "def.h"
#define FINALIZE_ATTEMPTS 50
diff --git a/src/core/socket.c b/src/core/socket.c
index fba4124225..abb2f17cbf 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -1733,19 +1733,17 @@ static int socket_start(Unit *u) {
/* We cannot fulfill this request right now, try again later
* please! */
- if (IN_SET(s->state,
- SOCKET_STOP_PRE,
- SOCKET_STOP_PRE_SIGKILL,
- SOCKET_STOP_PRE_SIGTERM,
- SOCKET_STOP_POST,
- SOCKET_FINAL_SIGTERM,
- SOCKET_FINAL_SIGKILL))
+ if (s->state == SOCKET_STOP_PRE ||
+ s->state == SOCKET_STOP_PRE_SIGKILL ||
+ s->state == SOCKET_STOP_PRE_SIGTERM ||
+ s->state == SOCKET_STOP_POST ||
+ s->state == SOCKET_FINAL_SIGTERM ||
+ s->state == SOCKET_FINAL_SIGKILL)
return -EAGAIN;
- if (IN_SET(s->state,
- SOCKET_START_PRE,
- SOCKET_START_CHOWN,
- SOCKET_START_POST))
+ if (s->state == SOCKET_START_PRE ||
+ s->state == SOCKET_START_CHOWN ||
+ s->state == SOCKET_START_POST)
return 0;
/* Cannot run this without the service being around */
@@ -1794,21 +1792,20 @@ static int socket_stop(Unit *u) {
assert(s);
/* Already on it */
- if (IN_SET(s->state,
- SOCKET_STOP_PRE,
- SOCKET_STOP_PRE_SIGTERM,
- SOCKET_STOP_PRE_SIGKILL,
- SOCKET_STOP_POST,
- SOCKET_FINAL_SIGTERM,
- SOCKET_FINAL_SIGKILL))
+ if (
+ s->state == SOCKET_STOP_PRE ||
+ s->state == SOCKET_STOP_PRE_SIGTERM ||
+ s->state == SOCKET_STOP_PRE_SIGKILL ||
+ s->state == SOCKET_STOP_POST ||
+ s->state == SOCKET_FINAL_SIGTERM ||
+ s->state == SOCKET_FINAL_SIGKILL)
return 0;
/* If there's already something running we go directly into
* kill mode. */
- if (IN_SET(s->state,
- SOCKET_START_PRE,
- SOCKET_START_CHOWN,
- SOCKET_START_POST)) {
+ if (s->state == SOCKET_START_PRE ||
+ s->state == SOCKET_START_CHOWN ||
+ s->state == SOCKET_START_POST) {
socket_enter_signal(s, SOCKET_STOP_PRE_SIGTERM, SOCKET_SUCCESS);
return -EAGAIN;
}
diff --git a/src/shared/socket-util.c b/src/shared/socket-util.c
index c583d3dfea..0adcb37557 100644
--- a/src/shared/socket-util.c
+++ b/src/shared/socket-util.c
@@ -486,6 +486,18 @@ bool socket_address_is_netlink(const SocketAddress *a, const char *s) {
return socket_address_equal(a, &b);
}
+const char* socket_address_get_path(const SocketAddress *a) {
+ assert(a);
+
+ if (socket_address_family(a) != AF_UNIX)
+ return NULL;
+
+ if (a->sockaddr.un.sun_path[0] == 0)
+ return NULL;
+
+ return a->sockaddr.un.sun_path;
+}
+
bool socket_address_needs_mount(const SocketAddress *a, const char *prefix) {
assert(a);
diff --git a/src/shared/socket-util.h b/src/shared/socket-util.h
index 7829a337fc..51181f9390 100644
--- a/src/shared/socket-util.h
+++ b/src/shared/socket-util.h
@@ -86,6 +86,8 @@ int socket_address_listen(
bool socket_address_is(const SocketAddress *a, const char *s, int type);
bool socket_address_is_netlink(const SocketAddress *a, const char *s);
+const char* socket_address_get_path(const SocketAddress *a);
+
bool socket_address_matches_fd(const SocketAddress *a, int fd);
int make_socket_fd(const char* address, int flags);
diff --git a/src/shared/util.h b/src/shared/util.h
index 119730994c..9a5b2c57cb 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -521,6 +521,13 @@ void warn_melody(void);
int get_home_dir(char **ret);
+#define DEFINE_TRIVIAL_CLEANUP_FUNC(type, func) \
+ static inline void func##p(type *p) { \
+ if (*p) \
+ func(*p); \
+ } \
+ struct __useless_struct_to_allow_trailing_semicolon__
+
static inline void freep(void *p) {
free(*(void**) p);
}