/* movemail foo bar -- move file foo to file bar,
locking file foo the way /bin/mail respects.
- Copyright (C) 1986, 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1986, 92, 93, 94, 96, 1999 Free Software Foundation, Inc.
This file is part of GNU Emacs.
int _fmode = _O_BINARY;
#endif /* WINDOWSNT */
-/* Cancel substitutions made by config.h for Emacs. */
-#undef open
-#undef read
-#undef write
-#undef close
-
#ifdef USG
#include <fcntl.h>
#include <unistd.h>
#include <unistd.h>
#endif
-#ifdef STDC_HEADERS
-#include <stdlib.h>
-#endif
-
#if defined (XENIX) || defined (WINDOWSNT)
#include <sys/locking.h>
#endif
char *spool_name;
#endif
+#ifdef MAIL_USE_POP
+ int pop_reverse_order = 0;
+# define ARGSTR "pr"
+#else /* ! MAIL_USE_POP */
+# define ARGSTR "p"
+#endif /* MAIL_USE_POP */
+
delete_lockname = 0;
- while ((c = getopt (argc, argv, "p")) != EOF)
+ while ((c = getopt (argc, argv, ARGSTR)) != EOF)
{
switch (c) {
+#ifdef MAIL_USE_POP
+ case 'r':
+ pop_reverse_order = 1;
+ break;
+#endif
case 'p':
preserve_mail++;
break;
int status;
status = popmail (inname + 3, outname, preserve_mail,
- (argc - optind == 3) ? argv[optind+2] : NULL);
+ (argc - optind == 3) ? argv[optind+2] : NULL,
+ pop_reverse_order);
exit (status);
}
#ifdef MAIL_USE_SYSTEM_LOCK
if (! preserve_mail)
{
-#if defined (STRIDE) || defined (XENIX) || defined (WINDOWSNT)
+#if defined (STRIDE) || defined (XENIX)
/* Stride, xenix have file locking, but no ftruncate.
This mess will do. */
close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666));
char obuffer[BUFSIZ];
char Errmsg[80];
-popmail (user, outfile, preserve, password)
+popmail (user, outfile, preserve, password, reverse_order)
char *user;
char *outfile;
int preserve;
char *password;
+ int reverse_order;
{
int nmsgs, nbytes;
register int i;
FILE *mbf;
char *getenv ();
popserver server;
+ int start, end, increment;
server = pop_open (0, user, password, POP_NO_GETPASS);
if (! server)
{
- error (pop_error);
+ error ("Error connecting to POP server: %s", pop_error);
return (1);
}
if (pop_stat (server, &nmsgs, &nbytes))
{
- error (pop_error);
+ error ("Error getting message count from POP server: %s", pop_error);
return (1);
}
return (1);
}
- for (i = 1; i <= nmsgs; i++)
+ if (reverse_order)
+ {
+ start = nmsgs;
+ end = 1;
+ increment = -1;
+ }
+ else
+ {
+ start = 1;
+ end = nmsgs;
+ increment = 1;
+ }
+
+ for (i = start; i * increment <= end * increment; i += increment)
{
mbx_delimit_begin (mbf);
if (pop_retr (server, i, mbf) != OK)
{
if (pop_delete (server, i))
{
- error (pop_error);
+ error ("Error from POP server: %s", pop_error);
pop_close (server);
return (1);
}
if (pop_quit (server))
{
- error (pop_error);
+ error ("Error from POP server: %s", pop_error);
return (1);
}
if (pop_retrieve_first (server, msgno, &line))
{
- strncpy (Errmsg, pop_error, sizeof (Errmsg));
+ char *error = concat ("Error from POP server: ", pop_error, "");
+ strncpy (Errmsg, error, sizeof (Errmsg));
Errmsg[sizeof (Errmsg)-1] = '\0';
+ free(error);
return (NOTOK);
}
if (ret)
{
- strncpy (Errmsg, pop_error, sizeof (Errmsg));
+ char *error = concat ("Error from POP server: ", pop_error, "");
+ strncpy (Errmsg, error, sizeof (Errmsg));
Errmsg[sizeof (Errmsg)-1] = '\0';
+ free(error);
return (NOTOK);
}