X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/0e7106da702d97e10f3bd24d8284a2ab86044ebd..7711f3fc00259e55f630cfe6104eff3083dc9d77:/sbr/context_save.c diff --git a/sbr/context_save.c b/sbr/context_save.c index 36b1634e..70809595 100644 --- a/sbr/context_save.c +++ b/sbr/context_save.c @@ -2,8 +2,6 @@ /* * context_save.c -- write out the updated context file * - * $Id$ - * * 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. @@ -25,6 +23,7 @@ context_save (void) register struct node *np; FILE *out; sigset_t set, oset; + int failed_to_lock = 0; /* No context in use -- silently ignore any changes! */ if (!ctxpath) @@ -43,18 +42,25 @@ context_save (void) sigaddset (&set, SIGINT); sigaddset (&set, SIGQUIT); sigaddset (&set, SIGTERM); - SIGPROCMASK (SIG_BLOCK, &set, &oset); - - if (!(out = lkfopen (ctxpath, "w"))) - adios (ctxpath, "unable to write"); + sigprocmask (SIG_BLOCK, &set, &oset); + + if (!(out = lkfopendata (ctxpath, "w", &failed_to_lock))) { + if (failed_to_lock) { + adios (ctxpath, "failed to lock"); + } else { + 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); + lkfclosedata (out, ctxpath); - SIGPROCMASK (SIG_SETMASK, &oset, &set); /* reset the signal mask */ + sigprocmask (SIG_SETMASK, &oset, &set); /* reset the signal mask */ if (action == 0) + /* This must be _exit(), not exit(), because the child didn't + call unregister_for_removal() in m_chkids(). */ _exit (0); /* we are child, time to die */ } @@ -85,8 +91,8 @@ m_chkids (void) break; case 0: - setgid (getgid ()); - setuid (getuid ()); + /* It's not necessary to call unregister_for_removal(0) + because the child calls _exit() in context_save(). */ break; default: