annotate uip/bbl.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 /* bbl.c - ease the tasks of a BBleader */
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: bbl.c,v 1.1.1.1 2005/04/18 14:46:07 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/local.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include "../zotnet/bboards.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include <ctype.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include <pwd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include <locale.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 static struct swit switches[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #define SHELLSW 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 "shell program", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #define VERBSW 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 "verbose", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #define NVERBSW 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 "noverbose", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #define HELPSW 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 "help", 4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 NULL, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 };
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 static int verbosw = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 static int sub_ok = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 static char *bboards = BBOARDS;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 static char *cwd = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 static char *current_folder = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 static char *bbfolder = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 static char subfolder[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 static struct stat bbstat;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 static struct stat substat;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 static char *shell = "/bin/sh";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 static struct bboard *bb = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 #ifndef __STDC__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 struct passwd *getpwnam (), *getpwuid ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 #endif /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 main (argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 char **argv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 **ap,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 **argp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 buffer[80],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 *arguments[MAXARGS];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 setlocale(LC_ALL, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 ml_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 invo_name = r1bindex (argv[0], '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 if (strlen(invo_name) > NAMESZ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 fprintf(stderr, "%s: argv[0] too long\n", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 exit(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 if ((cp = m_find (invo_name)) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 ap = brkstring (cp = getcpy (cp), " ", "\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 ap = copyip (ap, arguments);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 ap = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 if (argc > MAXARGS - (ap - arguments))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 adios (NULLCP, "too many arguments.");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 (void) copyip (argv + 1, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 for (argp = arguments; *argp; argp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 if (strlen(*argp) >= BUFSIZ / 4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 adios (NULLCP, "argument too long");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 argp = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 if ((shell = getenv ("SHELL")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 if ((pw = getpwuid (getuid ())) != NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 && pw -> pw_shell
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 && *pw -> pw_shell)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 shell = getcpy (pw -> pw_shell);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 if (strlen(shell) >= BUFSIZ / 4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 adios (NULLCP, "SHELL envariable too long");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 if ((pw = getpwnam (bboards)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 adios (NULLCP, "no entry for ~%s", bboards);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 if (pw -> pw_uid != geteuid ())
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 adios (NULLCP, "not running setuid to %s", bboards);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 current_folder = m_getfolder();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 while (cp = *argp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 if (*cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 switch (smatch (++cp, switches)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 ambigsw (cp, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 adios (NULLCP, "-%s unknown", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 case HELPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 (void) sprintf (buffer, "%s [+folder] [switches] bboard",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 help (buffer, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 case SHELLSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 if (!(shell = *argp++) || *shell == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 case VERBSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 verbosw++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 case NVERBSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 verbosw = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 if (*cp == '+')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 if (bbfolder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 adios (NULLCP, "only one folder at a time!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 bbfolder = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 if (bb != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 adios (NULLCP, "only one BBoard a time!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 if ((bb = getbbnam (cp)) == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 && (bb = getbbaka (cp)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 adios (NULLCP, "no such BBoard as '%s'", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 if (!bb)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 adios (NULLCP, "no BBoard specified");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 if (!bbfolder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 bbfolder = "+bbl";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 (void) sprintf (subfolder, "%s/arc", bbfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 if (!m_find ("path"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 free (path ("./", TFOLDER));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 cwd = getcpy (pwd ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 process ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 m_replace (pfolder, current_folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 m_update ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 done (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 process () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 int child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 if (!ldrbb (bb) && !ldrchk (bb))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 if (stat (bb -> bb_file, &bbstat) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 adios (NULLCP, "no such file as %s", bb -> bb_file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 if (stat (bb -> bb_archive, &substat) != NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 && substat.st_size > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 sub_ok++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 /* else */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 substat.st_mode = bbstat.st_mode;/* archive should always match */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 substat.st_gid = bbstat.st_gid;/* actual bboard mode & gid */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 /* do subfolder first, since you will lose otherwise... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 (void) sprintf (buffer, "Remove messages currently in %s? ", subfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 if (check_folder (subfolder) && getanswer (buffer))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 rmf (subfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 (void) sprintf (buffer, "Remove messages currently in %s? ", bbfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 if (check_folder (bbfolder) && getanswer (buffer))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 rmf (bbfolder);
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 adios ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 do_child (); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 do_parent (child_id);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 int check_folder (folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 char *folder;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 char *maildir;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 struct msgs *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 maildir = m_maildir (folder + 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 if (stat (maildir, &st) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 if ((st.st_mode & S_IFMT) != S_IFDIR)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 adios (NULLCP, "not a directory '%s'", maildir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 check_mode (maildir, (st.st_mode | 0555) & 0777);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 if (chdir (maildir) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 adios (maildir, "unable to change to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 if (!(mp = m_gmsg (folder + 1)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 adios (NULLCP, "unable to read %s", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 if (chdir (cwd) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 admonish (cwd, "could not change back to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 return (mp -> hghmsg != 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 do_parent (child_id)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 int child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 int zap = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 if (pidwait (child_id, NOTOK) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 (void) putchar ('\n');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 (void) check_folder (bbfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 if (getanswer ("Incorporate changes? "))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 update (&bbstat, bb -> bb_file, bbfolder, bb -> bb_info, bb -> bb_map);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 (void) sprintf (buffer, "Remove %s? ", bbfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 if (getanswer (buffer))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 zap++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 if (check_folder (subfolder)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 if (getanswer ("Update archives? "))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 update (&substat, bb -> bb_archive, subfolder, NULLCP, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 (void) sprintf (buffer, "Remove %s? ", subfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 if (getanswer (buffer))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 rmf (subfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 if (sub_ok
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 && getanswer ("Remove archives? ")
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 && getanswer ("Are you sure? "))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 if (unlink (bb -> bb_archive) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 admonish (bb -> bb_archive, "unable to remove %s");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 if (zap)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 rmf (bbfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 check_mode (dir, mode)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 char *dir;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 unsigned int mode;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 int child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 struct dirent *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 #else SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 struct direct *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 #endif SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 DIR * dd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 if (verbosw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 fprintf (stderr, "chmod %o %s\n", mode, dir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 switch (child_id = fork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 adios ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 (void) setgid (getgid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 (void) setuid (getuid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 if (chmod (dir, (int) mode) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 adios (dir, "unable to change mode of");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 if (chdir (dir) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 adios (dir, "unable to change to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 if ((dd = opendir (dir)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 adios (dir, "unable to read");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 while (dp = readdir (dd))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 if (dp -> d_name[0] != '.') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 if (stat (dp -> d_name, &st) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 admonish (dp -> d_name, "unable to stat");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 if (chmod (dp -> d_name, (int) ((st.st_mode | 0444) & 0777))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 admonish (dp -> d_name, "unable to change mode of");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 closedir (dd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 done (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 if (pidwait (child_id, OK))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 update (stp, file, folder, info, map)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 struct stat *stp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 char *file,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 *folder,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 *info,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 *map;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 if (stat (file, &st) != NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 && st.st_mtime != stp -> st_mtime) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 printf ("File '%s' has changed...\n", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 if (getanswer ("Append to it instead? "))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 goto work;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 if (!getanswer ("Still update it? "))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 if ((fd = creat (file, BBMODE)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 adios (file, "unable to re-create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 if (map)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 (void) unlink (map);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 if (info)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 check_info (folder, info);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 #endif notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 work: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 pack (folder, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 if (chmod (file, (int) (stp -> st_mode & 0777)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 admonish (file, "unable to change mode of");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 if (stat (file, &st) != NOTOK && st.st_gid != stp -> st_gid)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 chgrp (file, stp -> st_gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 #ifdef notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 check_info (folder, info)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 char *folder,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 *info;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 int id,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 char *hdrptr,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 *maildir,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 *msgnam,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 posted[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 name[NAMESZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 buf[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 struct msgs *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 FILE * fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 if (chdir (maildir = m_maildir (folder + 1)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 adios (maildir, "unable to change to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 if (!(mp = m_gmsg (folder + 1)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 adios (NULL, "unable to read %s", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 if (mp -> hghmsg) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 if ((fp = fopen (msgnam = m_name (mp -> hghmsg), "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 adios (NULL, "unable to read message %s in %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 msgnam, folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 id = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 posted[0] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 for (state = FLD;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 switch (state = m_getfld (state, name, buf, sizeof buf, fp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 case FLDEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 hdrptr = add (buf, NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 state = m_getfld (state, name, buf, sizeof buf, fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 hdrptr = add (buf, hdrptr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 if (uleq (name, "BBoard-ID")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 id = atoi (buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 if (id > 0 && posted[0])
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 if (uleq (name, "BB-Posted")) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 strncpy (posted, buf, sizeof posted - 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 if (posted[strlen (posted) - 1] == '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 posted[strlen (posted) - 1] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 if (id > 0 && posted[0])
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 admonish (NULL, "unable to find BBoard-info in message %s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 msgnam);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 (void) fclose (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 goto no_risk;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 (void) fclose (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 if (verbosw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 fprintf (stderr,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 "[ Highest message has %s%d and\n\t\t %s%s ]\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 "BBoard-ID: ", id, "BB-Posted: ", posted);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 if ((fp = lkfopen (info, "w")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 adios (info, "unable to lock and fopen");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 fprintf (fp, "%d\n%s\n", id, posted);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 (void) lkfclose (fp, info);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 no_risk: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 if (chdir (cwd) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 admonish (cwd, "could not change back to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 #endif notdef
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 pack (folder, file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 char *folder,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 int child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 switch (child_id = fork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 admonish ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 if (verbosw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 fprintf (stderr, "pack %s -file %s\n", folder, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 execlp (packproc, r1bindex (packproc, '/'),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 folder, "-file", file, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 perror (packproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 (void) pidXwait (child_id, packproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 chgrp (file, gid)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 short gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 int child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 char group[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 switch (child_id = fork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 admonish ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 (void) setuid (geteuid ());/* make sure chgrp works */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 (void) sprintf (group, "%d", gid);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 if (verbosw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 fprintf (stderr, "chgrp %s %s\n", group, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 execlp ("/bin/chgrp", "chgrp", group, file, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 execlp ("/usr/bin/chgrp", "chgrp", group, file, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 perror ("chgrp");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 (void) pidXwait (child_id, "chgrp");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 rmf (folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 char *folder;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 int child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 switch (child_id = fork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 admonish ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 (void) setgid (getgid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 (void) setuid (getuid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 if (verbosw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 fprintf (stderr, "rmf %s\n", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 execlp (rmfproc, r1bindex (rmfproc, '/'), folder, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 perror (rmfproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 (void) pidXwait (child_id, rmfproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 do_child () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 (void) setgid (getgid ()); /* become the user, not bboards */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 (void) setuid (getuid ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 inc (bb -> bb_file, bbfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 if (sub_ok)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 inc (bb -> bb_archive, subfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 /* else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 create the folder */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 if (verbosw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 (void) putchar ('\n');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 printf ("[ Working folder is %s, Archive folder is %s ]\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 bbfolder, subfolder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 printf ("[ Type CTRL-D to finish ]\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 m_replace (pfolder, bbfolder + 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 m_update ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 (void) sprintf (buffer, "=> %s: %s", invo_name, bb -> bb_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 execlp (shell, buffer, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 perror (shell);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 inc (file, folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 char *file,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 *folder;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 int child_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 switch (child_id = fork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 adios ("fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 if (verbosw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 fprintf (stderr, "inc %s -file %s -silent\n", folder, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 execlp (incproc, r1bindex (incproc, '/'),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 folder, "-file", file, "-silent", NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 fprintf (stderr, "unable to exec ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 perror (incproc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 if (pidXwait (child_id, incproc))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 }