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 }