The following commit has been merged in the master branch:
commit 0c8f8325135fed9b14dcfb55b2b119314a69f0a4
Author: Guillem Jover <[email protected]>
Date:   Mon Nov 26 19:51:13 2012 +0100

    s-s-d: Refactor start action off main() into a new do_start() function

diff --git a/utils/start-stop-daemon.c b/utils/start-stop-daemon.c
index d966127..265e80a 100644
--- a/utils/start-stop-daemon.c
+++ b/utils/start-stop-daemon.c
@@ -1421,6 +1421,119 @@ do_findprocs(void)
 }
 
 static void
+do_start(int argc, char **argv)
+{
+       int devnull_fd = -1;
+       gid_t rgid;
+       uid_t ruid;
+
+       do_findprocs();
+
+       if (found) {
+               if (quietmode <= 0)
+                       printf("%s already running.\n", execname ? execname : 
"process");
+               exit(exitnodo);
+       }
+       if (testmode && quietmode <= 0) {
+               printf("Would start %s ", startas);
+               while (argc-- > 0)
+                       printf("%s ", *argv++);
+               if (changeuser != NULL) {
+                       printf(" (as user %s[%d]", changeuser, runas_uid);
+                       if (changegroup != NULL)
+                               printf(", and group %s[%d])", changegroup, 
runas_gid);
+                       else
+                               printf(")");
+               }
+               if (changeroot != NULL)
+                       printf(" in directory %s", changeroot);
+               if (nicelevel)
+                       printf(", and add %i to the priority", nicelevel);
+               if (proc_sched)
+                       printf(", with scheduling policy %s with priority %i",
+                              proc_sched->policy_name, proc_sched->priority);
+               if (io_sched)
+                       printf(", with IO scheduling class %s with priority %i",
+                              io_sched->policy_name, io_sched->priority);
+               printf(".\n");
+       }
+       if (testmode)
+               exit(0);
+       if (quietmode < 0)
+               printf("Starting %s...\n", startas);
+       *--argv = startas;
+       if (background)
+               /* Ok, we need to detach this process. */
+               daemonize();
+       if (background && close_io) {
+               devnull_fd = open("/dev/null", O_RDWR);
+               if (devnull_fd < 0)
+                       fatal("unable to open '%s'", "/dev/null");
+       }
+       if (nicelevel) {
+               errno = 0;
+               if ((nice(nicelevel) == -1) && (errno != 0))
+                       fatal("unable to alter nice level by %i", nicelevel);
+       }
+       if (proc_sched)
+               set_proc_schedule(proc_sched);
+       if (io_sched)
+               set_io_schedule(io_sched);
+       if (umask_value >= 0)
+               umask(umask_value);
+       if (mpidfile && pidfile != NULL)
+               /* User wants _us_ to make the pidfile. */
+               write_pidfile(pidfile, getpid());
+       if (changeroot != NULL) {
+               if (chdir(changeroot) < 0)
+                       fatal("unable to chdir() to %s", changeroot);
+               if (chroot(changeroot) < 0)
+                       fatal("unable to chroot() to %s", changeroot);
+       }
+       if (chdir(changedir) < 0)
+               fatal("unable to chdir() to %s", changedir);
+
+       rgid = getgid();
+       ruid = getuid();
+       if (changegroup != NULL) {
+               if (rgid != (gid_t)runas_gid)
+                       if (setgid(runas_gid))
+                               fatal("unable to set gid to %d", runas_gid);
+       }
+       if (changeuser != NULL) {
+               /* We assume that if our real user and group are the same as
+                * the ones we should switch to, the supplementary groups
+                * will be already in place. */
+               if (rgid != (gid_t)runas_gid || ruid != (uid_t)runas_uid)
+                       if (initgroups(changeuser, runas_gid))
+                               fatal("unable to set initgroups() with gid %d",
+                                     runas_gid);
+
+               if (ruid != (uid_t)runas_uid)
+                       if (setuid(runas_uid))
+                               fatal("unable to set uid to %s", changeuser);
+       }
+
+       /* Set a default umask for dumb programs. */
+       if (background && umask_value < 0)
+               umask(022);
+
+       if (background && close_io) {
+               int i;
+
+               dup2(devnull_fd, 0); /* stdin */
+               dup2(devnull_fd, 1); /* stdout */
+               dup2(devnull_fd, 2); /* stderr */
+
+                /* Now close all extra fds. */
+               for (i = get_open_fd_max() - 1; i >= 3; --i)
+                       close(i);
+       }
+       execv(startas, argv);
+       fatal("unable to start %s", startas);
+}
+
+static void
 do_stop(int sig_num, int *n_killed, int *n_notkilled)
 {
        struct pid_list *p;
@@ -1630,10 +1743,6 @@ run_stop_schedule(void)
 int
 main(int argc, char **argv)
 {
-       enum status_code prog_status;
-       int devnull_fd = -1;
-       gid_t rgid;
-       uid_t ruid;
        progname = argv[0];
 
        parse_options(argc, argv);
@@ -1697,116 +1806,20 @@ main(int argc, char **argv)
                        setenv("HOME", pw->pw_dir, 1);
        }
 
+       if (action == action_start)
+               do_start(argc, argv);
+
        if (action == action_stop) {
                int i = run_stop_schedule();
                exit(i);
        }
 
-       prog_status = do_findprocs();
+       if (action == action_status) {
+               enum status_code prog_status;
 
-       if (action == action_status)
+               prog_status = do_findprocs();
                exit(prog_status);
-
-       if (found) {
-               if (quietmode <= 0)
-                       printf("%s already running.\n", execname ? execname : 
"process");
-               exit(exitnodo);
-       }
-       if (testmode && quietmode <= 0) {
-               printf("Would start %s ", startas);
-               while (argc-- > 0)
-                       printf("%s ", *argv++);
-               if (changeuser != NULL) {
-                       printf(" (as user %s[%d]", changeuser, runas_uid);
-                       if (changegroup != NULL)
-                               printf(", and group %s[%d])", changegroup, 
runas_gid);
-                       else
-                               printf(")");
-               }
-               if (changeroot != NULL)
-                       printf(" in directory %s", changeroot);
-               if (nicelevel)
-                       printf(", and add %i to the priority", nicelevel);
-               if (proc_sched)
-                       printf(", with scheduling policy %s with priority %i",
-                              proc_sched->policy_name, proc_sched->priority);
-               if (io_sched)
-                       printf(", with IO scheduling class %s with priority %i",
-                              io_sched->policy_name, io_sched->priority);
-               printf(".\n");
-       }
-       if (testmode)
-               exit(0);
-       if (quietmode < 0)
-               printf("Starting %s...\n", startas);
-       *--argv = startas;
-       if (background)
-               /* Ok, we need to detach this process. */
-               daemonize();
-       if (background && close_io) {
-               devnull_fd = open("/dev/null", O_RDWR);
-               if (devnull_fd < 0)
-                       fatal("unable to open '%s'", "/dev/null");
-       }
-       if (nicelevel) {
-               errno = 0;
-               if ((nice(nicelevel) == -1) && (errno != 0))
-                       fatal("unable to alter nice level by %i", nicelevel);
-       }
-       if (proc_sched)
-               set_proc_schedule(proc_sched);
-       if (io_sched)
-               set_io_schedule(io_sched);
-       if (umask_value >= 0)
-               umask(umask_value);
-       if (mpidfile && pidfile != NULL)
-               /* User wants _us_ to make the pidfile. */
-               write_pidfile(pidfile, getpid());
-       if (changeroot != NULL) {
-               if (chdir(changeroot) < 0)
-                       fatal("unable to chdir() to %s", changeroot);
-               if (chroot(changeroot) < 0)
-                       fatal("unable to chroot() to %s", changeroot);
-       }
-       if (chdir(changedir) < 0)
-               fatal("unable to chdir() to %s", changedir);
-
-       rgid = getgid();
-       ruid = getuid();
-       if (changegroup != NULL) {
-               if (rgid != (gid_t)runas_gid)
-                       if (setgid(runas_gid))
-                               fatal("unable to set gid to %d", runas_gid);
-       }
-       if (changeuser != NULL) {
-               /* We assume that if our real user and group are the same as
-                * the ones we should switch to, the supplementary groups
-                * will be already in place. */
-               if (rgid != (gid_t)runas_gid || ruid != (uid_t)runas_uid)
-                       if (initgroups(changeuser, runas_gid))
-                               fatal("unable to set initgroups() with gid %d",
-                                     runas_gid);
-
-               if (ruid != (uid_t)runas_uid)
-                       if (setuid(runas_uid))
-                               fatal("unable to set uid to %s", changeuser);
        }
 
-       /* Set a default umask for dumb programs. */
-       if (background && umask_value < 0)
-               umask(022);
-
-       if (background && close_io) {
-               int i;
-
-               dup2(devnull_fd, 0); /* stdin */
-               dup2(devnull_fd, 1); /* stdout */
-               dup2(devnull_fd, 2); /* stderr */
-
-                /* Now close all extra fds. */
-               for (i = get_open_fd_max() - 1; i >= 3; --i)
-                       close(i);
-       }
-       execv(startas, argv);
-       fatal("unable to start %s", startas);
+       return 0;
 }

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to