]>
diplodocus.org Git - nmh/blob - docs/historical/SRI-NOSC/file.c
4 #define NFOLD 20 /* Allow 20 folder specs */
6 /* file [-src folder] [msgs] +folder [+folder ...]
8 * moves messages from src folder (or current) to other one(s).
10 * all = first-last for a message sequence
11 * -preserve says preserve msg numbers
12 * -link says don't delete old msg
15 char *anoyes
[]; /* Std no/yes gans array */
17 int fout
, vecp
, foldp
, prsrvf
;
18 char *vec
[MAXARGS
], maildir
[128], *folder
;
26 struct swit switches
[] {
30 "preserve", 0, /* 3 */
31 "nopreserve", 0, /* 4 */
32 "src +folder", 0, /* 5 */
39 register int i
, msgnum
;
44 char *arguments
[50], **argp
;
48 badarg
: printf("Usage: file [-src folder] [msg ...] +folder [+folder]\n");
54 folder
= msgp
= linkf
= 0;
60 if((cp
= m_find(ap
)) != -1) {
61 ap
= brkstring(cp
= getcpy(cp
), " ", "\n");
62 ap
= copyip(ap
, arguments
);
69 switch(smatch(++cp
, switches
)) {
70 case -2:ambigsw(cp
, switches
); /* ambiguous */
73 case -1:printf("file: -%s unknown\n", cp
);
76 case 0: printf("\"-all\" changed to \"all\"\n");
78 case 1: linkf
= 1; continue; /* -link */
79 case 2: linkf
= 0; continue; /* -nolink */
80 case 3: prsrvf
= 1; continue; /* -preserve */
81 case 4: prsrvf
= 0; continue; /* -nopreserve */
82 case 5: if(folder
) { /* -src */
83 printf("Only one src folder.\n");
86 if(!(folder
= *argp
++) || *folder
== '-') {
87 printf("file: Missing argument for %s switch\n", argp
[-2]);
94 case 6: help("file [msgs] [switches] +folder ...",
100 folders
[foldp
++].f_name
= cp
+ 1;
102 printf("Only %d folders allowed.\n", NFOLD
);
109 printf("No folder specified.\n");
113 msgs
[msgp
++] = "cur";
115 folder
= m_getfolder();
116 copy(m_maildir(folder
), maildir
);
117 if(chdir(maildir
) < 0) {
118 printf("Can't chdir to: "); flush();
122 if(!(mp
= m_gmsg(folder
))) {
123 printf("Can't read folder %s!?\n",folder
);
126 if(mp
->hghmsg
== 0) {
127 printf("No messages in \"%s\".\n", folder
);
130 for(msgnum
= 0; msgnum
< msgp
; msgnum
++)
131 if(!m_convert((cp
= msgs
[msgnum
]), UNDELETED
, UNDELETED
))
133 if(mp
->numsel
== 0) {
134 printf("No undeleted messages specified\n");
137 m_replace("folder", folder
);
138 if(mp
->hghsel
!= mp
->curmsg
&& ((mp
->numsel
!= mp
->nummsg
) || linkf
))
139 m_setcur(mp
->hghsel
);
142 for(msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++)
143 if(mp
->msgstats
[msgnum
] & SELECTED
)
144 if(process(getcpy(m_name(msgnum
))))
147 if((cp
= m_find("delete-prog")) != -1) {
148 if(mp
->numsel
> MAXARGS
-2) {
149 printf("file: more than %d messages for deletion-prog\n",MAXARGS
-2);
150 printf("[messages not unlinked]\n");
153 for(msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++)
154 if(mp
->msgstats
[msgnum
]&SELECTED
)
155 vec
[vecp
++] = getcpy(m_name(msgnum
));
161 printf("Can't exec deletion-prog--"); flush();
164 for(msgnum
= mp
->lowsel
; msgnum
<= mp
->hghsel
; msgnum
++)
165 if(mp
->msgstats
[msgnum
] & SELECTED
)
166 if(unlink(cp
= getcpy(m_name(msgnum
)))== -1) {
167 printf("Can't unlink %s:",folder
);
185 for(i
= 0; i
< foldp
; i
++) {
186 copy(m_maildir(folders
[i
].f_name
), nmaildir
);
187 if(stat(nmaildir
, &stbuf
) < 0) {
188 cp
= concat("Create folder \"", nmaildir
, "\"? ", 0);
189 if(!gans(cp
, anoyes
))
192 if(!makedir(nmaildir
)) {
193 printf("Can't create folder.\n");
197 if(chdir(nmaildir
) < 0) {
198 printf("Can't chdir to: "); flush();
202 if(!(folders
[i
].f_mp
= m_gmsg())) {
203 printf("Can't read folder %s\n", folders
[i
].f_name
);
207 chdir(maildir
); /* return to src folder */
216 char newmsg
[256], buf
[512];
219 register struct st_fold
*fp
;
220 struct inode stbuf
, stbf1
;
223 for(fp
= folders
; fp
< &folders
[foldp
]; fp
++) {
227 nmsg
= m_name(fp
->f_mp
->hghmsg
++ + 1);
228 copy(nmsg
, copy("/", copy(m_maildir(fp
->f_name
), newmsg
)));
229 if(link(msg
, newmsg
) < 0) {
230 if(errno
== EEXIST
||
231 (errno
== EXDEV
&& stat(newmsg
, &stbuf
) != -1)) {
232 if(errno
!= EEXIST
|| stat(msg
, &stbf1
) < 0 ||
233 stat(newmsg
, &stbuf
) < 0 ||
234 stbf1
.i_number
!= stbuf
.i_number
) {
235 printf("Message %s:%s already exists.\n",
242 if((o
= open(msg
, 0)) == -1) {
243 printf("Can't open %s:%s.\n",
248 if((n
= creat(newmsg
, stbuf
.i_mode
&0777)) == -1) {
249 printf("Can't create %s:%s.\n",
255 if((i
=read(o
, buf
, sizeof buf
)) < 0 ||
256 write(n
, buf
, i
) == -1) {
257 printf("Copy error on %s:%s to %s:%s!\n",
258 folder
, msg
, fp
->f_name
, nmsg
);
262 while(i
== sizeof buf
);
265 printf("Error on link %s:%s to %s:",
266 folder
, msg
, fp
->f_name
);