aboutsummaryrefslogtreecommitdiff
path: root/src/wydawca.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wydawca.c')
-rw-r--r--src/wydawca.c50
1 files changed, 44 insertions, 6 deletions
diff --git a/src/wydawca.c b/src/wydawca.c
index f9818ed..b121959 100644
--- a/src/wydawca.c
+++ b/src/wydawca.c
@@ -255,7 +255,7 @@ collect_uids (int argc, char **argv)
if (*p)
{
logmsg (LOG_ERR, _("no such user: %s"), argv[i]);
- exit (1);
+ exit (EX_NOUSER);
}
uidv[i] = n;
}
@@ -266,7 +266,7 @@ collect_uids (int argc, char **argv)
int
-wydawca_uid (uid_t uid)
+wydawca_set_uid (uid_t uid)
{
int rc;
@@ -287,7 +287,32 @@ wydawca_uid (uid_t uid)
return rc;
}
+int
+wydawca_set_gid (gid_t gid)
+{
+ int rc;
+
+ if (getuid () != 0)
+ return 0;
+#if defined(HAVE_SETREGID)
+ rc = setregid (0, gid);
+#elif defined(HAVE_SETRESGID)
+ rc = setresgid (-1, gid, -1);
+#elif defined(HAVE_SETEGID)
+ rc = setegid (gid);
+#else
+# error "No way to reset user privileges?"
+#endif
+ if (rc < 0)
+ logmsg (LOG_ERR, _("cannot switch to GID %d: %s (r=%d, e=%d)"),
+ gid, strerror (errno), getgid (), getegid ());
+ return rc;
+}
+
+char **x_argv;
+extern int reconfigure;
+
void
wydawca_daemon ()
{
@@ -296,7 +321,7 @@ wydawca_daemon ()
if (!foreground && daemon (0, 0))
{
logmsg (LOG_ERR, "%s", strerror (errno));
- exit (1);
+ exit (EX_OSERR);
}
wydawca_listener ();
@@ -312,6 +337,7 @@ main (int argc, char **argv)
mu_register_all_mailer_formats ();
config_init ();
+ x_argv = argv;
parse_options (argc, argv);
argv += optind;
@@ -321,9 +347,10 @@ main (int argc, char **argv)
collect_uids (argc, argv);
if (preprocess_only)
- exit (gconf_preproc_run (conffile, gconf_preprocessor));
+ exit (gconf_preproc_run (conffile, gconf_preprocessor) ? EX_CONFIG : 0);
- gconf_parse (conffile);
+ if (gconf_parse (conffile))
+ exit (EX_CONFIG);
if (lint_mode)
exit (0);
@@ -346,7 +373,8 @@ main (int argc, char **argv)
}
mail_init ();
-
+ wydawca_lock_init ();
+
logmsg (LOG_NOTICE, _("wydawca (%s) started"), PACKAGE_STRING);
if (!daemon_mode)
@@ -361,5 +389,15 @@ main (int argc, char **argv)
mail_finish ();
+ if (reconfigure)
+ {
+ int i;
+ wydawca_set_uid (0);
+ for (i = getdtablesize (); i > 2; i--)
+ close (i);
+ remove_pidfile ();
+ execv (x_argv[0], x_argv);
+ }
+
exit (0);
}

Return to:

Send suggestions and report system problems to the System administrator.