pidfilehack.c (1404B) download
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
13extern char** environ;
14
15int 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}