]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/daemon.c
Merge remote-tracking branch 'origin/master'
[libucw.git] / ucw / daemon.c
index 00313b946545b37c4cbdb1e6362b29361fba9b84..9b136d8ac2c171434d6d2d893dc4d824b73068f7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     UCW Library -- Daemonization
  *
- *     (c) 2012 Martin Mares <mj@ucw.cz>
+ *     (c) 2012--2014 Martin Mares <mj@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
 #include <pwd.h>
 #include <grp.h>
 #include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <sys/file.h>
 
-static void
+void
 daemon_resolve_ugid(struct daemon_params *dp)
 {
   // Resolve user name
@@ -30,8 +32,8 @@ daemon_resolve_ugid(struct daemon_params *dp)
     {
       if (u[0] == '#')
        {
-         uns id;
-         const char *err = str_to_uns(&id, u, NULL, 10 | STN_WHOLE);
+         uint id;
+         const char *err = str_to_uint(&id, u, NULL, 10 | STN_WHOLE);
          if (err)
            die("Cannot parse user `%s': %s", u, err);
          dp->run_as_uid = id;
@@ -54,8 +56,8 @@ daemon_resolve_ugid(struct daemon_params *dp)
     {
       if (g[0] == '#')
        {
-         uns id;
-         const char *err = str_to_uns(&id, g, NULL, 10 | STN_WHOLE);
+         uint id;
+         const char *err = str_to_uint(&id, g, NULL, 10 | STN_WHOLE);
          if (err)
            die("Cannot parse group `%s': %s", g, err);
          dp->run_as_gid = id;
@@ -77,11 +79,24 @@ daemon_resolve_ugid(struct daemon_params *dp)
     }
 }
 
+void daemon_switch_ugid(struct daemon_params *dp)
+{
+  if (dp->want_setgid && setresgid(dp->run_as_gid, dp->run_as_gid, dp->run_as_gid) < 0)
+    die("Cannot set GID to %d: %m", (int) dp->run_as_gid);
+  if (dp->want_setgid > 1 && initgroups(dp->run_as_user, dp->run_as_gid) < 0)
+    die("Cannot initialize groups: %m");
+  if (dp->want_setuid && setresuid(dp->run_as_uid, dp->run_as_uid, dp->run_as_uid) < 0)
+    die("Cannot set UID to %d: %m", (int) dp->run_as_uid);
+}
+
 void
 daemon_init(struct daemon_params *dp)
 {
   daemon_resolve_ugid(dp);
 
+  if (dp->flags & DAEMON_FLAG_SIMULATE)
+    return;
+
   if (dp->pid_file)
     {
       // Check that PID file path is absolute
@@ -115,13 +130,14 @@ daemon_init(struct daemon_params *dp)
 void
 daemon_run(struct daemon_params *dp, void (*body)(struct daemon_params *dp))
 {
+  if (dp->flags & DAEMON_FLAG_SIMULATE)
+    {
+      body(dp);
+      return;
+    }
+
   // Switch GID and UID
-  if (dp->want_setgid && setresgid(dp->run_as_gid, dp->run_as_gid, dp->run_as_gid) < 0)
-    die("Cannot set GID to %d: %m", (int) dp->run_as_gid);
-  if (dp->want_setgid > 1 && initgroups(dp->run_as_user, dp->run_as_gid) < 0)
-    die("Cannot initialize groups: %m");
-  if (dp->want_setuid && setresuid(dp->run_as_uid, dp->run_as_uid, dp->run_as_uid) < 0)
-    die("Cannot set UID to %d: %m", (int) dp->run_as_uid);
+  daemon_switch_ugid(dp);
 
   // Create a new session and close stdio
   setsid();
@@ -168,6 +184,9 @@ daemon_run(struct daemon_params *dp, void (*body)(struct daemon_params *dp))
 void
 daemon_exit(struct daemon_params *dp)
 {
+  if (dp->flags & DAEMON_FLAG_SIMULATE)
+    return;
+
   if (dp->pid_file)
     {
       if (unlink(dp->pid_file) < 0)