annotate support/bboards/bbexp.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents bce86c4163a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* bbexp.c - expunge the BBoards area */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3 static char ident[] = "@(#)$Id: bbexp.c,v 1.1.1.1 2005/04/18 14:46:06 kono Exp $";
0
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 "../h/dropsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include "../zotnet/bboards.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include <pwd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #define FIRST 12
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #define SECOND 20
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 static int broken_pipe;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 static int move();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 static process(), chgrp();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 static TYPESIG pipeser ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #ifndef __STDC__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 struct passwd *getpwnam ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 main (argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 char **argv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 int first = FIRST,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 second = SECOND;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 struct bboard *bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 invo_name = r1bindex (*argv++, '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 m_foil (NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 if ((pw = getpwnam (BBOARDS)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 adios (NULLCP, "no entry for ~%s", BBOARDS);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 if (pw -> pw_uid != geteuid ())
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 adios (NULLCP, "not running setuid to %s", BBOARDS);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 if (*argv && **argv == '-') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 if ((first = atoi (*argv + 1)) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 first = FIRST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 argv++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 if (*argv && **argv == '-') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 if ((second = atoi (*argv + 1)) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 second = SECOND;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 argv++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 (void) setbbent (SB_STAY);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 if (*argv == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 while (bb = getbbent ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 if ((bb -> bb_flags & BB_ARCH) & (BB_ASAV | BB_AREM))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 process (bb, pw, first, second);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 while (cp = *argv++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 if ((bb = getbbnam (cp)) || (bb = getbbaka (cp))) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 if ((bb -> bb_flags & BB_ARCH) & (BB_ASAV | BB_AREM))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 process (bb, pw, first, second);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 advise (NULLCP, "no such BBoard as %s", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 (void) endbbent ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 exit (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 static process (bb, pw, first, second)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 struct bboard *bb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 int first,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 second;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 int fd,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 td;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 command[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 tmpfil[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 FILE *pf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 if ((fd = lkopen (bb -> bb_file, 6)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 advise (bb -> bb_file, "unable to lock and open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 (void) sprintf (tmpfil, "%s/#bbexpXXXXXX", pw -> pw_dir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 (void) unlink (mktemp (tmpfil));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 if ((td = creat (tmpfil, BBMODE)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 advise (tmpfil, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 goto out1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 (void) close (td);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 if ((td = creat (cp = map_name (tmpfil), BBMODE)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 advise (cp, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 goto out2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 (void) close (td);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 if ((bb -> bb_flags & BB_ARCH)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 && stat (bb -> bb_archive, &st) == NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 && stat (bb -> bb_file, &st) != NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 && (td = creat (bb -> bb_archive, (int) (st.st_mode & 0777))) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 (void) close (td);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 (void) sprintf (command, "%s %s%s", mshproc, bb -> bb_file,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 isatty (fileno (stdout)) ? " 2>&1 | cat" : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 printf ("%s (%s old messages)\n", command,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 (bb -> bb_flags & BB_ARCH) == BB_ASAV ? "archive" : "remove");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 if ((pf = popen (command, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 advise (NULLCP, "unable to popen \"%s\" for writing", command);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 goto out3;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 (void) signal (SIGPIPE, pipeser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 broken_pipe = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 fprintf (pf, "pick %s -before -%d -sequence select -zero\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 "-datefield BB-Posted", first);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 fprintf (pf, "pick -before -%d -sequence select -nozero\n", second);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 fprintf (pf, "scan select\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 if ((bb -> bb_flags & BB_ARCH) == BB_ASAV)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 fprintf (pf, "pack select -file %s\n", bb -> bb_archive);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 fprintf (pf, "rmm select\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 fprintf (pf, "packf all -file %s\n", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 #ifdef notdef /* want real EOF to end it */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 fprintf (pf, "quit\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 #endif /* notdef */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 if (td = pclose (pf))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 advise (NULLCP, "msh returns %d", td);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 (void) signal (SIGPIPE, SIG_DFL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 if (move (tmpfil, bb -> bb_file) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 (void) move (cp, bb -> bb_map);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 out3: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 (void) unlink (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 out2: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 out1: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 (void) lkclose (fd, bb -> bb_file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 static int move (input, output)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 char *input,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 *output;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 in,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 out;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 struct stat st1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 st2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 if ((in = open (input, 0)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 advise (input, "unable to re-open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 i = stat (output, &st1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 if ((out = creat (output, BBMODE)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 advise (output, "unable to re-create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 if (i != NOTOK && chmod (output, (int) (st1.st_mode & 0777)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 admonish (output, "unable to change mode of");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 if (i != NOTOK && stat (output, &st2) != NOTOK && st2.st_gid != st1.st_gid)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 chgrp (output, st1.st_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 cpydata (in, out, input, output);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 (void) close (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 (void) close (out);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 static chgrp (file, gid)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 short gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 int child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 char group[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 switch (child_id = fork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 admonish ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 (void) setuid (geteuid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 (void) sprintf (group, "%d", gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 execlp ("/bin/chgrp", chgrp, group, file, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 execlp ("/usr/bin/chgrp", chgrp, group, file, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 perror ("chgrp");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 _exit (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 (void) pidwait (child_id, OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 static TYPESIG pipeser (i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 #ifndef BSD42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 (void) signal (SIGPIPE, pipeser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 #endif /* not BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 if (!broken_pipe++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 advise (NULLCP, "broken pipe");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 }