diff options
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | dispatcher-daemon/NetworkManagerDispatcher.c | 36 | ||||
-rwxr-xr-x | initscript/RedHat/NetworkManager.in | 7 | ||||
-rwxr-xr-x | initscript/RedHat/NetworkManagerDispatcher.in | 5 | ||||
-rw-r--r-- | src/NetworkManager.c | 79 |
5 files changed, 114 insertions, 31 deletions
@@ -1,3 +1,21 @@ +2006-02-27 Dan Williams <dcbw@redhat.com> + + * dispatcher-daemon/NetworkManagerDispatcher.c + - Accept --pid-file with a path to a pidfile, write it out on + startup, and delete it on shutdown + + * src/NetworkManager.c + - Accept --pid-file with a path to a pidfile, write it out on + startup, and delete it on shutdown + - Move nm_print_usage() lower + + * initscripts/RedHat/NetworkManager.in + - Use new --pid-file option + - Fix service stopping to wait a bit for NM to quit + + * initscripts/RedHat/NetworkManagerDispatcher.in + - Use new --pid-file option + 2006-02-26 Dan Williams <dcbw@redhat.com> * src/Makefile.am diff --git a/dispatcher-daemon/NetworkManagerDispatcher.c b/dispatcher-daemon/NetworkManagerDispatcher.c index f10207c14e..5a83e29b72 100644 --- a/dispatcher-daemon/NetworkManagerDispatcher.c +++ b/dispatcher-daemon/NetworkManagerDispatcher.c @@ -280,15 +280,32 @@ static void nmd_print_usage (void) } +static gboolean +write_pidfile (const char *pidfile) +{ + int fd; + int ignored; + char pid[16]; + + if ((fd = open (pidfile, O_CREAT | O_WRONLY, 00644)) < 0) + return FALSE; + snprintf (pid, sizeof (pid), "%d", getpid ()); + ignored = write (fd, pid, strlen (pid)); + close (fd); + return TRUE; +} + + /* * main * */ int main (int argc, char *argv[]) { - gboolean become_daemon = TRUE; - GMainLoop *loop = NULL; + gboolean become_daemon = TRUE; + GMainLoop * loop = NULL; DBusConnection *connection = NULL; + char * pidfile = NULL; /* Parse options */ while (1) @@ -299,6 +316,7 @@ int main (int argc, char *argv[]) static struct option options[] = { {"no-daemon", 0, NULL, 0}, + {"pid-file", 1, NULL, 0}, {"help", 0, NULL, 0}, {NULL, 0, NULL, 0} }; @@ -318,6 +336,8 @@ int main (int argc, char *argv[]) } else if (strcmp (opt, "no-daemon") == 0) become_daemon = FALSE; + else if (strcmp (opt, "pid-file") == 0) + pidfile = g_strdup (optarg); else { nmd_print_usage (); @@ -344,6 +364,13 @@ int main (int argc, char *argv[]) if (!g_thread_supported ()) g_thread_init (NULL); + if (pidfile) + { + if (!write_pidfile (pidfile)) + nm_warning ("Couldn't write pid file %s! errno: %s", pidfile, + strerror (errno)); + } + /* Connect to the NetworkManager dbus service and run the main loop */ if ((connection = nmd_dbus_init ())) { @@ -351,5 +378,10 @@ int main (int argc, char *argv[]) g_main_loop_run (loop); } + /* Clean up pidfile */ + if (pidfile) + unlink (pidfile); + g_free (pidfile); + return 0; } diff --git a/initscript/RedHat/NetworkManager.in b/initscript/RedHat/NetworkManager.in index ea7475de24..4add42f537 100755 --- a/initscript/RedHat/NetworkManager.in +++ b/initscript/RedHat/NetworkManager.in @@ -37,17 +37,16 @@ start() echo $"Setting network parameters... " sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1 echo -n $"Starting NetworkManager daemon: " - daemon --check $servicename $processname + daemon --check $servicename $processname --pid-file=$pidfile RETVAL=$? echo - [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$servicename && echo `/sbin/pidof $processname` > $pidfile + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$servicename } stop() { echo -n $"Stopping NetworkManager daemon: " - - killproc $servicename -TERM + killproc -p $pidfile $servicename RETVAL=$? echo if [ $RETVAL -eq 0 ]; then diff --git a/initscript/RedHat/NetworkManagerDispatcher.in b/initscript/RedHat/NetworkManagerDispatcher.in index f391810926..31652d67e3 100755 --- a/initscript/RedHat/NetworkManagerDispatcher.in +++ b/initscript/RedHat/NetworkManagerDispatcher.in @@ -32,16 +32,15 @@ RETVAL=0 start() { echo -n $"Starting NetworkManagerDispatcher daemon: " - daemon --check $servicename $processname + daemon --check $servicename $processname --pid-file=$pidfile RETVAL=$? echo - [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$servicename && echo `/sbin/pidof $processname` > $pidfile + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$servicename } stop() { echo -n $"Stopping NetworkManagerDispatcher daemon: " - killproc $servicename -TERM RETVAL=$? echo diff --git a/src/NetworkManager.c b/src/NetworkManager.c index 18b84c0e9a..92e0bffbc3 100644 --- a/src/NetworkManager.c +++ b/src/NetworkManager.c @@ -495,28 +495,6 @@ static gboolean sigterm_pipe_handler (GIOChannel *src, GIOCondition condition, g return FALSE; } -/* - * nm_print_usage - * - * Prints program usage. - * - */ -static void nm_print_usage (void) -{ - fprintf (stderr, "\n" "usage : NetworkManager [--no-daemon] [--help]\n"); - fprintf (stderr, - "\n" - " --no-daemon Don't become a daemon\n" - " --enable-test-devices Allow dummy devices to be created via DBUS methods [DEBUG]\n" - " --help Show this information and exit\n" - "\n" - "NetworkManager monitors all network connections and automatically\n" - "chooses the best connection to use. It also allows the user to\n" - "specify wireless access points which wireless cards in the computer\n" - "should associate with.\n" - "\n"); -} - static void nm_device_link_activated (NmNetlinkMonitor *monitor, const gchar *interface_name, NMData *data) { NMDevice *dev = NULL; @@ -685,6 +663,47 @@ void nm_hal_deinit (NMData *data) } } + +static gboolean +write_pidfile (const char *pidfile) +{ + int fd; + int ignored; + char pid[16]; + + if ((fd = open (pidfile, O_CREAT | O_WRONLY, 00644)) < 0) + return FALSE; + snprintf (pid, sizeof (pid), "%d", getpid ()); + ignored = write (fd, pid, strlen (pid)); + close (fd); + return TRUE; +} + + +/* + * nm_print_usage + * + * Prints program usage. + * + */ +static void nm_print_usage (void) +{ + fprintf (stderr, "\n" "usage : NetworkManager [--no-daemon] [--pid-file=<file>] [--help]\n"); + fprintf (stderr, + "\n" + " --no-daemon Don't become a daemon\n" + " --pid-file=<path> Specify the location of a PID file\n" + " --enable-test-devices Allow dummy devices to be created via DBUS methods [DEBUG]\n" + " --help Show this information and exit\n" + "\n" + "NetworkManager monitors all network connections and automatically\n" + "chooses the best connection to use. It also allows the user to\n" + "specify wireless access points which wireless cards in the computer\n" + "should associate with.\n" + "\n"); +} + + /* * main * @@ -694,6 +713,7 @@ int main( int argc, char *argv[] ) gboolean become_daemon = TRUE; gboolean enable_test_devices = FALSE; char * owner; + char * pidfile = NULL; if (getuid () != 0) { @@ -711,6 +731,7 @@ int main( int argc, char *argv[] ) static struct option options[] = { {"no-daemon", 0, NULL, 0}, {"enable-test-devices", 0, NULL, 0}, + {"pid-file", 1, NULL, 0}, {"help", 0, NULL, 0}, {NULL, 0, NULL, 0} }; @@ -732,6 +753,8 @@ int main( int argc, char *argv[] ) become_daemon = FALSE; else if (strcmp (opt, "enable-test-devices") == 0) enable_test_devices = TRUE; + else if (strcmp (opt, "pid-file") == 0) + pidfile = g_strdup (optarg); break; default: @@ -755,6 +778,13 @@ int main( int argc, char *argv[] ) if (!g_thread_supported ()) g_thread_init (NULL); dbus_g_thread_init (); + + if (pidfile) + { + if (!write_pidfile (pidfile)) + nm_warning ("Couldn't write pid file %s! errno: %s", pidfile, + strerror (errno)); + } nm_logging_setup (become_daemon); nm_info ("starting..."); @@ -826,5 +856,10 @@ int main( int argc, char *argv[] ) nm_data_free (nm_data); nm_logging_shutdown (); + /* Clean up pidfile */ + if (pidfile) + unlink (pidfile); + g_free (pidfile); + exit (0); } |