2 Proprietary Rand Corporation
, 1981.
3 Further distribution of
this software
4 subject to the terms of the Rand
12 #define NFOLD 20 /* Allow 20 folder specs */
15 /* file [-src folder] [msgs] +folder [+folder ...]
17 * moves messages from src folder (or current) to other one(s).
19 * all = 1-999 (MAXFOLDER) for a message sequence
20 * -preserve says preserve msg numbers
21 * -link says don't delete old msg
24 extern struct swit anoyes
[]; /* Std no/yes gans array */
26 int vecp
, foldp
, prsrvf
;
27 char **vec
, maildir
[128], *folder
;
30 struct st_fold folders
[NFOLD
];
32 char *files
[NFOLD
+ 1]; /* Vec of files to process--starts at 1! */
35 struct swit switches
[] = {
39 "preserve", 0, /* 3 */
40 "nopreserve", 0, /* 4 */
41 "src +folder", 0, /* 5 */
51 register int i
, msgnum
;
56 char *arguments
[50], **argp
;
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
);
69 VOID
copyip(argv
+1, ap
);
73 switch(smatch(++cp
, switches
)) {
74 case -2:ambigsw(cp
, switches
); /* ambiguous */
77 case -1:fprintf(stderr
, "file: -%s unknown\n", cp
);
80 case 0: fprintf(stderr
, "\"-all\" changed to \"all\"\n");
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");
90 if(!(folder
= *argp
++) || *folder
== '-') {
91 missing
: fprintf(stderr
, "file: Missing argument for %s switch\n", argp
[-2]);
96 folder
= path(folder
, TFOLDER
);
100 fprintf(stderr
, "Too many src files.\n");
103 if(!(cp
= *argp
++) || *cp
== '-')
105 files
[filec
++] = path(cp
, TFILE
);
109 case 7: help("file [msgs] [switches] +folder ...",
115 folders
[foldp
++].f_name
= path(++cp
, TFOLDER
);
117 fprintf(stderr
, "Only %d folders allowed.\n", NFOLD
);
123 if(!m_find("path")) free(path("./", TFOLDER
));
125 fprintf(stderr
, "No folder specified.\n");
126 fprintf(stderr
, "Usage: file [-src folder] [msg ...] [switches] +folder [+folder]\n");
131 fprintf(stderr
, "File: Can't mix files and messages.\n");
136 for(i
= 1; i
< filec
; i
++) {
137 if(m_file(folder
, files
[i
], folders
, foldp
, prsrvf
, 0))
141 if((cp
= m_find("delete-prog")) != NULL
) {
142 files
[0] = r1bindex(cp
, '/');
144 fprintf(stderr
, "Can't exec deletion-prog--");
146 } else for(i
= 1; i
< filec
; i
++) {
147 if(unlink(files
[i
]) == -1) {
148 fprintf(stderr
, "Can't unlink ");
156 msgs
[msgp
++] = "cur";
158 folder
= m_getfolder();
159 VOID
copy(m_maildir(folder
), maildir
);
160 if(chdir(maildir
) < 0) {
161 fprintf(stderr
, "Can't chdir to: ");
165 if(!(mp
= m_gmsg(folder
))) {
166 fprintf(stderr
, "Can't read folder %s!?\n",folder
);
169 if(mp
->hghmsg
== 0) {
170 fprintf(stderr
, "No messages in \"%s\".\n", folder
);
173 for(msgnum
= 0; msgnum
< msgp
; msgnum
++)
174 if(!m_convert((cp
= msgs
[msgnum
])))
176 if(mp
->numsel
== 0) {
177 fprintf(stderr
, "file: ham 'n cheese\n"); /* never get here */
180 m_replace(pfolder
, folder
);
181 if(mp
->hghsel
!= mp
->curmsg
&& ((mp
->numsel
!= mp
->nummsg
) || linkf
))
182 m_setcur(mp
->hghsel
);
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))
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");
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
));
207 vec
[0] = r1bindex(cp
, '/');
209 fprintf(stderr
, "Can't exec deletion-prog--");
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
);
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
))
239 if(!makedir(nmaildir
)) {
240 fprintf(stderr
, "Can't create folder.\n");
244 if(chdir(nmaildir
) < 0) {
245 fprintf(stderr
, "Can't chdir to: ");
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
);
254 VOID
chdir(maildir
); /* return to src folder */