head 1.7; access; symbols; locks; strict; comment @ * @; 1.7 date 92.12.15.00.20.22; author jromine; state Exp; branches; next 1.6; 1.6 date 92.12.14.17.54.23; author jromine; state Exp; branches; next 1.5; 1.5 date 90.04.05.15.31.24; author sources; state Exp; branches; next 1.4; 1.4 date 90.04.05.14.45.40; author sources; state Exp; branches; next 1.3; 1.3 date 90.02.06.13.09.01; author sources; state Exp; branches; next 1.2; 1.2 date 90.02.05.14.23.05; author sources; state Exp; branches; next 1.1; 1.1 date 90.02.05.14.22.58; author sources; state Exp; branches; next ; desc @@ 1.7 log @endif sugar @ text @/* m_update.c - update the profile */ #ifndef lint static char ident[] = "@@(#)$Id: m_update.c,v 1.6 1992/12/14 17:54:23 jromine Exp jromine $"; #endif lint #include "../h/mh.h" #include #include #ifndef sigmask #define sigmask(s) (1 << ((s) - 1)) #endif /* not sigmask */ static int m_chkids(); void m_update () { int action; #ifndef BSD42 TYPESIG (*hstat) (), (*istat) (), (*qstat) (), (*tstat) (); #else /* BSD42 */ int smask; #endif /* BSD42 */ register struct node *np; FILE * out; if (!(ctxflags & CTXMOD)) return; ctxflags &= ~CTXMOD; if ((action = m_chkids ()) > OK) return; /* child did it for us */ #ifndef BSD42 hstat = signal (SIGHUP, SIG_IGN); istat = signal (SIGINT, SIG_IGN); qstat = signal (SIGQUIT, SIG_IGN); tstat = signal (SIGTERM, SIG_IGN); #else /* BSD42 */ smask = sigblock (sigmask (SIGHUP) | sigmask (SIGINT) | sigmask (SIGQUIT) | sigmask (SIGTERM)); #endif /* BSD42 */ if ((out = fopen (ctxpath, "w")) == NULL) 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); (void) fclose (out); #ifndef BSD42 (void) signal (SIGHUP, hstat); (void) signal (SIGINT, istat); (void) signal (SIGQUIT, qstat); (void) signal (SIGTERM, tstat); #else /* BSD42 */ (void) sigsetmask (smask); #endif /* BSD42 */ if (action == OK) _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 NOTOK, 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 () { int i, child_id; if (getuid () == geteuid ()) return (NOTOK); for (i = 0; (child_id = fork ()) == -1 && i < 5; i++) sleep (5); switch (child_id) { case NOTOK: break; case OK: (void) setgid (getgid ()); (void) setuid (getuid ()); break; default: (void) pidwait (child_id, NOTOK); break; } return child_id; } @ 1.6 log @*** empty log message *** @ text @d3 1 a3 1 static char ident[] = "@@(#)$Id: m_update.c,v 1.5 1990/04/05 15:31:24 sources Exp jromine $"; d11 1 a11 1 #endif not sigmask d19 1 a19 1 #else BSD42 d21 1 a21 1 #endif BSD42 d37 1 a37 1 #else BSD42 d40 1 a40 1 #endif BSD42 d54 1 a54 1 #else BSD42 d56 1 a56 1 #endif BSD42 @ 1.5 log @add ID @ text @d3 1 a3 1 static char ident[] = "@@(#)$Id:$"; @ 1.4 log @add ID @ text @d3 1 a3 1 static char ident[] = "$Id:"; @ 1.3 log @ANSI Compilance @ text @d2 3 @ 1.2 log @TYPESIG @ text @d10 1 @ 1.1 log @Initial revision @ text @d14 1 a14 1 int (*hstat) (), (*istat) (), (*qstat) (), (*tstat) (); @