- Use netifd no_proto_task for notifying that xl2tpd does not have a protocol task running. - Use procd for xl2tpd service management. - Refreshed 2xx patches to - Prevent leftover regular type control result file. - Allow xl2tpd run as foreground process while logging via syslog. Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com> - bumped version - removed dependency on `ip` package as routes are setup by netifd if iproute2 is actually required, please depend on `@(PACKAGE_ip||PACKAGE_ip-full)` instead of `ip` Signed-off-by: Daniel Golle <daniel@makrotopia.org>lilik-openwrt-22.03
@ -1,18 +1,23 @@ | |||
#!/bin/sh /etc/rc.common | |||
# Copyright (C) 2006-2010 OpenWrt.org | |||
# Copyright (C) 2006-2015 OpenWrt.org | |||
START=60 | |||
USE_PROCD=1 | |||
BIN=xl2tpd | |||
DEFAULT=/etc/default/$BIN | |||
RUN_D=/var/run | |||
PID_F=$RUN_D/$BIN.pid | |||
RUN_D="/var/run/xl2tpd" | |||
PID_F="/var/run/xl2tpd.pid" | |||
start_service() { | |||
rm -rf "$RUN_D" | |||
mkdir -p "$RUN_D" | |||
start() { | |||
mkdir -p $RUN_D/$BIN | |||
[ -f $DEFAULT ] && . $DEFAULT | |||
$BIN $OPTIONS | |||
procd_open_instance | |||
procd_set_param command $BIN -D -l -p "$PID_F" | |||
procd_close_instance | |||
} | |||
stop() { | |||
[ -f $PID_F ] && kill $(cat $PID_F) | |||
stop_service() { | |||
rm -rf "$RUN_D" | |||
rm -rf "$PID_F" | |||
} |
@ -0,0 +1,58 @@ | |||
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 | |||
@ -0,0 +1,34 @@ | |||
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,22 +0,0 @@ | |||
From 1e8b82388578a622c5caf8fa04c238fdd7808ecc Mon Sep 17 00:00:00 2001 | |||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||
Date: Thu, 30 Apr 2015 13:53:40 +0800 | |||
Subject: [PATCH 6/7] xl2tpd: fix possible buffer overflow when filling | |||
stropt[]. | |||
--- | |||
xl2tpd.c | 3 ++- | |||
1 file changed, 2 insertions(+), 1 deletion(-) | |||
--- a/xl2tpd.c | |||
+++ b/xl2tpd.c | |||
@@ -490,7 +490,8 @@ int start_pppd (struct call *c, struct p | |||
{ | |||
struct ppp_opts *p = opts; | |||
- while (p) | |||
+ int maxn_opts = sizeof(stropt) / sizeof(stropt[0]) - 1; | |||
+ while (p && pos < maxn_opts) | |||
{ | |||
stropt[pos] = strdup (p->option); | |||
pos++; |
@ -1,21 +0,0 @@ | |||
From 44ced2bbf1d6b39bb36c3cb8be6e40c8764e2e8a Mon Sep 17 00:00:00 2001 | |||
From: Yousong Zhou <yszhou4tech@gmail.com> | |||
Date: Thu, 30 Apr 2015 13:57:36 +0800 | |||
Subject: [PATCH 7/7] l2tp_log: remove log prefix that will duplicate with | |||
procd. | |||
--- | |||
misc.c | 2 +- | |||
1 file changed, 1 insertion(+), 1 deletion(-) | |||
--- a/misc.c | |||
+++ b/misc.c | |||
@@ -61,7 +61,7 @@ void l2tp_log (int level, const char *fm | |||
init_log(); | |||
SYSLOG_CALL( syslog (level, "%s", buf) ); | |||
} else { | |||
- fprintf(stderr, "xl2tpd[%d]: %s", getpid(), buf); | |||
+ fprintf(stderr, "%s", buf); | |||
} | |||
} | |||
@ -0,0 +1,104 @@ | |||
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 | |||
@ -0,0 +1,26 @@ | |||
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 | |||
@ -0,0 +1,32 @@ | |||
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 | |||
@ -0,0 +1,119 @@ | |||
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 | |||
@ -1,12 +0,0 @@ | |||
Index: xl2tpd-1.3.7pre20141126/xl2tpd-control.c | |||
=================================================================== | |||
--- xl2tpd-1.3.7pre20141126.orig/xl2tpd-control.c | |||
+++ xl2tpd-1.3.7pre20141126/xl2tpd-control.c | |||
@@ -12,6 +12,7 @@ | |||
#define _GNU_SOURCE | |||
+#include <stdlib.h> | |||
#include <stdio.h> | |||
#include <string.h> | |||
#include <stdarg.h> |