|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.