Added option to kill old mctap.
authorFredrik Tolf <fredrik@dolda2000.com>
Sat, 9 Aug 2008 19:40:04 +0000 (21:40 +0200)
committerFredrik Tolf <fredrik@dolda2000.com>
Sat, 9 Aug 2008 19:40:04 +0000 (21:40 +0200)
src/mctap.c

index 9fce9ac..9d183f9 100644 (file)
@@ -20,7 +20,7 @@ static int quit = 0;
 
 static void usage(FILE *out)
 {
-    fprintf(out, "usage: mctap [-hdp] [-P PIDFILE] [-D TAPNAME] MCASTGROUP PORT\n");
+    fprintf(out, "usage: mctap [-hdpk] [-P PIDFILE] [-D TAPNAME] MCASTGROUP PORT\n");
 }
 
 static __attribute__ ((unused)) char *formataddress(struct sockaddr *arg, socklen_t arglen)
@@ -204,6 +204,23 @@ static void sighand(int sig)
     }
 }
 
+static void killrunning(char *pidfile)
+{
+    FILE *pidfd;
+    int pid;
+    
+    if((pidfd = fopen(pidfile, "r")) == NULL) {
+       fprintf(stderr, "mctab -k: could not read PID file %s: %s\n", pidfile, strerror(errno));
+       exit(1);
+    }
+    fscanf(pidfd, "%i", &pid);
+    if(kill(pid, SIGTERM)) {
+       fprintf(stderr, "mctab -k: could not kill %i: %s\n", pid, strerror(errno));
+       exit(1);
+    }
+    fclose(pidfd);
+}
+
 int main(int argc, char **argv)
 {
     int c;
@@ -212,14 +229,14 @@ int main(int argc, char **argv)
     int port;
     char *tapname;
     char *pidfile;
-    int daemonize;
+    int daemonize, killold;
     struct sockaddr_in dst;
     FILE *pidfd;
     
     tapname = "mctap";
-    daemonize = 0;
+    daemonize = killold = 0;
     pidfile = NULL;
-    while((c = getopt(argc, argv, "hD:dpP:")) >= 0) {
+    while((c = getopt(argc, argv, "hD:dpP:k")) >= 0) {
        switch(c) {
        case 'D':
            tapname = optarg;
@@ -233,6 +250,11 @@ int main(int argc, char **argv)
        case 'P':
            pidfile = optarg;
            break;
+       case 'k':
+           killold = 1;
+           if(pidfile == NULL)
+               pidfile = (void *)-1;
+           break;
        case 'h':
            usage(stdout);
            return(0);
@@ -243,6 +265,10 @@ int main(int argc, char **argv)
     }
     if(pidfile == (void *)-1)
        pidfile = sprintf2("/var/run/mctap.%s.pid", tapname);
+    if(killold) {
+       killrunning(pidfile);
+       return(0);
+    }
     if(argc - optind < 2) {
        usage(stderr);
        exit(1);