]>
diplodocus.org Git - nmh/blob - docs/historical/2.9BSD/cmds/refile.c
2 static char sccsid
[] = "@(#)refile.c 1.1 5/26/83";
12 #define NFOLD 20 /* Allow 20 folder specs */
14 /* file [-src folder] [msgs] +folder [+folder ...]
16 * moves messages from src folder (or current) to other one(s).
18 * all = 1-999 for a message sequence
19 * -preserve says preserve msg numbers
20 * -link says don't delete old msg
23 char *anoyes
[]; /* Std no/yes gans array */
25 int vecp
, foldp
, prsrvf
;
26 char **vec
, maildir
[128], *folder
, *file
;
34 char *files
[NFOLD
+ 1]; /* Vec of files to process--starts at 1! */
36 char *bellfile
= "/usr/bin/file";
40 struct swit switches
[] = {
44 "preserve", 0, /* 3 */
45 "nopreserve", 0, /* 4 */
46 "src +folder", 0, /* 5 */
54 register int i
, msgnum
;
60 char *arguments
[50], **argp
;
64 * Rand has committed the sin of picking a name that already is
65 * used (file). We fix this here since we can tell the difference
66 * between the two (mh file has -'s and +'s always, bell file never
69 for (i
=1; i
<argc
; i
++)
70 if (argv
[i
][0] == '-' || argv
[i
][0]=='+')
73 execv(bellfile
, argv
);
74 fprintf(stderr
, "Cannot find %s\n", bellfile
);
81 folder
= 0; msgp
= 0; linkf
= 0;
82 cp
= r1bindex(argv
[0], '/');
83 if((cp
= m_find(cp
)) != NULL
) {
84 ap
= brkstring(cp
= getcpy(cp
), " ", "\n");
85 ap
= copyip(ap
, arguments
);
92 switch(smatch(++cp
, switches
)) {
93 case -2:ambigsw(cp
, switches
); /* ambiguous */
96 case -1:fprintf(stderr
, "file: -%s unknown\n", cp
);
99 case 0: fprintf(stderr
, "\"-all\" changed to \"all\"\n");
101 case 1: linkf
= 1; continue; /* -link */
102 case 2: linkf
= 0; continue; /* -nolink */
103 case 3: prsrvf
= 1; continue; /* -preserve */
104 case 4: prsrvf
= 0; continue; /* -nopreserve */
105 case 5: if(folder
) { /* -src */
106 fprintf(stderr
, "Only one src folder.\n");
109 if(!(folder
= *argp
++) || *folder
== '-') {
110 missing
: fprintf(stderr
, "file: Missing argument for %s switch\n", argp
[-2]);
119 fprintf(stderr
, "Too many src files.\n");
122 if(!(files
[filec
++] = *argp
) || **argp
++ == '-')
126 case 7: help("file [msgs] [switches] +folder ...",
133 folders
[foldp
++].f_name
= cp
+ 1;
135 fprintf(stderr
, "Only %d folders allowed.\n", NFOLD
);
142 fprintf(stderr
, "No folder specified.\n");
143 fprintf(stderr
, "Usage: file [-src folder] [msg ...] [switches] +folder [+folder]\n");
148 fprintf(stderr
, "File: Can't mix files and messages.\n");
151 for(i
= 1; i
< filec
; i
++)
152 if(*files
[i
] != '/') {
155 files
[i
] = concat(pwds
, "/", files
[i
], 0);
159 for(i
= 1; i
< filec
; i
++) {
160 if(process(files
[i
]))
164 if((cp
= m_find("delete-prog")) != NULL
) {
167 fprintf(stderr
, "Can't exec deletion-prog--");
169 } else for(i
= 1; i
< filec
; i
++) {
170 if(unlink(files
[i
]) == -1) {
171 fprintf(stderr
, "Can't unlink ");
179 msgs
[msgp
++] = "cur";
181 folder
= m_getfolder();
182 copy(m_maildir(folder
), maildir
);
183 if(chdir(maildir
) < 0) {
184 fprintf(stderr
, "Can't chdir to: ");
188 if(!(mp
= m_gmsg(folder
))) {
189 fprintf(stderr
, "Can't read folder %s!?\n",folder
);
192 if(mp
->hghmsg
== 0) {
193 fprintf(stderr
, "No messages in \"%s\".\n", folder
);
196 for(msgnum
= 0; msgnum
< msgp
; msgnum
++)
197 if(!m_convert((cp
= msgs
[msgnum
])))
199 if(mp
->numsel
== 0) {
200 fprintf(stderr
, "file: ham 'n cheese\n"); /* never get here */
203 m_replace(pfolder
, folder
);
204 if(mp
->hghsel
!= mp
->curmsg
&& ((mp
->numsel
!= mp
->nummsg
) || linkf
))
205 m_setcur(mp
->hghsel
);
208 for(msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++)
209 if(mp
->msgstats
[msgnum
] & SELECTED
)
210 if(process(cp
= getcpy(m_name(msgnum
))))
215 if((cp
= m_find("delete-prog")) != NULL
) {
216 if(mp
->numsel
> MAXARGS
-2) {
217 fprintf(stderr
, "file: more than %d messages for deletion-prog\n",MAXARGS
-2);
218 printf("[messages not unlinked]\n");
222 vec
= (char **) calloc(MAXARGS
+ 2, sizeof *vec
);
223 for(msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++)
224 if(mp
->msgstats
[msgnum
]&SELECTED
)
225 vec
[vecp
++] = getcpy(m_name(msgnum
));
231 fprintf(stderr
, "Can't exec deletion-prog--");
234 for(msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++)
235 if(mp
->msgstats
[msgnum
] & SELECTED
)
236 if(unlink(cp
= m_name(msgnum
))== -1) {
237 fprintf(stderr
, "Can't unlink %s:",folder
);
254 for(i
= 0; i
< foldp
; i
++) {
255 copy(m_maildir(folders
[i
].f_name
), nmaildir
);
256 if(access(nmaildir
, 5) < 0) {
257 cp
= concat("Create folder \"", nmaildir
, "\"? ", 0);
258 if(!gans(cp
, anoyes
))
261 if(!makedir(nmaildir
)) {
262 fprintf(stderr
, "Can't create folder.\n");
266 if(chdir(nmaildir
) < 0) {
267 fprintf(stderr
, "Can't chdir to: ");
271 if(!(folders
[i
].f_mp
= m_gmsg())) {
272 fprintf(stderr
, "Can't read folder %s\n", folders
[i
].f_name
);
276 chdir(maildir
); /* return to src folder */
286 char newmsg
[256], buf
[BUFSIZ
];
289 register struct st_fold
*fp
;
290 struct stat stbuf
, stbf1
;
293 for(fp
= folders
; fp
< &folders
[foldp
]; fp
++) {
297 nmsg
= m_name(fp
->f_mp
->hghmsg
++ + 1);
298 copy(nmsg
, copy("/", copy(m_maildir(fp
->f_name
), newmsg
)));
299 if(link(msg
, newmsg
) < 0) {
301 if(linkerr
== EEXIST
||
302 (linkerr
== EXDEV
&& stat(newmsg
, &stbuf
) != -1)) {
303 if(linkerr
!= EEXIST
|| stat(msg
, &stbf1
) < 0 ||
304 stat(newmsg
, &stbuf
) < 0 ||
305 stbf1
.st_ino
!= stbuf
.st_ino
) {
306 fprintf(stderr
, "Message %s:%s already exists.\n",
312 if(linkerr
== EXDEV
) {
313 if((o
= open(msg
, 0)) == -1) {
314 fprintf(stderr
, "Can't open %s:%s.\n",
319 if((n
= creat(newmsg
, stbuf
.st_mode
&0777)) == -1) {
320 fprintf(stderr
, "Can't create %s:%s.\n",
326 if((i
=read(o
, buf
, sizeof buf
)) < 0 ||
327 write(n
, buf
, i
) == -1) {
328 fprintf(stderr
, "Copy error on %s:%s to %s:%s!\n",
329 folder
, msg
, fp
->f_name
, nmsg
);
333 while(i
== sizeof buf
);
336 fprintf(stderr
, "Error on link %s:%s to %s:",
337 folder
, msg
, fp
->f_name
);
352 static char curpath
[128];
356 if((pp
= popen("pwd", "r")) == NULL
||
357 fgets(curpath
, sizeof curpath
, pp
) == NULL
||
359 fprintf(stderr
, "Can't find current directory!\n");
362 *rindex(curpath
, '\n') = 0; /* Zap the lf */