From ee17ee7c5cc22c286f943578918beaa78bbc86db Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 12 Jul 2011 03:56:56 +0200 Subject: [PATCH 1/1] tmpfiles: allow creation of named pipes with tmpfiles --- TODO | 2 -- man/tmpfiles.d.xml | 5 +++++ src/tmpfiles.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index ff8ee5f2d..36a57f4b5 100644 --- a/TODO +++ b/TODO @@ -28,8 +28,6 @@ Features: * add conditions for file executability -* allow creating fifos with tmpfiles - * implement Register= switch in .socket units to enable registration in Avahi, RPC and other socket registration services. diff --git a/man/tmpfiles.d.xml b/man/tmpfiles.d.xml index abc74ef6f..7f4c45c96 100644 --- a/man/tmpfiles.d.xml +++ b/man/tmpfiles.d.xml @@ -112,6 +112,11 @@ d /run/user 0755 root root 10d Create or empty a directory + + p + Create a named pipe (FIFO) if it doesn't exist yet + + x Ignore a path diff --git a/src/tmpfiles.c b/src/tmpfiles.c index 4394f0dd5..feb2a2146 100644 --- a/src/tmpfiles.c +++ b/src/tmpfiles.c @@ -56,6 +56,7 @@ enum { TRUNCATE_FILE = 'F', CREATE_DIRECTORY = 'd', TRUNCATE_DIRECTORY = 'D', + CREATE_FIFO = 'p', /* These ones take globs */ IGNORE_PATH = 'x', @@ -505,6 +506,48 @@ static int create_item(Item *i) { } break; + + case CREATE_FIFO: + + u = umask(0); + r = mkfifo(i->path, i->mode); + umask(u); + + if (r < 0 && errno != EEXIST) { + log_error("Failed to create fifo %s: %m", i->path); + r = -errno; + goto finish; + } + + if (stat(i->path, &st) < 0) { + log_error("stat(%s) failed: %m", i->path); + r = -errno; + goto finish; + } + + if (!S_ISFIFO(st.st_mode)) { + log_error("%s is not a fifo.", i->path); + r = -EEXIST; + goto finish; + } + + if (i->mode_set) + if (chmod(i->path, i->mode) < 0) { + log_error("chmod(%s) failed: %m", i->path); + r = -errno; + goto finish; + } + + if (i->uid_set || i->gid_set) + if (chown(i->path, + i->uid_set ? i->uid : (uid_t) -1, + i->gid_set ? i->gid : (gid_t) -1) < 0) { + log_error("chown(%s) failed: %m", i->path); + r = -errno; + goto finish; + } + + break; } if ((r = label_fix(i->path, false)) < 0) @@ -529,6 +572,7 @@ static int remove_item(Item *i, const char *instance) { case CREATE_FILE: case TRUNCATE_FILE: case CREATE_DIRECTORY: + case CREATE_FIFO: case IGNORE_PATH: break; @@ -562,6 +606,7 @@ static int remove_item_glob(Item *i) { case CREATE_FILE: case TRUNCATE_FILE: case CREATE_DIRECTORY: + case CREATE_FIFO: case IGNORE_PATH: break; @@ -689,6 +734,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) { i->type != TRUNCATE_FILE && i->type != CREATE_DIRECTORY && i->type != TRUNCATE_DIRECTORY && + i->type != CREATE_FIFO && i->type != IGNORE_PATH && i->type != REMOVE_PATH && i->type != RECURSIVE_REMOVE_PATH) { -- 2.30.2