move code from signal handlers into mainloop, avoiding a race
condition when forking CLI
This commit is contained in:
parent
6fb1f18fb0
commit
05ea15956a
5 changed files with 58 additions and 60 deletions
4
Changes
4
Changes
|
|
@ -1,3 +1,7 @@
|
||||||
|
* Mon Sep 19 2005 Brendan O'Dea <bod@optus.net> 2.1.8
|
||||||
|
- Move code from signal handlers into mainloop, avoiding a race
|
||||||
|
condition when forking CLI.
|
||||||
|
|
||||||
* Fri Sep 16 2005 Brendan O'Dea <bod@optus.net> 2.1.7
|
* Fri Sep 16 2005 Brendan O'Dea <bod@optus.net> 2.1.7
|
||||||
- This time, for sure: really fix Protocol-Reject.
|
- This time, for sure: really fix Protocol-Reject.
|
||||||
|
|
||||||
|
|
|
||||||
101
l2tpns.c
101
l2tpns.c
|
|
@ -4,7 +4,7 @@
|
||||||
// Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced
|
// Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced
|
||||||
// vim: sw=8 ts=8
|
// vim: sw=8 ts=8
|
||||||
|
|
||||||
char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.140 2005/09/16 13:20:39 bodea Exp $";
|
char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.141 2005/09/19 00:29:12 bodea Exp $";
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
@ -96,7 +96,9 @@ uint32_t eth_tx = 0;
|
||||||
static uint32_t ip_pool_size = 1; // Size of the pool of addresses used for dynamic address allocation.
|
static uint32_t ip_pool_size = 1; // Size of the pool of addresses used for dynamic address allocation.
|
||||||
time_t time_now = 0; // Current time in seconds since epoch.
|
time_t time_now = 0; // Current time in seconds since epoch.
|
||||||
static char time_now_string[64] = {0}; // Current time as a string.
|
static char time_now_string[64] = {0}; // Current time as a string.
|
||||||
|
int time_changed = 0; // time_now changed
|
||||||
char main_quit = 0; // True if we're in the process of exiting.
|
char main_quit = 0; // True if we're in the process of exiting.
|
||||||
|
char main_reload = 0; // Re-load pending
|
||||||
linked_list *loaded_plugins;
|
linked_list *loaded_plugins;
|
||||||
linked_list *plugins[MAX_PLUGIN_TYPES];
|
linked_list *plugins[MAX_PLUGIN_TYPES];
|
||||||
|
|
||||||
|
|
@ -188,7 +190,6 @@ static void cache_ipv6map(struct in6_addr ip, int prefixlen, int s);
|
||||||
static void free_ip_address(sessionidt s);
|
static void free_ip_address(sessionidt s);
|
||||||
static void dump_acct_info(int all);
|
static void dump_acct_info(int all);
|
||||||
static void sighup_handler(int sig);
|
static void sighup_handler(int sig);
|
||||||
static void sigalrm_handler(int sig);
|
|
||||||
static void shutdown_handler(int sig);
|
static void shutdown_handler(int sig);
|
||||||
static void sigchild_handler(int sig);
|
static void sigchild_handler(int sig);
|
||||||
static void build_chap_response(uint8_t *challenge, uint8_t id, uint16_t challenge_length, uint8_t **challenge_response);
|
static void build_chap_response(uint8_t *challenge, uint8_t id, uint16_t challenge_length, uint8_t **challenge_response);
|
||||||
|
|
@ -210,11 +211,17 @@ static void unhide_value(uint8_t *value, size_t len, uint16_t type, uint8_t *vec
|
||||||
#define QUIT_SHUTDOWN 2 // SIGQUIT: shutdown sessions/tunnels, reject new connections
|
#define QUIT_SHUTDOWN 2 // SIGQUIT: shutdown sessions/tunnels, reject new connections
|
||||||
|
|
||||||
// return internal time (10ths since process startup), set f if given
|
// return internal time (10ths since process startup), set f if given
|
||||||
|
// as a side-effect sets time_now, and time_changed
|
||||||
static clockt now(double *f)
|
static clockt now(double *f)
|
||||||
{
|
{
|
||||||
struct timeval t;
|
struct timeval t;
|
||||||
gettimeofday(&t, 0);
|
gettimeofday(&t, 0);
|
||||||
if (f) *f = t.tv_sec + t.tv_usec / 1000000.0;
|
if (f) *f = t.tv_sec + t.tv_usec / 1000000.0;
|
||||||
|
if (t.tv_sec != time_now)
|
||||||
|
{
|
||||||
|
time_now = t.tv_sec;
|
||||||
|
time_changed++;
|
||||||
|
}
|
||||||
return (t.tv_sec - basetime) * 10 + t.tv_usec / 100000 + 1;
|
return (t.tv_sec - basetime) * 10 + t.tv_usec / 100000 + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3228,9 +3235,17 @@ static void mainloop(void)
|
||||||
int more = 0;
|
int more = 0;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
|
||||||
|
if (main_reload)
|
||||||
|
{
|
||||||
|
main_reload = 0;
|
||||||
|
read_config_file();
|
||||||
|
config->reload_config++;
|
||||||
|
}
|
||||||
|
|
||||||
if (config->reload_config)
|
if (config->reload_config)
|
||||||
{
|
{
|
||||||
// Update the config state based on config settings
|
config->reload_config = 0;
|
||||||
update_config();
|
update_config();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3394,6 +3409,34 @@ static void mainloop(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (time_changed)
|
||||||
|
{
|
||||||
|
double Mbps = ((1024.0 / 1024.0) * 8) / time_changed;
|
||||||
|
time_changed = 0;
|
||||||
|
|
||||||
|
// Log current traffic stats
|
||||||
|
snprintf(config->bandwidth, sizeof(config->bandwidth),
|
||||||
|
"UDP-ETH:%1.0f/%1.0f ETH-UDP:%1.0f/%1.0f TOTAL:%0.1f IN:%u OUT:%u",
|
||||||
|
(udp_rx / Mbps), (eth_tx / Mbps), (eth_rx / Mbps), (udp_tx / Mbps),
|
||||||
|
((udp_tx + udp_rx + eth_tx + eth_rx) / Mbps), udp_rx_pkt, eth_rx_pkt);
|
||||||
|
|
||||||
|
udp_tx = udp_rx = 0;
|
||||||
|
udp_rx_pkt = eth_rx_pkt = 0;
|
||||||
|
eth_tx = eth_rx = 0;
|
||||||
|
|
||||||
|
if (config->dump_speed)
|
||||||
|
printf("%s\n", config->bandwidth);
|
||||||
|
|
||||||
|
// Update the internal time counter
|
||||||
|
strftime(time_now_string, sizeof(time_now_string), "%Y-%m-%d %H:%M:%S", localtime(&time_now));
|
||||||
|
|
||||||
|
{
|
||||||
|
// Run timer hooks
|
||||||
|
struct param_timer p = { time_now };
|
||||||
|
run_plugins(PLUGIN_TIMER, &p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Runs on every machine (master and slaves).
|
// Runs on every machine (master and slaves).
|
||||||
if (next_cluster_ping <= TIME)
|
if (next_cluster_ping <= TIME)
|
||||||
{
|
{
|
||||||
|
|
@ -4069,14 +4112,13 @@ int main(int argc, char *argv[])
|
||||||
// Start the timer routine off
|
// Start the timer routine off
|
||||||
time(&time_now);
|
time(&time_now);
|
||||||
strftime(time_now_string, sizeof(time_now_string), "%Y-%m-%d %H:%M:%S", localtime(&time_now));
|
strftime(time_now_string, sizeof(time_now_string), "%Y-%m-%d %H:%M:%S", localtime(&time_now));
|
||||||
signal(SIGALRM, sigalrm_handler);
|
|
||||||
siginterrupt(SIGALRM, 0);
|
|
||||||
|
|
||||||
initplugins();
|
initplugins();
|
||||||
initdata(optdebug, optconfig);
|
initdata(optdebug, optconfig);
|
||||||
|
|
||||||
init_cli(hostname);
|
init_cli(hostname);
|
||||||
read_config_file();
|
read_config_file();
|
||||||
|
update_config();
|
||||||
init_tbf(config->num_tbfs);
|
init_tbf(config->num_tbfs);
|
||||||
|
|
||||||
LOG(0, 0, 0, "L2TPNS version " VERSION "\n");
|
LOG(0, 0, 0, "L2TPNS version " VERSION "\n");
|
||||||
|
|
@ -4152,8 +4194,6 @@ int main(int argc, char *argv[])
|
||||||
LOG(0, 0, 0, "Can't lock pages: %s\n", strerror(errno));
|
LOG(0, 0, 0, "Can't lock pages: %s\n", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
alarm(1);
|
|
||||||
|
|
||||||
// Drop privileges here
|
// Drop privileges here
|
||||||
if (config->target_uid > 0 && geteuid() == 0)
|
if (config->target_uid > 0 && geteuid() == 0)
|
||||||
setuid(config->target_uid);
|
setuid(config->target_uid);
|
||||||
|
|
@ -4175,53 +4215,11 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
static void sighup_handler(int sig)
|
static void sighup_handler(int sig)
|
||||||
{
|
{
|
||||||
if (log_stream)
|
main_reload++;
|
||||||
{
|
|
||||||
if (log_stream != stderr)
|
|
||||||
fclose(log_stream);
|
|
||||||
|
|
||||||
log_stream = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
read_config_file();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void sigalrm_handler(int sig)
|
|
||||||
{
|
|
||||||
// Log current traffic stats
|
|
||||||
|
|
||||||
snprintf(config->bandwidth, sizeof(config->bandwidth),
|
|
||||||
"UDP-ETH:%1.0f/%1.0f ETH-UDP:%1.0f/%1.0f TOTAL:%0.1f IN:%u OUT:%u",
|
|
||||||
(udp_rx / 1024.0 / 1024.0 * 8),
|
|
||||||
(eth_tx / 1024.0 / 1024.0 * 8),
|
|
||||||
(eth_rx / 1024.0 / 1024.0 * 8),
|
|
||||||
(udp_tx / 1024.0 / 1024.0 * 8),
|
|
||||||
((udp_tx + udp_rx + eth_tx + eth_rx) / 1024.0 / 1024.0 * 8),
|
|
||||||
udp_rx_pkt, eth_rx_pkt);
|
|
||||||
|
|
||||||
udp_tx = udp_rx = 0;
|
|
||||||
udp_rx_pkt = eth_rx_pkt = 0;
|
|
||||||
eth_tx = eth_rx = 0;
|
|
||||||
|
|
||||||
if (config->dump_speed)
|
|
||||||
printf("%s\n", config->bandwidth);
|
|
||||||
|
|
||||||
// Update the internal time counter
|
|
||||||
time(&time_now);
|
|
||||||
strftime(time_now_string, sizeof(time_now_string), "%Y-%m-%d %H:%M:%S", localtime(&time_now));
|
|
||||||
alarm(1);
|
|
||||||
|
|
||||||
{
|
|
||||||
// Run timer hooks
|
|
||||||
struct param_timer p = { time_now };
|
|
||||||
run_plugins(PLUGIN_TIMER, &p);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shutdown_handler(int sig)
|
static void shutdown_handler(int sig)
|
||||||
{
|
{
|
||||||
LOG(1, 0, 0, "Shutting down\n");
|
|
||||||
main_quit = (sig == SIGQUIT) ? QUIT_SHUTDOWN : QUIT_FAILOVER;
|
main_quit = (sig == SIGQUIT) ? QUIT_SHUTDOWN : QUIT_FAILOVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4471,8 +4469,6 @@ static void update_config()
|
||||||
LOG(0, 0, 0, "Can't write to PID file %s: %s\n", config->pid_file, strerror(errno));
|
LOG(0, 0, 0, "Can't write to PID file %s: %s\n", config->pid_file, strerror(errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
config->reload_config = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void read_config_file()
|
static void read_config_file()
|
||||||
|
|
@ -4490,7 +4486,6 @@ static void read_config_file()
|
||||||
cli_do_file(f);
|
cli_do_file(f);
|
||||||
LOG(3, 0, 0, "Done reading config file\n");
|
LOG(3, 0, 0, "Done reading config file\n");
|
||||||
fclose(f);
|
fclose(f);
|
||||||
update_config();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int sessionsetup(sessionidt s, tunnelidt t)
|
int sessionsetup(sessionidt s, tunnelidt t)
|
||||||
|
|
|
||||||
4
l2tpns.h
4
l2tpns.h
|
|
@ -1,5 +1,5 @@
|
||||||
// L2TPNS Global Stuff
|
// L2TPNS Global Stuff
|
||||||
// $Id: l2tpns.h,v 1.91 2005/09/16 05:04:29 bodea Exp $
|
// $Id: l2tpns.h,v 1.92 2005/09/19 00:29:12 bodea Exp $
|
||||||
|
|
||||||
#ifndef __L2TPNS_H__
|
#ifndef __L2TPNS_H__
|
||||||
#define __L2TPNS_H__
|
#define __L2TPNS_H__
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <libcli.h>
|
#include <libcli.h>
|
||||||
|
|
||||||
#define VERSION "2.1.7"
|
#define VERSION "2.1.8"
|
||||||
|
|
||||||
// Limits
|
// Limits
|
||||||
#define MAXTUNNEL 500 // could be up to 65535
|
#define MAXTUNNEL 500 // could be up to 65535
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
Summary: A high-speed clustered L2TP LNS
|
Summary: A high-speed clustered L2TP LNS
|
||||||
Name: l2tpns
|
Name: l2tpns
|
||||||
Version: 2.1.7
|
Version: 2.1.8
|
||||||
Release: 1
|
Release: 1
|
||||||
Copyright: GPL
|
Copyright: GPL
|
||||||
Group: System Environment/Daemons
|
Group: System Environment/Daemons
|
||||||
|
|
@ -43,5 +43,5 @@ rm -rf %{buildroot}
|
||||||
%attr(644,root,root) /usr/share/man/man[58]/*
|
%attr(644,root,root) /usr/share/man/man[58]/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Fri Sep 16 2005 Brendan O'Dea <bod@optus.net> 2.1.7-1
|
* Mon Sep 19 2005 Brendan O'Dea <bod@optus.net> 2.1.8-1
|
||||||
- 2.1.7 release, see /usr/share/doc/l2tpns-2.1.7/Changes
|
- 2.1.8 release, see /usr/share/doc/l2tpns-2.1.8/Changes
|
||||||
|
|
|
||||||
3
util.c
3
util.c
|
|
@ -1,6 +1,6 @@
|
||||||
/* Misc util functions */
|
/* Misc util functions */
|
||||||
|
|
||||||
char const *cvs_id_util = "$Id: util.c,v 1.12 2005/06/28 14:48:28 bodea Exp $";
|
char const *cvs_id_util = "$Id: util.c,v 1.13 2005/09/19 00:29:12 bodea Exp $";
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
@ -69,7 +69,6 @@ pid_t fork_and_close()
|
||||||
signal(SIGUSR1, SIG_DFL);
|
signal(SIGUSR1, SIG_DFL);
|
||||||
signal(SIGQUIT, SIG_DFL);
|
signal(SIGQUIT, SIG_DFL);
|
||||||
signal(SIGKILL, SIG_DFL);
|
signal(SIGKILL, SIG_DFL);
|
||||||
signal(SIGALRM, SIG_DFL);
|
|
||||||
signal(SIGTERM, SIG_DFL);
|
signal(SIGTERM, SIG_DFL);
|
||||||
|
|
||||||
// Close sockets
|
// Close sockets
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue