static char sccsid
[] = "@(#)refile.c 1.1 5/26/83";
#define NFOLD 20 /* Allow 20 folder specs */
/* file [-src folder] [msgs] +folder [+folder ...]
* moves messages from src folder (or current) to other one(s).
* all = 1-999 for a message sequence
* -preserve says preserve msg numbers
* -link says don't delete old msg
char *anoyes
[]; /* Std no/yes gans array */
char **vec
, maildir
[128], *folder
, *file
;
char *files
[NFOLD
+ 1]; /* Vec of files to process--starts at 1! */
char *bellfile
= "/usr/bin/file";
struct swit switches
[] = {
"src +folder", 0, /* 5 */
char *arguments
[50], **argp
;
* Rand has committed the sin of picking a name that already is
* used (file). We fix this here since we can tell the difference
* between the two (mh file has -'s and +'s always, bell file never
if (argv
[i
][0] == '-' || argv
[i
][0]=='+')
fprintf(stderr
, "Cannot find %s\n", bellfile
);
folder
= 0; msgp
= 0; linkf
= 0;
cp
= r1bindex(argv
[0], '/');
if((cp
= m_find(cp
)) != NULL
) {
ap
= brkstring(cp
= getcpy(cp
), " ", "\n");
ap
= copyip(ap
, arguments
);
switch(smatch(++cp
, switches
)) {
case -2:ambigsw(cp
, switches
); /* ambiguous */
case -1:fprintf(stderr
, "file: -%s unknown\n", cp
);
case 0: fprintf(stderr
, "\"-all\" changed to \"all\"\n");
case 1: linkf
= 1; continue; /* -link */
case 2: linkf
= 0; continue; /* -nolink */
case 3: prsrvf
= 1; continue; /* -preserve */
case 4: prsrvf
= 0; continue; /* -nopreserve */
case 5: if(folder
) { /* -src */
fprintf(stderr
, "Only one src folder.\n");
if(!(folder
= *argp
++) || *folder
== '-') {
missing
: fprintf(stderr
, "file: Missing argument for %s switch\n", argp
[-2]);
fprintf(stderr
, "Too many src files.\n");
if(!(files
[filec
++] = *argp
) || **argp
++ == '-')
case 7: help("file [msgs] [switches] +folder ...",
folders
[foldp
++].f_name
= cp
+ 1;
fprintf(stderr
, "Only %d folders allowed.\n", NFOLD
);
fprintf(stderr
, "No folder specified.\n");
fprintf(stderr
, "Usage: file [-src folder] [msg ...] [switches] +folder [+folder]\n");
fprintf(stderr
, "File: Can't mix files and messages.\n");
for(i
= 1; i
< filec
; i
++)
files
[i
] = concat(pwds
, "/", files
[i
], 0);
for(i
= 1; i
< filec
; i
++) {
if((cp
= m_find("delete-prog")) != NULL
) {
fprintf(stderr
, "Can't exec deletion-prog--");
} else for(i
= 1; i
< filec
; i
++) {
if(unlink(files
[i
]) == -1) {
fprintf(stderr
, "Can't unlink ");
copy(m_maildir(folder
), maildir
);
fprintf(stderr
, "Can't chdir to: ");
if(!(mp
= m_gmsg(folder
))) {
fprintf(stderr
, "Can't read folder %s!?\n",folder
);
fprintf(stderr
, "No messages in \"%s\".\n", folder
);
for(msgnum
= 0; msgnum
< msgp
; msgnum
++)
if(!m_convert((cp
= msgs
[msgnum
])))
fprintf(stderr
, "file: ham 'n cheese\n"); /* never get here */
m_replace(pfolder
, folder
);
if(mp
->hghsel
!= mp
->curmsg
&& ((mp
->numsel
!= mp
->nummsg
) || linkf
))
for(msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++)
if(mp
->msgstats
[msgnum
] & SELECTED
)
if(process(cp
= getcpy(m_name(msgnum
))))
if((cp
= m_find("delete-prog")) != NULL
) {
if(mp
->numsel
> MAXARGS
-2) {
fprintf(stderr
, "file: more than %d messages for deletion-prog\n",MAXARGS
-2);
printf("[messages not unlinked]\n");
vec
= (char **) calloc(MAXARGS
+ 2, sizeof *vec
);
for(msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++)
if(mp
->msgstats
[msgnum
]&SELECTED
)
vec
[vecp
++] = getcpy(m_name(msgnum
));
fprintf(stderr
, "Can't exec deletion-prog--");
for(msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++)
if(mp
->msgstats
[msgnum
] & SELECTED
)
if(unlink(cp
= m_name(msgnum
))== -1) {
fprintf(stderr
, "Can't unlink %s:",folder
);
for(i
= 0; i
< foldp
; i
++) {
copy(m_maildir(folders
[i
].f_name
), nmaildir
);
if(access(nmaildir
, 5) < 0) {
cp
= concat("Create folder \"", nmaildir
, "\"? ", 0);
fprintf(stderr
, "Can't create folder.\n");
if(chdir(nmaildir
) < 0) {
fprintf(stderr
, "Can't chdir to: ");
if(!(folders
[i
].f_mp
= m_gmsg())) {
fprintf(stderr
, "Can't read folder %s\n", folders
[i
].f_name
);
chdir(maildir
); /* return to src folder */
char newmsg
[256], buf
[BUFSIZ
];
register struct st_fold
*fp
;
struct stat stbuf
, stbf1
;
for(fp
= folders
; fp
< &folders
[foldp
]; fp
++) {
nmsg
= m_name(fp
->f_mp
->hghmsg
++ + 1);
copy(nmsg
, copy("/", copy(m_maildir(fp
->f_name
), newmsg
)));
if(link(msg
, newmsg
) < 0) {
(linkerr
== EXDEV
&& stat(newmsg
, &stbuf
) != -1)) {
if(linkerr
!= EEXIST
|| stat(msg
, &stbf1
) < 0 ||
stat(newmsg
, &stbuf
) < 0 ||
stbf1
.st_ino
!= stbuf
.st_ino
) {
fprintf(stderr
, "Message %s:%s already exists.\n",
if((o
= open(msg
, 0)) == -1) {
fprintf(stderr
, "Can't open %s:%s.\n",
if((n
= creat(newmsg
, stbuf
.st_mode
&0777)) == -1) {
fprintf(stderr
, "Can't create %s:%s.\n",
if((i
=read(o
, buf
, sizeof buf
)) < 0 ||
write(n
, buf
, i
) == -1) {
fprintf(stderr
, "Copy error on %s:%s to %s:%s!\n",
folder
, msg
, fp
->f_name
, nmsg
);
fprintf(stderr
, "Error on link %s:%s to %s:",
folder
, msg
, fp
->f_name
);
static char curpath
[128];
if((pp
= popen("pwd", "r")) == NULL
||
fgets(curpath
, sizeof curpath
, pp
) == NULL
||
fprintf(stderr
, "Can't find current directory!\n");
*rindex(curpath
, '\n') = 0; /* Zap the lf */