]> diplodocus.org Git - nmh/blob - docs/historical/mh-jun-1982/progs/file.c
Replaced use of snprintf() with memcpy()/memmove().
[nmh] / docs / historical / mh-jun-1982 / progs / file.c
1 #ifdef COMMENT
2 Proprietary Rand Corporation, 1981.
3 Further distribution of this software
4 subject to the terms of the Rand
5 license agreement.
6 #endif
7
8 #include "../mh.h"
9 #include "../folder.h"
10 #include <stdio.h>
11
12 #define NFOLD 20 /* Allow 20 folder specs */
13 char *calloc();
14
15 /* file [-src folder] [msgs] +folder [+folder ...]
16 *
17 * moves messages from src folder (or current) to other one(s).
18 *
19 * all = 1-999 (MAXFOLDER) for a message sequence
20 * -preserve says preserve msg numbers
21 * -link says don't delete old msg
22 */
23
24 extern struct swit anoyes[]; /* Std no/yes gans array */
25
26 int vecp, foldp, prsrvf;
27 char **vec, maildir[128], *folder;
28 struct msgs *mp;
29
30 struct st_fold folders[NFOLD];
31
32 char *files[NFOLD + 1]; /* Vec of files to process--starts at 1! */
33 int filec = 1;
34
35 struct swit switches[] = {
36 "all", -3, /* 0 */
37 "link", 0, /* 1 */
38 "nolink", 0, /* 2 */
39 "preserve", 0, /* 3 */
40 "nopreserve", 0, /* 4 */
41 "src +folder", 0, /* 5 */
42 "file", 0, /* 6 */
43 "help", 4, /* 7 */
44 0, 0
45 };
46
47 /*ARGSUSED*/
48 main(argc, argv)
49 char *argv[];
50 {
51 register int i, msgnum;
52 register char *cp;
53 char *msgs[128];
54 int msgp, linkf;
55 char **ap;
56 char *arguments[50], **argp;
57
58 invo_name = argv[0];
59 #ifdef NEWS
60 m_news();
61 #endif
62 folder = 0; msgp = 0; linkf = 0;
63 cp = r1bindex(argv[0], '/');
64 if((cp = m_find(cp)) != NULL) {
65 ap = brkstring(cp = getcpy(cp), " ", "\n");
66 ap = copyip(ap, arguments);
67 } else
68 ap = arguments;
69 VOID copyip(argv+1, ap);
70 argp = arguments;
71 while(cp = *argp++) {
72 if(*cp == '-')
73 switch(smatch(++cp, switches)) {
74 case -2:ambigsw(cp, switches); /* ambiguous */
75 goto leave;
76 /* unknown */
77 case -1:fprintf(stderr, "file: -%s unknown\n", cp);
78 goto leave;
79 /* -all */
80 case 0: fprintf(stderr, "\"-all\" changed to \"all\"\n");
81 goto leave;
82 case 1: linkf = 1; continue; /* -link */
83 case 2: linkf = 0; continue; /* -nolink */
84 case 3: prsrvf = 1; continue; /* -preserve */
85 case 4: prsrvf = 0; continue; /* -nopreserve */
86 case 5: if(folder) { /* -src */
87 fprintf(stderr, "Only one src folder.\n");
88 goto leave;
89 }
90 if(!(folder = *argp++) || *folder == '-') {
91 missing: fprintf(stderr, "file: Missing argument for %s switch\n", argp[-2]);
92 goto leave;
93 }
94 if(*folder == '+')
95 folder++;
96 folder = path(folder, TFOLDER);
97 continue;
98 case 6:
99 if(filec >= NFOLD) {
100 fprintf(stderr, "Too many src files.\n");
101 goto leave;
102 }
103 if(!(cp = *argp++) || *cp == '-')
104 goto missing;
105 files[filec++] = path(cp, TFILE);
106 continue;
107
108 /* -help */
109 case 7: help("file [msgs] [switches] +folder ...",
110 switches);
111 goto leave;
112 }
113 if(*cp == '+') {
114 if(foldp < NFOLD)
115 folders[foldp++].f_name = path(++cp, TFOLDER);
116 else {
117 fprintf(stderr, "Only %d folders allowed.\n", NFOLD);
118 goto leave;
119 }
120 } else
121 msgs[msgp++] = cp;
122 }
123 if(!m_find("path")) free(path("./", TFOLDER));
124 if(!foldp) {
125 fprintf(stderr, "No folder specified.\n");
126 fprintf(stderr, "Usage: file [-src folder] [msg ...] [switches] +folder [+folder]\n");
127 goto leave;
128 }
129 if(filec > 1) {
130 if(msgp) {
131 fprintf(stderr, "File: Can't mix files and messages.\n");
132 goto leave;
133 }
134 if(opnfolds())
135 goto leave;
136 for(i = 1; i < filec; i++) {
137 if(m_file(folder, files[i], folders, foldp, prsrvf, 0))
138 goto leave;
139 }
140 if(!linkf) {
141 if((cp = m_find("delete-prog")) != NULL) {
142 files[0] = r1bindex(cp, '/');
143 execvp(cp, files);
144 fprintf(stderr, "Can't exec deletion-prog--");
145 perror(cp);
146 } else for(i = 1; i < filec; i++) {
147 if(unlink(files[i]) == -1) {
148 fprintf(stderr, "Can't unlink ");
149 perror(files[i]);
150 }
151 }
152 }
153 goto leave;
154 }
155 if(!msgp)
156 msgs[msgp++] = "cur";
157 if(!folder)
158 folder = m_getfolder();
159 VOID copy(m_maildir(folder), maildir);
160 if(chdir(maildir) < 0) {
161 fprintf(stderr, "Can't chdir to: ");
162 perror(maildir);
163 goto leave;
164 }
165 if(!(mp = m_gmsg(folder))) {
166 fprintf(stderr, "Can't read folder %s!?\n",folder);
167 goto leave;
168 }
169 if(mp->hghmsg == 0) {
170 fprintf(stderr, "No messages in \"%s\".\n", folder);
171 goto leave;
172 }
173 for(msgnum = 0; msgnum < msgp; msgnum++)
174 if(!m_convert((cp = msgs[msgnum])))
175 goto leave;
176 if(mp->numsel == 0) {
177 fprintf(stderr, "file: ham 'n cheese\n"); /* never get here */
178 goto leave;
179 }
180 m_replace(pfolder, folder);
181 if(mp->hghsel != mp->curmsg && ((mp->numsel != mp->nummsg) || linkf))
182 m_setcur(mp->hghsel);
183 if(opnfolds())
184 goto leave;
185 for(msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
186 if(mp->msgstats[msgnum] & SELECTED)
187 if(m_file(folder, cp = getcpy(m_name(msgnum)),
188 folders, foldp, prsrvf, 0))
189 goto leave;
190 else
191 cndfree(cp);
192 if(!linkf) {
193 if((cp = m_find("delete-prog")) != NULL) {
194 if(mp->numsel > MAXARGS-2) {
195 fprintf(stderr, "file: more than %d messages for deletion-prog\n",MAXARGS-2);
196 printf("[messages not unlinked]\n");
197 goto leave;
198 }
199 vecp = 1;
200 vec = (char **) calloc(MAXARGS + 2, sizeof *vec);
201 for(msgnum= mp->lowsel; msgnum<= mp->hghsel; msgnum++)
202 if(mp->msgstats[msgnum]&SELECTED)
203 vec[vecp++] = getcpy(m_name(msgnum));
204 vec[vecp] = 0;
205 m_update();
206 VOID fflush(stdout);
207 vec[0] = r1bindex(cp, '/');
208 execv(vec[0], vec);
209 fprintf(stderr, "Can't exec deletion-prog--");
210 perror(cp);
211 } else {
212 for(msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
213 if(mp->msgstats[msgnum] & SELECTED)
214 if(unlink(cp = m_name(msgnum))== -1) {
215 fprintf(stderr, "Can't unlink %s:",folder);
216 perror(cp);
217 }
218 }
219 }
220 leave:
221 m_update();
222 done(0);
223 }
224
225
226 opnfolds()
227 {
228 register int i;
229 register char *cp;
230 char nmaildir[128];
231
232 for(i = 0; i < foldp; i++) {
233 VOID copy(m_maildir(folders[i].f_name), nmaildir);
234 if(access(nmaildir, 5) < 0) {
235 cp = concat("Create folder \"", nmaildir, "\"? ", 0);
236 if(!gans(cp, anoyes))
237 goto bad;
238 free(cp);
239 if(!makedir(nmaildir)) {
240 fprintf(stderr, "Can't create folder.\n");
241 goto bad;
242 }
243 }
244 if(chdir(nmaildir) < 0) {
245 fprintf(stderr, "Can't chdir to: ");
246 perror(nmaildir);
247 goto bad;
248 }
249 if(!(folders[i].f_mp = m_gmsg(folders[i].f_name))) {
250 fprintf(stderr, "Can't read folder %s\n", folders[i].f_name);
251 goto bad;
252 }
253 }
254 VOID chdir(maildir); /* return to src folder */
255 return(0);
256 bad:
257 retur