Annotation of 43BSD/contrib/mh/sbr/m_update.c, revision 1.1.1.1

1.1       root        1: /* m_update.c - update the profile */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include <stdio.h>
                      5: #include <signal.h>
                      6: 
                      7: 
                      8: void m_update () {
                      9:     int     action;
                     10:     int     (*hstat) (), (*istat) (), (*qstat) (), (*tstat) ();
                     11:     register struct node   *np;
                     12:     FILE * out;
                     13: 
                     14:     if (!(ctxflags & CTXMOD))
                     15:        return;
                     16:     ctxflags &= ~CTXMOD;
                     17: 
                     18:     if ((action = m_chkids ()) > OK)
                     19:        return;                 /* child did it for us */
                     20: 
                     21:     hstat = signal (SIGHUP, SIG_IGN);
                     22:     istat = signal (SIGINT, SIG_IGN);
                     23:     qstat = signal (SIGQUIT, SIG_IGN);
                     24:     tstat = signal (SIGTERM, SIG_IGN);
                     25: 
                     26:     if ((out = fopen (ctxpath, "w")) == NULL)
                     27:        adios (ctxpath, "unable to write");
                     28:     for (np = m_defs; np; np = np -> n_next)
                     29:        if (np -> n_context)
                     30:            fprintf (out, "%s: %s\n", np -> n_name, np -> n_field);
                     31:     (void) fclose (out);
                     32: 
                     33:     (void) signal (SIGHUP, hstat);
                     34:     (void) signal (SIGINT, istat);
                     35:     (void) signal (SIGQUIT, qstat);
                     36:     (void) signal (SIGTERM, tstat);
                     37:     if (action == OK)
                     38:        _exit (0);              /* we are child, time to die */
                     39: }
                     40: 
                     41: /*  */
                     42: 
                     43: /* This hack brought to you so we can handle set[ug]id MH programs.  If we
                     44:    return NOTOK, then no fork is made, we update .mh_profile normally, and
                     45:    return to the caller normally.  If we return 0, then the child is
                     46:    executing, .mh_profile is modified after we set our [ug]ids to the norm.
                     47:    If we return > 0, then the parent is executed and .mh_profile has
                     48:    already be modified.  We can just return to the caller immediately. */
                     49: 
                     50: 
                     51: static int  m_chkids () {
                     52:     int     i,
                     53:             child_id;
                     54: 
                     55:     if (getuid () == geteuid ())
                     56:        return (NOTOK);
                     57: 
                     58:     for (i = 0; (child_id = fork ()) == -1 && i < 5; i++)
                     59:        sleep (5);
                     60:     switch (child_id) {
                     61:        case NOTOK:
                     62:            break;
                     63: 
                     64:        case OK:
                     65:            (void) setgid (getgid ());
                     66:            (void) setuid (getuid ());
                     67:            break;
                     68: 
                     69:        default:
                     70:            (void) pidwait (child_id, NOTOK);
                     71:            break;
                     72:     }
                     73: 
                     74:     return child_id;
                     75: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.