diff options
Diffstat (limited to 'src/wydawca.c')
-rw-r--r-- | src/wydawca.c | 50 |
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); } |