]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
uuidd: implement --no-pid option
authorPetr Uzel <petr.uzel@suse.cz>
Thu, 3 May 2012 19:01:50 +0000 (21:01 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 4 May 2012 13:13:40 +0000 (15:13 +0200)
With this option, uuidd does not create the PID file.

Signed-off-by: Petr Uzel <petr.uzel@suse.cz>
misc-utils/uuidd.8
misc-utils/uuidd.c

index 8e82b10b7ee609d179923367d3b088e437265196..07e533bb74da1c207b36b851390c548b9b9af376 100644 (file)
@@ -36,6 +36,9 @@ UUIDs.
 Specify the pathname where the pid file should be written.  By default,
 the pid file is written to /var/run/uuidd/uuidd.pid.
 .TP
+.BR \-P , " \-\-no-pid "
+Do not create pid file.
+.TP
 .B \-q
 Suppress some failure messages.
 .TP
index 704c9e9681e86b84c809671c0fbeda850ecdf783..be3e3cf07440b5c4d6eaef7f89fe7fd91e3aab6f 100644 (file)
@@ -64,6 +64,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
                " -r, --random        test random-based generation\n"
                " -t, --time          test time-based generation\n"
                " -n, --uuids <num>   request number of uuids\n"
+               " -P, --no-pid        do not create pid file\n"
                " -d, --debug         run in debugging mode\n"
                " -q, --quiet         turn on quiet mode\n"
                " -V, --version       output version information and exit\n"
@@ -112,7 +113,8 @@ static const char *cleanup_pidfile, *cleanup_socket;
 
 static void terminate_intr(int signo CODE_ATTR((unused)))
 {
-       unlink(cleanup_pidfile);
+       if (cleanup_pidfile)
+               unlink(cleanup_pidfile);
        if (cleanup_socket)
                unlink(cleanup_socket);
        exit(EXIT_SUCCESS);
@@ -256,12 +258,14 @@ static void server_loop(const char *socket_path, const char *pidfile_path,
        char                    reply_buf[1024], *cp;
        char                    op, str[UUID_STR_LEN];
        int                     i, s, ns, len, num;
-       int                     fd_pidfile, ret;
+       int                     fd_pidfile = -1;
+       int                     ret;
 
        signal(SIGALRM, terminate_intr);
        alarm(30);
 
-       fd_pidfile = create_pidfile(pidfile_path, quiet);
+       if (pidfile_path)
+               fd_pidfile = create_pidfile(pidfile_path, quiet);
 
        ret = call_daemon(socket_path, UUIDD_OP_GETPID, reply_buf, sizeof(reply_buf), 0, NULL);
        if (ret > 0) {
@@ -321,13 +325,15 @@ static void server_loop(const char *socket_path, const char *pidfile_path,
        signal(SIGALRM, terminate_intr);
        signal(SIGPIPE, SIG_IGN);
 
-       sprintf(reply_buf, "%8d\n", getpid());
-       if (ftruncate(fd_pidfile, 0)) {
-               /* Silence warn_unused_result */
+       if (pidfile_path) {
+               sprintf(reply_buf, "%8d\n", getpid());
+               if (ftruncate(fd_pidfile, 0)) {
+                       /* Silence warn_unused_result */
+               }
+               write_all(fd_pidfile, reply_buf, strlen(reply_buf));
+               if (fd_pidfile > 1)
+                       close(fd_pidfile); /* Unlock the pid file */
        }
-       write_all(fd_pidfile, reply_buf, strlen(reply_buf));
-       if (fd_pidfile > 1)
-               close(fd_pidfile); /* Unlock the pid file */
 
        while (1) {
                fromlen = sizeof(from_addr);
@@ -446,7 +452,8 @@ static void __attribute__ ((__noreturn__)) unexpected_size(int size)
 int main(int argc, char **argv)
 {
        const char      *socket_path = UUIDD_SOCKET_PATH;
-       const char      *pidfile_path = UUIDD_PIDFILE_PATH;
+       const char      *pidfile_path = NULL;
+       const char      *pidfile_path_param = NULL;
        const char      *err_context;
        char            buf[1024], *cp;
        char            str[UUID_STR_LEN], *tmp;
@@ -456,6 +463,7 @@ int main(int argc, char **argv)
        int             i, c, ret;
        int             debug = 0, do_type = 0, do_kill = 0, num = 0;
        int             timeout = 0, quiet = 0, drop_privs = 0;
+       int             no_pid = 0;
 
        static const struct option longopts[] = {
                {"pid", required_argument, NULL, 'p'},
@@ -465,6 +473,7 @@ int main(int argc, char **argv)
                {"random", no_argument, NULL, 'r'},
                {"time", no_argument, NULL, 't'},
                {"uuids", required_argument, NULL, 'n'},
+               {"no-pid", no_argument, NULL, 'P'},
                {"debug", no_argument, NULL, 'd'},
                {"quiet", no_argument, NULL, 'q'},
                {"version", no_argument, NULL, 'V'},
@@ -478,7 +487,7 @@ int main(int argc, char **argv)
        atexit(close_stdout);
 
        while ((c =
-               getopt_long(argc, argv, "p:s:T:krtn:dqVh", longopts,
+               getopt_long(argc, argv, "p:s:T:krtn:PdqVh", longopts,
                            NULL)) != -1) {
                switch (c) {
                case 'd':
@@ -497,7 +506,11 @@ int main(int argc, char **argv)
                        }
                        break;
                case 'p':
-                       pidfile_path = optarg;
+                       pidfile_path_param = optarg;
+                       drop_privs = 1;
+                       break;
+               case 'P':
+                       no_pid = 1;
                        drop_privs = 1;
                        break;
                case 'q':
@@ -533,6 +546,17 @@ int main(int argc, char **argv)
                        usage(stderr);
                }
        }
+
+       if (no_pid && pidfile_path_param && !quiet)
+               fprintf(stderr, _("Both --pid and --no-pid specified. "
+                                 "Ignoring --no-pid.\n"));
+
+       if (!no_pid && !pidfile_path_param)
+               pidfile_path = UUIDD_PIDFILE_PATH;
+       else if (pidfile_path_param)
+               pidfile_path = pidfile_path_param;
+
+
        uid = getuid();
        if (uid && drop_privs) {
                gid = getgid();