spawn.c - noice - small file browser (mirror / fork from 2f30.org)
 (HTM) git clone git://git.codemadness.org/noice
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       spawn.c (919B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <sys/types.h>
            3 #include <sys/wait.h>
            4 
            5 #include <errno.h>
            6 #include <stdarg.h>
            7 #include <stdlib.h>
            8 #include <unistd.h>
            9 
           10 #include "util.h"
           11 
           12 int
           13 spawnvp(char *dir, char *file, char *argv[])
           14 {
           15         pid_t pid;
           16         int status, r;
           17 
           18         pid = fork();
           19         switch (pid) {
           20         case -1:
           21                 return -1;
           22         case 0:
           23                 if (dir != NULL && chdir(dir) == -1)
           24                         exit(1);
           25                 execvp(file, argv);
           26                 _exit(1);
           27         default:
           28                 while ((r = waitpid(pid, &status, 0)) == -1 && errno == EINTR)
           29                         continue;
           30                 if (r == -1)
           31                         return -1;
           32                 if (WIFEXITED(status) && WEXITSTATUS(status) != 0)
           33                         return -1;
           34         }
           35         return 0;
           36 }
           37 
           38 int
           39 spawnlp(char *dir, char *file, char *argv0, ...)
           40 {
           41         char *argv[NR_ARGS];
           42         va_list ap;
           43         int argc;
           44 
           45         va_start(ap, argv0);
           46         argv[0] = argv0;
           47         for (argc = 1; (argv[argc] = va_arg(ap, char *)) != (void *)0; argc++)
           48                 ;
           49         argv[argc] = NULL;
           50         va_end(ap);
           51         return spawnvp(dir, file, argv);
           52 }