pidfilehack.c (1404B)
1 #include <unistd.h> 2 #include <errno.h> 3 #include <stdlib.h> 4 #include <fcntl.h> 5 #include <stdio.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 }