ustd: add support for --pidfile
authorPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Tue, 13 Oct 2009 23:09:27 +0000 (19:09 -0400)
committerPierre-Marc Fournier <pierre-marc.fournier@polymtl.ca>
Tue, 13 Oct 2009 23:09:27 +0000 (19:09 -0400)
ustd/ustd.c

index 001977660a6ec0c86d809ce4a0ccb298a638427b..6d8680ca84d2b8c91bd0e680fad43a4a9d2dc58b 100644 (file)
@@ -53,6 +53,7 @@
 char *sock_path=NULL;
 char *trace_path=NULL;
 int daemon_mode = 0;
+char *pidfile = NULL;
 
 /* Number of active buffers and the mutex to protect it. */
 int active_buffers = 0;
@@ -516,6 +517,9 @@ int parse_args(int argc, char **argv)
                case 'd':
                        daemon_mode = 1;
                        break;
+               case 'p':
+                       pidfile = strdup(optarg);
+                       break;
                case 'h':
                        usage();
                        exit(0);
@@ -654,10 +658,11 @@ int start_ustd_daemon()
 {
        int result;
        int fd[2];
+       pid_t child_pid;
 
        result = pipe(fd);
 
-       result = fork();
+       result = child_pid = fork();
        if(result == -1) {
                PERROR("fork");
                return -1;
@@ -667,6 +672,27 @@ int start_ustd_daemon()
        }
        else {
                char buf;
+               FILE *pidfp;
+
+               /* It's important to write the file *before*
+                * the parent ends, because the file may be
+                * read as soon as the parent ends.
+                */
+               if(pidfile) {
+                       pidfp = fopen(pidfile, "w+");
+                       if(!pidfp) {
+                               PERROR("fopen (%s)", pidfile);
+                               WARN("killing child process");
+                               result = kill(child_pid, SIGTERM);
+                               if(result == -1) {
+                                       PERROR("kill");
+                               }
+                               return -1;
+                       }
+
+                       fprintf(pidfp, "%d\n", child_pid);
+                       fclose(pidfp);
+               }
 
                result = read(fd[0], &buf, 1);
                if(result == -1) {
This page took 0.026438 seconds and 4 git commands to generate.