/* refile.c - file messages away */
static char ident
[] = "@(#)$Id: refile.c,v 1.10 1992/12/15 00:20:22 jromine Exp $";
static struct swit switches
[] = {
static char maildir
[BUFSIZ
];
static opnfolds(), clsfolds(), removeit();
**files
= &filevec
[1], /* leave room for removeit:vec[0] */
struct st_fold folders
[NFOLDERS
+ 1];
invo_name
= r1bindex (argv
[0], '/');
if ((cp
= m_find (invo_name
)) != NULL
) {
ap
= brkstring (cp
= getcpy (cp
), " ", "\n");
ap
= copyip (ap
, arguments
);
(void) copyip (argv
+ 1, ap
);
switch (smatch (++cp
, switches
)) {
adios (NULLCP
, "-%s unknown\n", cp
);
(void) sprintf (buf
, "%s [msgs] [switches] +folder ...",
adios (NULLCP
, "only one source folder at a time!");
if (!(cp
= *argp
++) || *cp
== '-')
adios (NULLCP
, "missing argument to %s", argp
[-2]);
folder
= path (*cp
== '+' || *cp
== '@' ? cp
+ 1 : cp
,
*cp
!= '@' ? TFOLDER
: TSUBCWF
);
adios (NULLCP
, "only %d files allowed!", NFOLDERS
);
files
[filep
++] = getcpy (m_draft (NULLCP
, NULLCP
, 1, &isdf
));
adios (NULLCP
, "only %d files allowed!", NFOLDERS
);
if (!(cp
= *argp
++) || *cp
== '-')
adios (NULLCP
, "missing argument to %s", argp
[-2]);
files
[filep
++] = path (cp
, TFILE
);
if (!(rmmproc
= *argp
++) || *rmmproc
== '-')
adios (NULLCP
, "missing argument to %s", argp
[-2]);
if (*cp
== '+' || *cp
== '@') {
adios (NULLCP
, "only %d folders allowed!", NFOLDERS
);
folders
[foldp
++].f_name
=
path (cp
+ 1, *cp
== '+' ? TFOLDER
: TSUBCWF
);
free (path ("./", TFOLDER
));
adios (NULLCP
, "no folder specified");
if (!msgp
&& !foldp
&& !filep
&& (cp
= getenv ("mhdraft")) && *cp
)
adios (NULLCP
, "use -file or some messages, not both");
opnfolds (folders
, foldp
);
for (i
= 0; i
< filep
; i
++)
if (m_file (files
[i
], folders
, foldp
, prsrvf
))
removeit (NULLMP
, filep
, filevec
);
(void) strcpy (maildir
, m_maildir (folder
));
if (chdir (maildir
) == NOTOK
)
adios (maildir
, "unable to change directory to");
if (!(mp
= m_gmsg (folder
)))
adios (NULLCP
, "unable to read folder %s", folder
);
adios (NULLCP
, "no messages in %s", folder
);
for (msgnum
= 0; msgnum
< msgp
; msgnum
++)
if (!m_convert (mp
, msgs
[msgnum
]))
opnfolds (folders
, foldp
);
for (msgnum
= mp
-> lowsel
; msgnum
<= mp
-> hghsel
; msgnum
++)
if (mp
-> msgstats
[msgnum
] & SELECTED
) {
cp
= getcpy (m_name (msgnum
));
if (m_file (cp
, folders
, foldp
, prsrvf
))
mp
-> msgstats
[msgnum
] |= DELETED
;
mp
-> msgstats
[msgnum
] &= ~EXISTS
;
mp
-> msgflags
|= SEQMOD
;
clsfolds (folders
, foldp
);
m_replace (pfolder
, folder
);
if (mp
-> hghsel
!= mp
-> curmsg
&& (mp
-> numsel
!= mp
-> nummsg
|| linkf
))
m_setcur (mp
, mp
-> hghsel
);
removeit (mp
, filep
, filevec
);
static opnfolds (folders
, nfolders
)
register struct st_fold
*folders
;
register struct st_fold
*fp
,
register struct msgs
*mp
;
for (ep
= (fp
= folders
) + nfolders
; fp
< ep
; fp
++) {
(void) chdir (m_maildir (""));
(void) strcpy (nmaildir
, m_maildir (fp
-> f_name
));
if (stat (nmaildir
, &st
) == NOTOK
) {
adios (nmaildir
, "error on folder");
cp
= concat ("Create folder \"", nmaildir
, "\"? ", NULLCP
);
adios (NULLCP
, "unable to create folder %s", nmaildir
);
if (chdir (nmaildir
) == NOTOK
)
adios (nmaildir
, "unable to change directory to");
if (!(mp
= m_gmsg (fp
-> f_name
)))
adios (NULLCP
, "unable to read folder %s", fp
-> f_name
);
static clsfolds (folders
, nfolders
)
register struct st_fold
*folders
;
register struct st_fold
*fp
,
register struct msgs
*mp
;
for (ep
= (fp
= folders
) + nfolders
; fp
< ep
; fp
++) {
static removeit (mp
, filep
, files
)
register struct msgs
*mp
;
vec
= files
++; /* filevec[1] */
if (mp
-> numsel
> MAXARGS
- 2)
adios (NULLCP
, "more than %d messages for %s exec",
vec
= (char **) calloc ((unsigned) (mp
-> numsel
+ 2), sizeof *vec
);
adios (NULLCP
, "unable to allocate exec vector");
for (i
= mp
-> lowsel
; i
<= mp
-> hghsel
; i
++)
if (mp
-> msgstats
[i
] & SELECTED
)
vec
[vecp
++] = getcpy (m_name (i
));
vec
[0] = r1bindex (rmmproc
, '/');
adios (rmmproc
, "unable to exec");
files
++; /* filevec[1] */
for (i
= 0; i
< filep
; i
++)
if (unlink (files
[i
]) == NOTOK
)
admonish (files
[i
], "unable to unlink");
for (i
= mp
-> lowsel
; i
<= mp
-> hghsel
; i
++)
if (mp
-> msgstats
[i
] & SELECTED
)
if (unlink (cp
= m_name (i
)) == NOTOK
)
admonish (cp
, "unable to unlink");
m_file (msg
, folders
, nfolders
, prsrvf
)
register struct st_fold
*fp
,
register struct msgs
*mp
;
for (ep
= (fp
= folders
) + nfolders
; fp
< ep
; fp
++) {
if (prsrvf
&& (msgnum
= m_atoi (nmsg
= msg
)) > 0) {
if (msgnum
>= mp
-> hghoff
)
if (mp
= m_remsg (mp
, 0, msgnum
+ MAXFOLDER
))
adios (NULLCP
, "unable to allocate folder storage");
if (!(mp
-> msgstats
[msgnum
] & EXISTS
)) {
mp
-> msgstats
[msgnum
] |= EXISTS
;
mp
-> msgstats
[msgnum
] &= ~DELETED
;
mp
-> msgstats
[msgnum
] |= SELECTED
;
if (msgnum
> mp
-> hghmsg
)
if (mp
-> hghmsg
>= mp
-> hghoff
)
if (mp
= m_remsg (mp
, 0, mp
-> hghoff
+ MAXFOLDER
))
adios (NULLCP
, "unable to allocate folder storage");
nmsg
= m_name (msgnum
= ++mp
-> hghmsg
);
mp
-> msgstats
[msgnum
] |= EXISTS
| SELECTED
;
if (mp
-> lowsel
== 0 || msgnum
< mp
-> lowsel
)
if (msgnum
> mp
-> hghsel
)
(void) sprintf (newmsg
, "%s/%s", mp
-> foldpath
, nmsg
);
if (link (msg
, newmsg
) == NOTOK
) {
if ((linkerr
= errno
) == EISREMOTE
)
|| (linkerr
== EXDEV
&& stat (newmsg
, &st
) != NOTOK
)) {
|| stat (msg
, &s1
) == NOTOK
|| stat (newmsg
, &st
) == NOTOK
|| s1
.st_ino
!= st
.st_ino
) {
advise (NULLCP
, "message %s:%s already exists",
if ((in
= open (msg
, 0)) == NOTOK
) {
advise (msg
, "unable to open message %s");
if ((out
= creat (newmsg
, (int) st
.st_mode
& 0777))
advise (newmsg
, "unable to create");
cpydata (in
, out
, msg
, newmsg
);
advise (newmsg
, "error linking %s to", msg
);