X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fcontext_save.c;h=d1371d017afc4b91f1ca25817f84f725a9c477b4;hp=4ee40ca81d9dae4b6749e18d252a0d5457ad6caa;hb=ac0b9fcce4167e2959ebc5b8d6efb8511acec66d;hpb=5dd6771b28c257af405d7248639ed0e3bcdce38b diff --git a/sbr/context_save.c b/sbr/context_save.c index 4ee40ca..d1371d0 100644 --- a/sbr/context_save.c +++ b/sbr/context_save.c @@ -1,96 +1,91 @@ - /* - * context_save.c -- write out the updated context file - * - * This code is Copyright (c) 2002, by the authors of nmh. See the - * COPYRIGHT file in the root directory of the nmh distribution for - * complete copyright information. - */ +** context_save.c -- write out the updated context file +** +** This code is Copyright (c) 2002, by the authors of nmh. See the +** COPYRIGHT file in the root directory of the nmh distribution for +** complete copyright information. +*/ #include #include /* - * static prototypes - */ +** static prototypes +*/ static int m_chkids(void); void -context_save (void) +context_save(void) { - int action; - register struct node *np; - FILE *out; - sigset_t set, oset; - - /* No context in use -- silently ignore any changes! */ - if (!ctxpath) - return; - - if (!(ctxflags & CTXMOD)) - return; - ctxflags &= ~CTXMOD; - - if ((action = m_chkids ()) > 0) - return; /* child did it for us */ - - /* block a few signals */ - sigemptyset (&set); - sigaddset (&set, SIGHUP); - sigaddset (&set, SIGINT); - sigaddset (&set, SIGQUIT); - sigaddset (&set, SIGTERM); - SIGPROCMASK (SIG_BLOCK, &set, &oset); - - if (!(out = lkfopen (ctxpath, "w"))) - adios (ctxpath, "unable to write"); - for (np = m_defs; np; np = np->n_next) - if (np->n_context) - fprintf (out, "%s: %s\n", np->n_name, np->n_field); - lkfclose (out, ctxpath); - - SIGPROCMASK (SIG_SETMASK, &oset, &set); /* reset the signal mask */ - - if (action == 0) - _exit (0); /* we are child, time to die */ + int action; + register struct node *np; + FILE *out; + sigset_t set, oset; + + /* No context in use -- silently ignore any changes! */ + if (!ctxpath) + return; + + if (!(ctxflags & CTXMOD)) + return; + ctxflags &= ~CTXMOD; + + if ((action = m_chkids()) > 0) + return; /* child did it for us */ + + /* block a few signals */ + sigemptyset(&set); + sigaddset(&set, SIGHUP); + sigaddset(&set, SIGINT); + sigaddset(&set, SIGQUIT); + sigaddset(&set, SIGTERM); + sigprocmask(SIG_BLOCK, &set, &oset); + + if (!(out = lkfopen(ctxpath, "w"))) + adios(ctxpath, "unable to write"); + for (np = m_defs; np; np = np->n_next) + if (np->n_context) + fprintf(out, "%s: %s\n", np->n_name, np->n_field); + lkfclose(out, ctxpath); + + sigprocmask(SIG_SETMASK, &oset, &set); /* reset the signal mask */ + + if (action == 0) + _exit(0); /* we are child, time to die */ } /* - * This hack brought to you so we can handle set[ug]id MH programs. - * If we return -1, then no fork is made, we update .mh_profile - * normally, and return to the caller normally. If we return 0, - * then the child is executing, .mh_profile is modified after - * we set our [ug]ids to the norm. If we return > 0, then the - * parent is executed and .mh_profile has already be modified. - * We can just return to the caller immediately. - */ +** This hack brought to you so we can handle set[ug]id MH programs. +** If we return -1, then no fork is made, we update .mh_profile +** normally, and return to the caller normally. If we return 0, +** then the child is executing, .mh_profile is modified after +** we set our [ug]ids to the norm. If we return > 0, then the +** parent is executed and .mh_profile has already be modified. +** We can just return to the caller immediately. +*/ static int -m_chkids (void) +m_chkids(void) { - int i; - pid_t pid; - - if (getuid () == geteuid ()) - return (-1); + pid_t pid; - for (i = 0; (pid = fork ()) == -1 && i < 5; i++) - sleep (5); + if (getuid() == geteuid()) + return (-1); - switch (pid) { + switch (pid = fork()) { case -1: - break; + break; case 0: - setgid (getgid ()); - setuid (getuid ()); - break; + setgid(getgid()); + setuid(getuid()); + break; default: - pidwait (pid, -1); - break; - } + pidwait(pid, -1); + break; + } - return pid; + return pid; }