fiss-minit

A standalone service supervisor based on minit
Log | Files | Refs | README | LICENSE

pidfilehack.c (1446B)


      1 #include <errno.h>
      2 #include <fcntl.h>
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 #include <unistd.h>
      6 
      7 /* purpose: argv[1] is the full path to a PID file,
      8  *          argv+2 is the daemon to run.
      9  * the daemon is expected to fork in the background and write its PID in
     10  * the pid file.
     11  */
     12 
     13 extern char** environ;
     14 
     15 int main(int argc, char* argv[]) {
     16 	int count = 0;
     17 	if (argc < 3) {
     18 		write(1, "usage: pidfilehack service /var/run/daemon.pid /usr/sbin/daemon args...\n", 72);
     19 		return 0;
     20 	}
     21 	if (unlink(argv[2])) {
     22 		if (errno != ENOENT) {
     23 			perror("could not remove pid file");
     24 			return 1;
     25 		}
     26 	}
     27 	switch (fork()) {
     28 		case -1:
     29 			perror("could not fork");
     30 			return 2;
     31 		case 0: /* child */
     32 			execve(argv[3], argv + 3, environ);
     33 			perror("execvp failed");
     34 			return 3;
     35 	}
     36 	do {
     37 		int fd = open(argv[2], O_RDONLY);
     38 		if (fd >= 0) {
     39 			static char buf[100] = "-P";
     40 			int         len      = read(fd, buf + 2, 98);
     41 			close(fd);
     42 			if (len > 0) {
     43 				char* _argv[] = { "msvc", 0, 0, 0 };
     44 				if (buf[len + 1] == '\n')
     45 					buf[len + 1] = 0;
     46 				else
     47 					buf[len + 2] = 0;
     48 				_argv[1] = buf;
     49 				_argv[2] = argv[1];
     50 				/*	printf("execvp %s %s %s\n",_argv[0],_argv[1],_argv[2]); */
     51 				execvp(_argv[0], _argv);
     52 				perror("execvp failed");
     53 				return 0;
     54 			} /* else
     55 		  printf("file there but open returned %d\n",fd); */
     56 		}     /* else
     57 		      printf("%s not there yet\n",argv[2]); */
     58 		sleep(1);
     59 		if (++count >= 30)
     60 			exit(0);
     61 	} while (1);
     62 }