diff options
author | Lennart Poettering <lennart@poettering.net> | 2011-07-12 03:56:56 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-07-12 03:56:56 +0200 |
commit | ee17ee7c5cc22c286f943578918beaa78bbc86db (patch) | |
tree | fd832fc838a4b8226cf73e8ad8be6328e03e8c7e | |
parent | 97f73ffb04947acf0a5854e3a7bdbb7a0105f6fa (diff) |
tmpfiles: allow creation of named pipes with tmpfiles
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | man/tmpfiles.d.xml | 5 | ||||
-rw-r--r-- | src/tmpfiles.c | 46 |
3 files changed, 51 insertions, 2 deletions
@@ -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 abc74ef6f1..7f4c45c960 100644 --- a/man/tmpfiles.d.xml +++ b/man/tmpfiles.d.xml @@ -113,6 +113,11 @@ d /run/user 0755 root root 10d</programlisting> </varlistentry> <varlistentry> + <term><varname>p</varname></term> + <listitem><para>Create a named pipe (FIFO) if it doesn't exist yet</para></listitem> + </varlistentry> + + <varlistentry> <term><varname>x</varname></term> <listitem><para>Ignore a path during cleaning. Use this type diff --git a/src/tmpfiles.c b/src/tmpfiles.c index 4394f0dd55..feb2a21463 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) { |