@ -1,42 +0,0 @@ | |||||
From 7973d45a0e1716ddc6bfb6caf600f826f59a7932 Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Tue, 28 Apr 2015 21:26:15 +0800 | |||||
Subject: [PATCH 200/210] xl2tpd-control: check end-of-file when reading pipe | |||||
to avoid dead loop. | |||||
--- | |||||
xl2tpd-control.c | 11 +++++++---- | |||||
1 file changed, 7 insertions(+), 4 deletions(-) | |||||
diff --git a/xl2tpd-control.c b/xl2tpd-control.c | |||||
index feafe10..e5904d8 100644 | |||||
--- a/xl2tpd-control.c | |||||
+++ b/xl2tpd-control.c | |||||
@@ -306,17 +306,20 @@ int read_result(int result_fd, char* buf, ssize_t size) | |||||
/*FIXME: there is a chance to hang up reading. | |||||
Should I create watching thread with timeout? | |||||
*/ | |||||
- ssize_t readed; | |||||
+ ssize_t readed = 0; | |||||
+ ssize_t len; | |||||
+ | |||||
do | |||||
{ | |||||
- readed = read (result_fd, buf, size); | |||||
- if (readed < 0) | |||||
+ len = read (result_fd, buf + readed, size - readed); | |||||
+ if (len < 0) | |||||
{ | |||||
print_error (ERROR_LEVEL, | |||||
"error: can't read command result: %s\n", strerror (errno)); | |||||
break; | |||||
} | |||||
- } while (readed == 0); | |||||
+ readed += len; | |||||
+ } while (len > 0 && (size - readed) > 0); | |||||
buf[readed] = '\0'; | |||||
/* scan result code */ | |||||
-- | |||||
1.7.10.4 | |||||
@ -1,26 +0,0 @@ | |||||
From efa0a18b5dfd827792b07acdcb35101229ccf612 Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Wed, 29 Apr 2015 10:32:37 +0800 | |||||
Subject: [PATCH 201/210] xl2tpd-control: define _GNU_SOURCE to use fmemopen() | |||||
and friends. | |||||
--- | |||||
xl2tpd-control.c | 2 ++ | |||||
1 file changed, 2 insertions(+) | |||||
diff --git a/xl2tpd-control.c b/xl2tpd-control.c | |||||
index e5904d8..9b6235d 100644 | |||||
--- a/xl2tpd-control.c | |||||
+++ b/xl2tpd-control.c | |||||
@@ -10,6 +10,8 @@ | |||||
* | |||||
*/ | |||||
+#define _GNU_SOURCE | |||||
+ | |||||
#include <stdio.h> | |||||
#include <string.h> | |||||
#include <stdarg.h> | |||||
-- | |||||
1.7.10.4 | |||||
@ -1,42 +0,0 @@ | |||||
From fedfd6685e5f81f0460beb4c448a30e7a6cfbd31 Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Wed, 29 Apr 2015 14:21:12 +0800 | |||||
Subject: [PATCH 202/210] xl2tpd-control: open control file with O_NONBLOCK. | |||||
Otherwise xl2tpd-control would block indefinitely in case xl2tpd is | |||||
not running. | |||||
--- | |||||
xl2tpd-control.c | 10 +++++++++- | |||||
1 file changed, 9 insertions(+), 1 deletion(-) | |||||
diff --git a/xl2tpd-control.c b/xl2tpd-control.c | |||||
index 9b6235d..973ee87 100644 | |||||
--- a/xl2tpd-control.c | |||||
+++ b/xl2tpd-control.c | |||||
@@ -246,7 +246,7 @@ int main (int argc, char *argv[]) | |||||
print_error (DEBUG_LEVEL, "command to be passed:\n%s\n", buf); | |||||
/* try to open control file for writing */ | |||||
- int control_fd = open (control_filename, O_WRONLY, 0600); | |||||
+ int control_fd = open (control_filename, O_WRONLY | O_NONBLOCK, 0600); | |||||
if (control_fd < 0) | |||||
{ | |||||
int errorno = errno; | |||||
@@ -265,6 +265,14 @@ int main (int argc, char *argv[]) | |||||
} | |||||
return -1; | |||||
} | |||||
+ | |||||
+ /* turn off O_NONBLOCK */ | |||||
+ if (fcntl (control_fd, F_SETFL, O_WRONLY) == -1) { | |||||
+ print_error (ERROR_LEVEL, | |||||
+ "Can not turn off nonblocking mode for control_fd: %s\n", | |||||
+ strerror(errno)); | |||||
+ return -2; | |||||
+ } | |||||
/* pass command to control pipe */ | |||||
if (write (control_fd, buf, ftell (mesf)) < 0) | |||||
-- | |||||
1.7.10.4 | |||||
@ -1,75 +0,0 @@ | |||||
From 07e522cd7e223517389582a8eb647a4a6a8a5cf8 Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Thu, 30 Apr 2015 13:53:11 +0800 | |||||
Subject: [PATCH 203/210] xl2tpd-control: cleaup result file atexit(). | |||||
--- | |||||
xl2tpd-control.c | 21 ++++++++++++++------- | |||||
1 file changed, 14 insertions(+), 7 deletions(-) | |||||
diff --git a/xl2tpd-control.c b/xl2tpd-control.c | |||||
index 973ee87..abc0324 100644 | |||||
--- a/xl2tpd-control.c | |||||
+++ b/xl2tpd-control.c | |||||
@@ -12,6 +12,7 @@ | |||||
#define _GNU_SOURCE | |||||
+#include <stdlib.h> | |||||
#include <stdio.h> | |||||
#include <string.h> | |||||
#include <stdarg.h> | |||||
@@ -35,6 +36,9 @@ | |||||
#define TUNNEL_REQUIRED 1 | |||||
#define TUNNEL_NOT_REQUIRED 0 | |||||
+char result_filename[128]; | |||||
+int result_fd = -1; | |||||
+ | |||||
int log_level = ERROR_LEVEL; | |||||
void print_error (int level, const char *fmt, ...); | |||||
@@ -117,6 +121,14 @@ void help() | |||||
); | |||||
} | |||||
+void cleanup(void) | |||||
+{ | |||||
+ /* cleaning up */ | |||||
+ if (result_fd >= 0) | |||||
+ close (result_fd); | |||||
+ unlink (result_filename); | |||||
+} | |||||
+ | |||||
int main (int argc, char *argv[]) | |||||
{ | |||||
char* control_filename = NULL; | |||||
@@ -195,11 +207,11 @@ int main (int argc, char *argv[]) | |||||
FILE* mesf = fmemopen (buf, CONTROL_PIPE_MESSAGE_SIZE, "w"); | |||||
/* create result pipe for reading */ | |||||
- char result_filename[128]; | |||||
snprintf (result_filename, 128, RESULT_FILENAME_FORMAT, getpid()); | |||||
unlink (result_filename); | |||||
mkfifo (result_filename, 0600); | |||||
- int result_fd = open (result_filename, O_RDONLY | O_NONBLOCK, 0600); | |||||
+ atexit(cleanup); | |||||
+ result_fd = open (result_filename, O_RDONLY | O_NONBLOCK, 0600); | |||||
if (result_fd < 0) | |||||
{ | |||||
print_error (ERROR_LEVEL, | |||||
@@ -293,11 +305,6 @@ int main (int argc, char *argv[]) | |||||
); | |||||
printf ("%s", rbuf); | |||||
- /* cleaning up */ | |||||
- | |||||
- close (result_fd); | |||||
- unlink (result_filename); | |||||
- | |||||
return command_result_code; | |||||
} | |||||
-- | |||||
1.7.10.4 | |||||
@ -1,58 +0,0 @@ | |||||
From f6eaaabb0b2fab12cf597b8c1d12d470a13e581f Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Thu, 14 May 2015 14:58:10 +0800 | |||||
Subject: [PATCH 204/210] xl2tpd-control: enhance output of print_error(). | |||||
- Add prefix "xl2tpd-control: " to print_error() output. | |||||
- Output response from xl2tpd only when -d is enabled as result of | |||||
control command can be retrieved from exit code. | |||||
- Remove some redundant and not that useful verbose output. | |||||
--- | |||||
xl2tpd-control.c | 10 ++++------ | |||||
1 file changed, 4 insertions(+), 6 deletions(-) | |||||
diff --git a/xl2tpd-control.c b/xl2tpd-control.c | |||||
index abc0324..6b08850 100644 | |||||
--- a/xl2tpd-control.c | |||||
+++ b/xl2tpd-control.c | |||||
@@ -164,7 +164,6 @@ int main (int argc, char *argv[]) | |||||
{ | |||||
control_filename = strdup (CONTROL_PIPE); | |||||
} | |||||
- print_error (DEBUG_LEVEL, "set control filename to %s\n", control_filename); | |||||
/* parse command name */ | |||||
for (command = commands; command->name; command++) | |||||
@@ -176,10 +175,7 @@ int main (int argc, char *argv[]) | |||||
} | |||||
} | |||||
- if (command->name) | |||||
- { | |||||
- print_error (DEBUG_LEVEL, "get command %s\n", command->name); | |||||
- } else { | |||||
+ if (!command->name) { | |||||
print_error (ERROR_LEVEL, "error: no such command %s\n", argv[i]); | |||||
return -1; | |||||
} | |||||
@@ -303,7 +299,8 @@ int main (int argc, char *argv[]) | |||||
int command_result_code = read_result ( | |||||
result_fd, rbuf, CONTROL_PIPE_MESSAGE_SIZE | |||||
); | |||||
- printf ("%s", rbuf); | |||||
+ /* rbuf contains a newline, make it double to form a boundary. */ | |||||
+ print_error (DEBUG_LEVEL, "command response: \n%s\n", rbuf); | |||||
return command_result_code; | |||||
} | |||||
@@ -313,6 +310,7 @@ void print_error (int level, const char *fmt, ...) | |||||
if (level > log_level) return; | |||||
va_list args; | |||||
va_start (args, fmt); | |||||
+ fprintf (stderr, "xl2tpd-control: "); | |||||
vfprintf (stderr, fmt, args); | |||||
va_end (args); | |||||
} | |||||
-- | |||||
1.7.10.4 | |||||
@ -1,34 +0,0 @@ | |||||
From 1c148f6645f43bf5abd8a9b8f0708a598b357d97 Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Thu, 14 May 2015 19:56:39 +0800 | |||||
Subject: [PATCH 205/210] xl2tpd: fix typo in reporting available lns count. | |||||
--- | |||||
xl2tpd.c | 4 ++-- | |||||
1 file changed, 2 insertions(+), 2 deletions(-) | |||||
diff --git a/xl2tpd.c b/xl2tpd.c | |||||
index c9b7579..6c945fc 100644 | |||||
--- a/xl2tpd.c | |||||
+++ b/xl2tpd.c | |||||
@@ -1039,7 +1039,7 @@ int control_handle_available(FILE* resf, char* bufp){ | |||||
lns_count++; | |||||
} | |||||
- write_res (resf, "%02i AVAILABLE lns.cout=%d\n", 0, lns_count); | |||||
+ write_res (resf, "%02i AVAILABLE lns.count=%d\n", 0, lns_count); | |||||
lac = laclist; | |||||
int lac_count = 0; | |||||
@@ -1053,7 +1053,7 @@ int control_handle_available(FILE* resf, char* bufp){ | |||||
if(deflac){ | |||||
write_res (resf, "%02i AVAILABLE lac.%d.name=%s\n", 0, lac_count, deflac->entname); | |||||
lac_count++; | |||||
- } | |||||
+ } | |||||
write_res (resf, "%02i AVAILABLE lac.count=%d\n", 0, lac_count); | |||||
return 1; | |||||
-- | |||||
1.7.10.4 | |||||
@ -1,71 +0,0 @@ | |||||
From 18fdf802d31354c62a27cc5a63b196780a0d486e Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Wed, 29 Apr 2015 16:30:17 +0800 | |||||
Subject: [PATCH 206/210] xl2tpd: start_pppd: place opts after "plugin | |||||
pppol2tp.so". | |||||
so that plugin options like pppol2tp_debug_mark can be recognized by | |||||
pppd. While doing this also add bound check to prevent potential buffer | |||||
overflow problem. | |||||
--- | |||||
xl2tpd.c | 22 +++++++++++----------- | |||||
1 file changed, 11 insertions(+), 11 deletions(-) | |||||
diff --git a/xl2tpd.c b/xl2tpd.c | |||||
index 6c945fc..017adfd 100644 | |||||
--- a/xl2tpd.c | |||||
+++ b/xl2tpd.c | |||||
@@ -382,7 +382,6 @@ int start_pppd (struct call *c, struct ppp_opts *opts) | |||||
/* char a, b; */ | |||||
char tty[512]; | |||||
char *stropt[80]; | |||||
- struct ppp_opts *p; | |||||
#ifdef USE_KERNEL | |||||
struct sockaddr_pppol2tp sax; | |||||
int flags; | |||||
@@ -396,16 +395,7 @@ int start_pppd (struct call *c, struct ppp_opts *opts) | |||||
struct call *sc; | |||||
struct tunnel *st; | |||||
- p = opts; | |||||
stropt[0] = strdup (PPPD); | |||||
- while (p) | |||||
- { | |||||
- stropt[pos] = (char *) malloc (strlen (p->option) + 1); | |||||
- strncpy (stropt[pos], p->option, strlen (p->option) + 1); | |||||
- pos++; | |||||
- p = p->next; | |||||
- } | |||||
- stropt[pos] = NULL; | |||||
if (c->pppd > 0) | |||||
{ | |||||
l2tp_log(LOG_WARNING, "%s: PPP already started on call!\n", __FUNCTION__); | |||||
@@ -467,7 +457,6 @@ int start_pppd (struct call *c, struct ppp_opts *opts) | |||||
snprintf (stropt[pos], 10, "%d", c->ourcid); | |||||
pos++; | |||||
} | |||||
- stropt[pos] = NULL; | |||||
} | |||||
else | |||||
#endif | |||||
@@ -497,6 +486,17 @@ int start_pppd (struct call *c, struct ppp_opts *opts) | |||||
return -EINVAL; | |||||
} | |||||
stropt[pos++] = strdup(tty); | |||||
+ } | |||||
+ | |||||
+ { | |||||
+ struct ppp_opts *p = opts; | |||||
+ int maxn_opts = sizeof(stropt) / sizeof(stropt[0]) - 1; | |||||
+ while (p && pos < maxn_opts) | |||||
+ { | |||||
+ stropt[pos] = strdup (p->option); | |||||
+ pos++; | |||||
+ p = p->next; | |||||
+ } | |||||
stropt[pos] = NULL; | |||||
} | |||||
-- | |||||
1.7.10.4 | |||||
@ -1,104 +0,0 @@ | |||||
From b3402a68a4d29e9b1ae4e012e39a7bcb14fea3cf Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Thu, 30 Apr 2015 13:57:36 +0800 | |||||
Subject: [PATCH 207/210] xl2tpd: introduce new option -l for using syslog as | |||||
the logging facility. | |||||
Defaults to old behaviour if no -l option was specified. Also update | |||||
manual doc to reflect this change. | |||||
--- | |||||
doc/xl2tpd.8 | 5 +++++ | |||||
file.h | 1 + | |||||
misc.c | 2 +- | |||||
xl2tpd.c | 13 ++++++++++++- | |||||
4 files changed, 19 insertions(+), 2 deletions(-) | |||||
diff --git a/doc/xl2tpd.8 b/doc/xl2tpd.8 | |||||
index 915b247..7afccac 100644 | |||||
--- a/doc/xl2tpd.8 | |||||
+++ b/doc/xl2tpd.8 | |||||
@@ -20,6 +20,11 @@ This option prevents xl2tpd from detaching from the terminal and | |||||
daemonizing. | |||||
.TP | |||||
+.B -l | |||||
+This option tells xl2tpd to use syslog for logging even when \fB\-D\fR | |||||
+was specified. | |||||
+ | |||||
+.TP | |||||
.B -c <config file> | |||||
Tells xl2tpd to use an alternate config file. Default is | |||||
/etc/xl2tpd/xl2tpd.conf. Fallback configuration file is | |||||
diff --git a/file.h b/file.h | |||||
index 89987ae..92df046 100644 | |||||
--- a/file.h | |||||
+++ b/file.h | |||||
@@ -151,6 +151,7 @@ struct global | |||||
char pidfile[STRLEN]; /* File containing the pid number*/ | |||||
char controlfile[STRLEN]; /* Control file name (named pipe) */ | |||||
int daemon; /* Use daemon mode? */ | |||||
+ int syslog; /* Use syslog for logging? */ | |||||
int accesscontrol; /* Use access control? */ | |||||
int forceuserspace; /* Force userspace? */ | |||||
int packet_dump; /* Dump (print) all packets? */ | |||||
diff --git a/misc.c b/misc.c | |||||
index 3092401..cccf4ca 100644 | |||||
--- a/misc.c | |||||
+++ b/misc.c | |||||
@@ -57,7 +57,7 @@ void l2tp_log (int level, const char *fmt, ...) | |||||
vsnprintf (buf, sizeof (buf), fmt, args); | |||||
va_end (args); | |||||
- if(gconfig.daemon) { | |||||
+ if(gconfig.syslog) { | |||||
init_log(); | |||||
SYSLOG_CALL( syslog (level, "%s", buf) ); | |||||
} else { | |||||
diff --git a/xl2tpd.c b/xl2tpd.c | |||||
index 017adfd..1937690 100644 | |||||
--- a/xl2tpd.c | |||||
+++ b/xl2tpd.c | |||||
@@ -1594,7 +1594,7 @@ void do_control () | |||||
void usage(void) { | |||||
printf("\nxl2tpd version: %s\n", SERVER_VERSION); | |||||
printf("Usage: xl2tpd [-c <config file>] [-s <secret file>] [-p <pid file>]\n" | |||||
- " [-C <control file>] [-D]\n" | |||||
+ " [-C <control file>] [-D] [-l]\n" | |||||
" [-v, --version]\n"); | |||||
printf("\n"); | |||||
exit(1); | |||||
@@ -1605,6 +1605,7 @@ void init_args(int argc, char *argv[]) | |||||
int i=0; | |||||
gconfig.daemon=1; | |||||
+ gconfig.syslog=-1; | |||||
memset(gconfig.altauthfile,0,STRLEN); | |||||
memset(gconfig.altconfigfile,0,STRLEN); | |||||
memset(gconfig.authfile,0,STRLEN); | |||||
@@ -1642,6 +1643,9 @@ void init_args(int argc, char *argv[]) | |||||
else if (! strncmp(argv[i],"-D",2)) { | |||||
gconfig.daemon=0; | |||||
} | |||||
+ else if (! strncmp(argv[i],"-l",2)) { | |||||
+ gconfig.syslog=1; | |||||
+ } | |||||
else if (! strncmp(argv[i],"-s",2)) { | |||||
if(++i == argc) | |||||
usage(); | |||||
@@ -1667,6 +1671,13 @@ void init_args(int argc, char *argv[]) | |||||
usage(); | |||||
} | |||||
} | |||||
+ | |||||
+ /* | |||||
+ * defaults to syslog if no log facility was explicitly | |||||
+ * specified and we are about to daemonize | |||||
+ */ | |||||
+ if (gconfig.syslog < 0) | |||||
+ gconfig.syslog = gconfig.daemon; | |||||
} | |||||
-- | |||||
1.7.10.4 | |||||
@ -1,26 +0,0 @@ | |||||
From a2b163a65a2d4fbca57c3aa82b526cf8fbc8e449 Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Fri, 15 May 2015 10:56:23 +0800 | |||||
Subject: [PATCH 208/210] xl2tpd: unlink result file to prevent leftover a | |||||
regular file. | |||||
--- | |||||
xl2tpd.c | 2 ++ | |||||
1 file changed, 2 insertions(+) | |||||
diff --git a/xl2tpd.c b/xl2tpd.c | |||||
index 1937690..c11fe66 100644 | |||||
--- a/xl2tpd.c | |||||
+++ b/xl2tpd.c | |||||
@@ -1582,6 +1582,8 @@ void do_control () | |||||
if (resf) | |||||
{ | |||||
fclose (resf); | |||||
+ /* unlink it anyway to prevent leftover a regular file. */ | |||||
+ unlink(res_filename); | |||||
} | |||||
} | |||||
-- | |||||
1.7.10.4 | |||||
@ -1,32 +0,0 @@ | |||||
From 2d0eff7f56936823d784425d2171be295ba11027 Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Fri, 15 May 2015 15:55:10 +0800 | |||||
Subject: [PATCH 209/210] xl2tpd: ignore SIGPIPE signal. | |||||
--- | |||||
xl2tpd.c | 2 +- | |||||
1 file changed, 1 insertion(+), 1 deletion(-) | |||||
diff --git a/xl2tpd.c b/xl2tpd.c | |||||
index c11fe66..58ed868 100644 | |||||
--- a/xl2tpd.c | |||||
+++ b/xl2tpd.c | |||||
@@ -1551,7 +1551,6 @@ void do_control () | |||||
/*FIXME: check quotes to allow filenames with spaces? | |||||
(do not forget quotes escaping to allow filenames with quotes)*/ | |||||
- /*FIXME: write to res_filename may cause SIGPIPE, need to catch it*/ | |||||
resf = fopen (res_filename, "w"); | |||||
if (!resf) { | |||||
l2tp_log (LOG_DEBUG, "%s: Can't open result file %s\n", | |||||
@@ -1811,6 +1810,7 @@ void init (int argc,char *argv[]) | |||||
signal (SIGCHLD, &sigchld_handler); | |||||
signal (SIGUSR1, &sigusr1_handler); | |||||
signal (SIGHUP, &sighup_handler); | |||||
+ signal (SIGPIPE, SIG_IGN); | |||||
init_scheduler (); | |||||
unlink(gconfig.controlfile); | |||||
-- | |||||
1.7.10.4 | |||||
@ -1,119 +0,0 @@ | |||||
From 26b77b7cdc70beddc68507f74372a4e2815720f0 Mon Sep 17 00:00:00 2001 | |||||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||||
Date: Sun, 17 May 2015 10:53:44 +0800 | |||||
Subject: [PATCH 210/210] xl2tpd-control: show all available commands in | |||||
--help. | |||||
--- | |||||
xl2tpd-control.c | 63 ++++++++++++++++++++++++++++++++++++++---------------- | |||||
1 file changed, 44 insertions(+), 19 deletions(-) | |||||
diff --git a/xl2tpd-control.c b/xl2tpd-control.c | |||||
index 6b08850..b98ff24 100644 | |||||
--- a/xl2tpd-control.c | |||||
+++ b/xl2tpd-control.c | |||||
@@ -51,6 +51,7 @@ struct command_t | |||||
char *name; | |||||
int (*handler) (FILE*, char* tunnel, int optc, char *optv[]); | |||||
int requires_tunnel; | |||||
+ char *help; | |||||
}; | |||||
int command_add_lac (FILE*, char* tunnel, int optc, char *optv[]); | |||||
@@ -65,13 +66,29 @@ int command_available (FILE*, char* tunnel, int optc, char *optv[]); | |||||
struct command_t commands[] = { | |||||
/* Keep this command mapping for backwards compat */ | |||||
- {"add", &command_add_lac, TUNNEL_REQUIRED}, | |||||
- {"connect", &command_connect_lac, TUNNEL_REQUIRED}, | |||||
- {"disconnect", &command_disconnect_lac, TUNNEL_REQUIRED}, | |||||
- {"remove", &command_remove_lac, TUNNEL_REQUIRED}, | |||||
+ {"add", &command_add_lac, TUNNEL_REQUIRED, | |||||
+ "\tadd\tadds new or modify existing lac configuration.\n" | |||||
+ "\t\tConfiguration must be specified as command options in\n" | |||||
+ "\t\t<key>=<value> pairs format.\n" | |||||
+ "\t\tSee available options in xl2tpd.conf(5)\n" | |||||
+ }, | |||||
+ {"connect", &command_connect_lac, TUNNEL_REQUIRED, | |||||
+ "\tconnect\ttries to activate the tunnel.\n" | |||||
+ "\t\tUsername and secret for the tunnel can be passed as\n" | |||||
+ "\t\tcommand options.\n" | |||||
+ }, | |||||
+ {"disconnect", &command_disconnect_lac, TUNNEL_REQUIRED, | |||||
+ "\tdisconnect\tdisconnects the tunnel.\n" | |||||
+ }, | |||||
+ {"remove", &command_remove_lac, TUNNEL_REQUIRED, | |||||
+ "\tremove\tremoves lac configuration from xl2tpd.\n" | |||||
+ "\t\txl2tpd disconnects the tunnel before removing.\n" | |||||
+ }, | |||||
/* LAC commands */ | |||||
- {"add-lac", &command_add_lac, TUNNEL_REQUIRED}, | |||||
+ {"add-lac", &command_add_lac, TUNNEL_REQUIRED, | |||||
+ "\tadd-lns\tadds new or modify existing lns configuration.\n" | |||||
+ }, | |||||
{"connect-lac", &command_connect_lac, TUNNEL_REQUIRED}, | |||||
{"disconnect-lac", &command_disconnect_lac, TUNNEL_REQUIRED}, | |||||
{"remove-lac", &command_remove_lac, TUNNEL_REQUIRED}, | |||||
@@ -89,36 +106,44 @@ struct command_t commands[] = { | |||||
void usage() | |||||
{ | |||||
+ int i; | |||||
+ | |||||
printf ("\nxl2tpd server version %s\n", SERVER_VERSION); | |||||
printf ("Usage: xl2tpd-control [-c <PATH>] <command> <tunnel name> [<COMMAND OPTIONS>]\n" | |||||
"\n" | |||||
" -c\tspecifies xl2tpd control file\n" | |||||
" -d\tspecify xl2tpd-control to run in debug mode\n" | |||||
"--help\tshows extended help\n" | |||||
- "Available commands: add, connect, disconnect, remove, add-lns\n" | |||||
); | |||||
+ | |||||
+ printf ("Available commands: "); | |||||
+ for (i = 0; commands[i].name; i++) { | |||||
+ struct command_t *command = &commands[i]; | |||||
+ int last = command[1].name == NULL; | |||||
+ | |||||
+ printf ("%s%s", command->name, !last ? ", " : "\n"); | |||||
+ } | |||||
} | |||||
void help() | |||||
{ | |||||
+ int i; | |||||
+ | |||||
usage(); | |||||
printf ( | |||||
"\n" | |||||
"Commands help:\n" | |||||
- "\tadd\tadds new or modify existing lac configuration.\n" | |||||
- "\t\tConfiguration must be specified as command options in\n" | |||||
- "\t\t<key>=<value> pairs format.\n" | |||||
- "\t\tSee available options in xl2tpd.conf(5)\n" | |||||
- "\tconnect\ttries to activate the tunnel.\n" | |||||
- "\t\tUsername and secret for the tunnel can be passed as\n" | |||||
- "\t\tcommand options.\n" | |||||
- "\tdisconnect\tdisconnects the tunnel.\n" | |||||
- "\tremove\tremoves lac configuration from xl2tpd.\n" | |||||
- "\t\txl2tpd disconnects the tunnel before removing.\n" | |||||
- "\n" | |||||
- "\tadd-lns\tadds new or modify existing lns configuration.\n" | |||||
- "See xl2tpd-control man page for more help\n" | |||||
); | |||||
+ | |||||
+ for (i = 0; commands[i].name; i++) { | |||||
+ struct command_t *command = &commands[i]; | |||||
+ | |||||
+ if (!command->help) | |||||
+ continue; | |||||
+ printf ("%s", command->help); | |||||
+ } | |||||
+ /*FIXME Ha! there is currently no manpage for xl2tpd-control */ | |||||
+ printf ("See xl2tpd-control man page for more help\n"); | |||||
} | |||||
void cleanup(void) | |||||
-- | |||||
1.7.10.4 | |||||