diff options
author | Lennart Poettering <lennart@poettering.net> | 2005-03-30 16:14:39 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2005-03-30 16:14:39 +0000 |
commit | 6d3916ae3fbe6978153f68a17ded0d7f9b1ade8b (patch) | |
tree | da00d0a16dc7b2af27e9a87b543b3d670d064a6c | |
parent | e115e2cf1ea991138f90d33dd918545de07577ce (diff) |
add patch from Thomas Hood which adds a new option --no-startup
git-svn-id: file:///home/lennart/svn/public/ifplugd/trunk@119 2bf48fe7-cfc1-0310-909f-d9042e1e0fef
-rw-r--r-- | man/ifplugd.8.xml.in | 7 | ||||
-rw-r--r-- | src/ifplugd.c | 295 |
2 files changed, 158 insertions, 144 deletions
diff --git a/man/ifplugd.8.xml.in b/man/ifplugd.8.xml.in index e720ce2..8f0a51b 100644 --- a/man/ifplugd.8.xml.in +++ b/man/ifplugd.8.xml.in @@ -143,6 +143,13 @@ </option> <option> + <p><opt>-p | --no-startup</opt></p> + <optdesc><p> + Don't call the script to bring up network on deamon start (default: off) + </p></optdesc> + </option> + + <option> <p><opt>-q | --no-shutdown</opt></p> <optdesc><p> Don't call the script for network shutdown on deamon quit (default: off) diff --git a/src/ifplugd.c b/src/ifplugd.c index 6bd34c4..e1df19c 100644 --- a/src/ifplugd.c +++ b/src/ifplugd.c @@ -61,25 +61,26 @@ #define IFPLUGD_ENV_CURRENT "IFPLUGD_CURRENT" int interface_auto_up = 1, - interface_do_message = 1; + interface_do_message = 1; char *interface = NULL; char *run = SYSCONFDIR"/ifplugd/ifplugd.action"; char *extra_arg = NULL; int polltime = 1, - delay_up = 0, - delay_down = 5; + delay_up = 0, + delay_down = 5; int daemonize = 1, - use_beep = 1, - no_shutdown_script = 0, - wait_on_fork = 0, - wait_on_kill = 0, - use_syslog = 1, - ignore_retval = 0, - initial_down = 0, - use_ifmonitor = 0; + use_beep = 1, + no_startup_script = 0, + no_shutdown_script = 0, + wait_on_fork = 0, + wait_on_kill = 0, + use_syslog = 1, + ignore_retval = 0, + initial_down = 0, + use_ifmonitor = 0; int disabled = 0; @@ -161,7 +162,7 @@ int action(interface_status_t status) { if (_pipe[1] > 2) close(_pipe[1]); - umask(0022); /* Set up a sane umask */ + umask(0022); /* Set up a sane umask */ execl(run, run, interface, arg, extra_arg, (char *) NULL); @@ -294,9 +295,9 @@ interface_status_t detect_beat(int fd, char*iface) { interface_status_t status; static interface_status_t last_status = (interface_status_t) -1; - if (disabled) - return IFSTATUS_DOWN; - + if (disabled) + return IFSTATUS_DOWN; + if ((status = detect_beat_func(fd, iface)) == IFSTATUS_ERR) status = failure_status; @@ -339,19 +340,19 @@ int welcome_iface(int fd, char *iface) { else daemon_log(LOG_INFO, "%s", txt); - cached_detect_beat_func = NULL; - + cached_detect_beat_func = NULL; + return 0; } int ifmonitor_cb(int b, int index, unsigned short type, const char *name) { - if (!name) - return 0; + if (!name) + return 0; - if (!strcmp(name, interface)) - disabled = !b; + if (!strcmp(name, interface)) + disabled = !b; - return 0; + return 0; } int is_iface_available(int s, char *p) { @@ -399,7 +400,7 @@ void work(void) { case API_MII: detect_beat_func = interface_detect_beat_mii; break; case API_PRIVATE: detect_beat_func = interface_detect_beat_priv; break; case API_WLAN: detect_beat_func = interface_detect_beat_wlan; break; - case API_IFF: detect_beat_func = interface_detect_beat_iff; break; + case API_IFF: detect_beat_func = interface_detect_beat_iff; break; default: detect_beat_func = detect_beat_auto; @@ -407,32 +408,32 @@ void work(void) { break; } - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { daemon_log(LOG_ERR, "socket(): %s", strerror(errno)); - goto finish; + goto finish; } - if (use_ifmonitor) { - int b; - if ((b = is_iface_available(fd, interface)) < 0) { - daemon_log(LOG_ERR, "Failed to check interface availabilty!"); - goto finish; - } - - disabled = !b; + if (use_ifmonitor) { + int b; + if ((b = is_iface_available(fd, interface)) < 0) { + daemon_log(LOG_ERR, "Failed to check interface availabilty!"); + goto finish; + } + + disabled = !b; - if (nlapi_open(RTMGRP_LINK) < 0) - goto finish; + if (nlapi_open(RTMGRP_LINK) < 0) + goto finish; - if (ifmonitor_init(ifmonitor_cb) < 0) - goto finish; - } else - disabled = 0; + if (ifmonitor_init(ifmonitor_cb) < 0) + goto finish; + } else + disabled = 0; - if (!disabled) { - if (welcome_iface(fd, interface) < 0) - goto finish; - } + if (!disabled) { + if (welcome_iface(fd, interface) < 0) + goto finish; + } if ((status = detect_beat(fd, interface)) == IFSTATUS_ERR) goto finish; @@ -440,7 +441,7 @@ void work(void) { daemon_log(LOG_INFO, "Initialization complete, link beat %sdetected%s.", status == IFSTATUS_UP ? "" : "not ", use_ifmonitor ? (disabled ? ", interface disabled" : ", interface enabled") : ""); beep(status == IFSTATUS_UP ? 0 : 1); - if (status == IFSTATUS_UP || initial_down) + if ((!no_startup_script && status == IFSTATUS_UP) || initial_down) if (action(status) < 0) goto finish; @@ -453,17 +454,17 @@ void work(void) { FD_ZERO(&fds); FD_SET(sigfd = daemon_signal_fd(), &fds); - if (use_ifmonitor) - FD_SET(nlapi_fd, &fds); + if (use_ifmonitor) + FD_SET(nlapi_fd, &fds); for (;;) { interface_status_t s; fd_set qfds = fds; - int d; + int d; struct timeval tv; - tv.tv_sec = polltime; - tv.tv_usec = 0; + tv.tv_sec = polltime; + tv.tv_usec = 0; if (select(FD_SETSIZE, &qfds, NULL, NULL, &tv) < 0) { if (errno == EINTR) @@ -473,55 +474,55 @@ void work(void) { goto finish; } - //daemon_log(LOG_INFO, "select()"); - - d = disabled; - s = status; - - if (use_ifmonitor) { - - if (FD_ISSET(nlapi_fd, &qfds)) { - if (nlapi_work(0) < 0) - goto finish; - } - - if (d && !disabled) { - daemon_log(LOG_INFO, "Interface enabled"); - welcome_iface(fd, interface); - status = IFSTATUS_DOWN; - } - - if (!d && disabled) { - daemon_log(LOG_INFO, "Interface disabled"); - status = IFSTATUS_DOWN; - } - } + //daemon_log(LOG_INFO, "select()"); + + d = disabled; + s = status; + + if (use_ifmonitor) { + + if (FD_ISSET(nlapi_fd, &qfds)) { + if (nlapi_work(0) < 0) + goto finish; + } + + if (d && !disabled) { + daemon_log(LOG_INFO, "Interface enabled"); + welcome_iface(fd, interface); + status = IFSTATUS_DOWN; + } + + if (!d && disabled) { + daemon_log(LOG_INFO, "Interface disabled"); + status = IFSTATUS_DOWN; + } + } if (!paused && !disabled) { - //daemon_log(LOG_INFO, "detect"); + //daemon_log(LOG_INFO, "detect"); if ((status = detect_beat(fd, interface)) == IFSTATUS_ERR) { - if (!use_ifmonitor) - goto finish; - - status = IFSTATUS_DOWN; - } - } - - if (status != s) { - daemon_log(LOG_INFO, "Link beat %s.", status == IFSTATUS_DOWN ? "lost" : "detected"); - beep(status == IFSTATUS_UP ? 0 : 1); - - if (t) - t = 0; - else { - t = time(NULL); - - if (status == IFSTATUS_UP) - t += delay_up; - - if (status == IFSTATUS_DOWN) - t += delay_down; + if (!use_ifmonitor) + goto finish; + + status = IFSTATUS_DOWN; + } + } + + if (status != s) { + daemon_log(LOG_INFO, "Link beat %s.", status == IFSTATUS_DOWN ? "lost" : "detected"); + beep(status == IFSTATUS_UP ? 0 : 1); + + if (t) + t = 0; + else { + t = time(NULL); + + if (status == IFSTATUS_UP) + t += delay_up; + + if (status == IFSTATUS_DOWN) + t += delay_down; } } @@ -548,8 +549,8 @@ void work(void) { case SIGHUP: daemon_log(LOG_INFO, "SIGHUP: %s, link detected on %s: %s", paused ? "Suspended" : "Running", interface, status == IFSTATUS_DOWN ? "no" : "yes"); - if (use_ifmonitor) - daemon_log(LOG_INFO, "SIGHUP: Interface %s", disabled ? "disabled" : "enabled"); + if (use_ifmonitor) + daemon_log(LOG_INFO, "SIGHUP: Interface %s", disabled ? "disabled" : "enabled"); break; case SIGUSR1: @@ -570,7 +571,7 @@ void work(void) { } } - if (t && t < time(NULL)) { + if (t && t < time(NULL)) { t = 0; if (action(status) < 0) @@ -579,7 +580,7 @@ void work(void) { } cleanup: - if (!no_shutdown_script && (status == IFSTATUS_UP || (status == IFSTATUS_DOWN && t))) { + if (!no_shutdown_script && (status == IFSTATUS_UP || (status == IFSTATUS_DOWN && t))) { setenv(IFPLUGD_ENV_PREVIOUS, strstatus(status), 1); setenv(IFPLUGD_ENV_CURRENT, strstatus(-1), 1); action(IFSTATUS_DOWN); @@ -591,9 +592,9 @@ finish: if (fd >= 0) close(fd); - if (use_ifmonitor) - nlapi_close(); - + if (use_ifmonitor) + nlapi_close(); + if (send_retval && daemonize && wait_on_fork) daemon_retval_send(255); @@ -611,7 +612,7 @@ void usage(char *p) { case API_MII: m = "mii"; break; case API_PRIVATE: m = "priv"; break; case API_WLAN: m = "wlan"; break; - case API_IFF: m = "iff"; break; + case API_IFF: m = "iff"; break; default: m = "auto"; } @@ -619,8 +620,8 @@ void usage(char *p) { p = strchr(p, '/')+1; printf("%s -- Network Interface Plug Detection Daemon\n\n" - "Usage: %s [options]\n\n" - "Options:\n" + "Usage: %s [options]\n\n" + "Options:\n" " -a --no-auto Do not enable interface automatically (%s)\n" " -n --no-daemon Do not daemonize (for debugging) (%s)\n" " -s --no-syslog Do not use syslog, use stderr instead (for debugging) (%s)\n" @@ -634,15 +635,16 @@ void usage(char *p) { " -u --delay-up=SECS Specify delay for configuring interface (%i)\n" " -d --delay-down=SECS Specify delay for deconfiguring interface (%i)\n" " -m --api-mode=MODE Force API mode (mii, priv, ethtool, wlan, auto) (%s)\n" + " -p --no-startup Don't run script on daemon startup (%s)\n" " -q --no-shutdown Don't run script on daemon quit (%s)\n" - " -l --initial-down Run \"down\" script on startup if now cable is detected (%s)\n" + " -l --initial-down Run \"down\" script on startup if no cable is detected (%s)\n" " -w --wait-on-fork Wait until daemon fork finished (%s)\n" - " -W --wait-on-kill When run with -k, wait until the daemon died (%s)\n" - " -x --extra-arg Specify an extra argument for action script\n" - " -M --monitor Use interface monitoring (%s)\n" + " -W --wait-on-kill When run with -k, wait until the daemon died (%s)\n" + " -x --extra-arg Specify an extra argument for action script\n" + " -M --monitor Use interface monitoring (%s)\n" " -h --help Show this help\n" " -k --kill Kill a running daemon\n" - " -c --check-running Check if a daemon is currently running\n" + " -c --check-running Check if a daemon is currently running\n" " -v --version Show version\n" " -S --suspend Suspend running daemon\n" " -R --resume Resume running daemon\n" @@ -661,11 +663,12 @@ void usage(char *p) { delay_up, delay_down, m, + no_startup_script ? "on" : "off", no_shutdown_script ? "on" : "off", - initial_down ? "on" : "off", + initial_down ? "on" : "off", wait_on_fork ? "on" : "off", - wait_on_kill ? "on" : "off", - use_ifmonitor ? "on" : "off"); + wait_on_kill ? "on" : "off", + use_ifmonitor ? "on" : "off"); } void parse_args(int argc, char *argv[]) { @@ -684,7 +687,8 @@ void parse_args(int argc, char *argv[]) { {"delay-down", required_argument, 0, 'd'}, {"api-mode", required_argument, 0, 'm'}, {"wait-on-fork", no_argument, 0, 'w'}, - {"wait-on-kill", no_argument, 0, 'W'}, + {"wait-on-kill", no_argument, 0, 'W'}, + {"no-startup", no_argument, 0, 'p'}, {"no-shutdown", no_argument, 0, 'q'}, {"help", no_argument, 0, 'h'}, {"kill", no_argument, 0, 'k'}, @@ -694,8 +698,8 @@ void parse_args(int argc, char *argv[]) { {"suspend", no_argument, 0, 'S'}, {"resume", no_argument, 0, 'R'}, {"info", no_argument, 0, 'z'}, - {"inital-down", no_argument, 0, 'l'}, - {"monitor", no_argument, 0, 'M'}, + {"initial-down", no_argument, 0, 'l'}, + {"monitor", no_argument, 0, 'M'}, {0, 0, 0, 0} }; int option_index = 0; @@ -704,7 +708,7 @@ void parse_args(int argc, char *argv[]) { for (;;) { int c; - if ((c = getopt_long(argc, argv, "asni:r:t:u:d:hkbfFvm:qwx:cISRzlMW", long_options, &option_index)) < 0) + if ((c = getopt_long(argc, argv, "asni:r:t:u:d:hkbfFvm:pqwx:cISRzlMW", long_options, &option_index)) < 0) break; switch (c) { @@ -718,8 +722,8 @@ void parse_args(int argc, char *argv[]) { daemonize = !daemonize; break; case 'i' : - if (interface) - free(interface); + if (interface) + free(interface); interface = strdup(optarg); break; case 'r': @@ -766,25 +770,28 @@ void parse_args(int argc, char *argv[]) { case 'p': api_mode = API_PRIVATE; break; case 'w': api_mode = API_WLAN; break; case 'a': api_mode = API_AUTO; break; - case 'i': api_mode = API_IFF; break; + case 'i': api_mode = API_IFF; break; default: daemon_log(LOG_ERR, "Unknown API mode: %s", optarg); exit(2); } break; + case 'p': + no_startup_script = !no_startup_script; + break; case 'q': no_shutdown_script = !no_shutdown_script; break; - case 'l': - initial_down = !initial_down; - break; + case 'l': + initial_down = !initial_down; + break; case 'w': wait_on_fork = !wait_on_fork; break; case 'W': wait_on_kill = !wait_on_kill; break; - case 'x': + case 'x': extra_arg = strdup(optarg); break; case 'S': @@ -796,9 +803,9 @@ void parse_args(int argc, char *argv[]) { case 'z': _info = 1; break; - case 'M': - use_ifmonitor = !use_ifmonitor; - break; + case 'M': + use_ifmonitor = !use_ifmonitor; + break; default: daemon_log(LOG_ERR, "Unknown parameter."); exit(1); @@ -806,8 +813,8 @@ void parse_args(int argc, char *argv[]) { } - if (!interface) - interface = strdup("eth0"); + if (!interface) + interface = strdup("eth0"); if (!use_syslog) daemon_log_use = DAEMON_LOG_STDERR; @@ -818,14 +825,14 @@ void parse_args(int argc, char *argv[]) { } if (_kill || _resume || _suspend || _info) { - int rv; - - if (_kill && wait_on_kill) - rv = daemon_pid_file_kill_wait(SIGINT, 5); - else - rv = daemon_pid_file_kill(_kill ? SIGINT : (_resume ? SIGUSR2 : (_info ? SIGHUP : SIGUSR1))); - - if (rv < 0) { + int rv; + + if (_kill && wait_on_kill) + rv = daemon_pid_file_kill_wait(SIGINT, 5); + else + rv = daemon_pid_file_kill(_kill ? SIGINT : (_resume ? SIGUSR2 : (_info ? SIGHUP : SIGUSR1))); + + if (rv < 0) { daemon_log(LOG_ERR, "Failed to kill daemon. (%s)", strerror(errno)); exit(6); } @@ -849,11 +856,11 @@ void parse_args(int argc, char *argv[]) { if (pid == (pid_t) -1 || pid == 0) { printf("ifplugd not running.\n"); - exit(255); - } else { + exit(255); + } else { printf("ifplugd process for device %s running as pid %u.\n", interface, pid); - exit(0); - } + exit(0); + } } } @@ -880,7 +887,7 @@ int main(int argc, char* argv[]) { return 2; } - if (daemon_pid_file_is_running() >= 0) { + if (daemon_pid_file_is_running() >= 0) { daemon_log(LOG_ERR, "Sorry, there is already an instance of ifplugd for %s running.", interface); return 4; } @@ -908,9 +915,9 @@ int main(int argc, char* argv[]) { kill(pid, SIGTERM); } - if (c > 3) - daemon_log(LOG_ERR, "Daemon failed with error condition #%i. See syslog for details", c); - + if (c > 3) + daemon_log(LOG_ERR, "Daemon failed with error condition #%i. See syslog for details", c); + return c; } } |