|
|
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: #ifndef sigmask ! 7: #define sigmask(s) (1 << ((s) - 1)) ! 8: #endif not sigmask ! 9: ! 10: static int m_chkids(); ! 11: ! 12: void ! 13: m_update() ! 14: { ! 15: int action; ! 16: #ifndef BSD42 ! 17: SIGDECL (*hstat)(), (*istat)(), (*qstat)(), (*tstat)(); ! 18: #else BSD42 ! 19: int smask; ! 20: #endif BSD42 ! 21: register struct node *np; ! 22: FILE * out; ! 23: ! 24: if (!(ctxflags & CTXMOD)) ! 25: return; ! 26: ctxflags &= ~CTXMOD; ! 27: ! 28: if ((action = m_chkids ()) > OK) ! 29: return; /* child did it for us */ ! 30: ! 31: #ifndef BSD42 ! 32: hstat = signal (SIGHUP, SIG_IGN); ! 33: istat = signal (SIGINT, SIG_IGN); ! 34: qstat = signal (SIGQUIT, SIG_IGN); ! 35: tstat = signal (SIGTERM, SIG_IGN); ! 36: #else BSD42 ! 37: smask = sigblock (sigmask (SIGHUP) | sigmask (SIGINT) ! 38: | sigmask (SIGQUIT) | sigmask (SIGTERM)); ! 39: #endif BSD42 ! 40: ! 41: if ((out = fopen (ctxpath, "w")) == NULL) ! 42: adios (ctxpath, "unable to write"); ! 43: for (np = m_defs; np; np = np -> n_next) ! 44: if (np -> n_context) ! 45: fprintf (out, "%s: %s\n", np -> n_name, np -> n_field); ! 46: (void) fclose (out); ! 47: ! 48: #ifndef BSD42 ! 49: (void) signal (SIGHUP, hstat); ! 50: (void) signal (SIGINT, istat); ! 51: (void) signal (SIGQUIT, qstat); ! 52: (void) signal (SIGTERM, tstat); ! 53: #else BSD42 ! 54: (void) sigsetmask (smask); ! 55: #endif BSD42 ! 56: if (action == OK) ! 57: _exit (0); /* we are child, time to die */ ! 58: } ! 59: ! 60: /* */ ! 61: ! 62: /* This hack brought to you so we can handle set[ug]id MH programs. If we ! 63: return NOTOK, then no fork is made, we update .mh_profile normally, and ! 64: return to the caller normally. If we return 0, then the child is ! 65: executing, .mh_profile is modified after we set our [ug]ids to the norm. ! 66: If we return > 0, then the parent is executed and .mh_profile has ! 67: already be modified. We can just return to the caller immediately. */ ! 68: ! 69: ! 70: static int ! 71: m_chkids() ! 72: { ! 73: int i, ! 74: child_id; ! 75: ! 76: if (getuid () == geteuid ()) ! 77: return (NOTOK); ! 78: ! 79: for (i = 0; (child_id = fork ()) == -1 && i < 5; i++) ! 80: sleep (5); ! 81: switch (child_id) { ! 82: case NOTOK: ! 83: break; ! 84: ! 85: case OK: ! 86: (void) setgid (getgid ()); ! 87: (void) setuid (getuid ()); ! 88: break; ! 89: ! 90: default: ! 91: (void) pidwait (child_id, NOTOK); ! 92: break; ! 93: } ! 94: ! 95: return child_id; ! 96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.