annotate sbr/m_update.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children 441a2190cfae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* m_update.c - update the profile */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 static char ident[] = "@(#)$Id$";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #ifndef sigmask
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #define sigmask(s) (1 << ((s) - 1))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #endif /* not sigmask */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 static int m_chkids();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 void m_update () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 int action;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #ifndef BSD42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 TYPESIG (*hstat) (), (*istat) (), (*qstat) (), (*tstat) ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #else /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 int smask;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #endif /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 register struct node *np;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 FILE * out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 if (!(ctxflags & CTXMOD))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 ctxflags &= ~CTXMOD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 if ((action = m_chkids ()) > OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 return; /* child did it for us */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 #ifndef BSD42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 hstat = signal (SIGHUP, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 istat = signal (SIGINT, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 qstat = signal (SIGQUIT, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 tstat = signal (SIGTERM, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #else /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 smask = sigblock (sigmask (SIGHUP) | sigmask (SIGINT)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 | sigmask (SIGQUIT) | sigmask (SIGTERM));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #endif /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 if ((out = fopen (ctxpath, "w")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 adios (ctxpath, "unable to write");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 for (np = m_defs; np; np = np -> n_next)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 if (np -> n_context)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 fprintf (out, "%s: %s\n", np -> n_name, np -> n_field);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 (void) fclose (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 #ifndef BSD42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 (void) signal (SIGHUP, hstat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 (void) signal (SIGINT, istat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 (void) signal (SIGQUIT, qstat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 (void) signal (SIGTERM, tstat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 #else /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 (void) sigsetmask (smask);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 #endif /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 if (action == OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 _exit (0); /* we are child, time to die */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 /* This hack brought to you so we can handle set[ug]id MH programs. If we
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 return NOTOK, then no fork is made, we update .mh_profile normally, and
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 return to the caller normally. If we return 0, then the child is
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 executing, .mh_profile is modified after we set our [ug]ids to the norm.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 If we return > 0, then the parent is executed and .mh_profile has
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 already be modified. We can just return to the caller immediately. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 static int m_chkids () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 if (getuid () == geteuid ())
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 return (NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 for (i = 0; (child_id = fork ()) == -1 && i < 5; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 sleep (5);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 switch (child_id) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 (void) setgid (getgid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 (void) setuid (getuid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 (void) pidwait (child_id, NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 return child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 }