From 2bcff894ac444f5b8d5d6ab7d8c243974526d332 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 25 Jun 2011 17:57:57 +0200 Subject: [PATCH] openvpnctrl: Support killing only the roadwarrior server. --- src/misc-progs/openvpnctrl.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/misc-progs/openvpnctrl.c b/src/misc-progs/openvpnctrl.c index 847a3e2a67..68bbe2fff5 100644 --- a/src/misc-progs/openvpnctrl.c +++ b/src/misc-progs/openvpnctrl.c @@ -368,12 +368,16 @@ void setFirewallRules(void) { void stopDaemon(void) { char command[STRING_SIZE]; - snprintf(command, STRING_SIZE - 1, "/bin/killall openvpn"); - executeCommand(command); + int pid = readPidFile("/var/run/openvpn.pid"); + if (pid == NULL) { + exit(1); + } + + fprintf(stderr, "Killing PID %d.\n", pid); + kill(pid, SIGTERM); + snprintf(command, STRING_SIZE - 1, "/bin/rm -f /var/run/openvpn.pid"); executeCommand(command); - snprintf(command, STRING_SIZE-1, "/sbin/modprobe -r tun"); - executeCommand(command); } void startDaemon(void) { @@ -429,6 +433,20 @@ void startNet2Net(char *name) { executeCommand(command); } +int readPidFile(const char *pidfile) { + FILE *fp = fopen(pidfile, "r"); + if (fp == NULL) { + fprintf(stderr, "PID file not found: '%s'\n", pidfile); + exit(1); + } + + int pid = NULL; + fscanf(fp, "%d", &pid); + fclose(fp); + + return pid; +} + void killNet2Net(char *name) { connection *conn = NULL; connection *conn_iter; @@ -451,17 +469,11 @@ void killNet2Net(char *name) { char pidfile[STRING_SIZE]; snprintf(&pidfile, STRING_SIZE - 1, "/var/run/%sn2n.pid", conn->name); - FILE *fp = fopen(pidfile, "r"); - if (fp == NULL) { - fprintf(stderr, "Could not determine PID for connection '%s'.\n", conn->name); - fprintf(stderr, "PID file not found: '%s'\n", pidfile); + int pid = readPidFile(pidfile); + if (pid == NULL) { exit(1); } - int pid; - fscanf(fp, "%d", &pid); - fclose(fp); - fprintf(stderr, "Killing PID %d.\n", pid); kill(pid, SIGTERM); -- 2.39.5