X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/4822b2e57fd58d2d7c26a89f25009dd9b21a6f11..041470d2d9125f8459708b39da8e29c4c51fb70e:/lib-src/movemail.c diff --git a/lib-src/movemail.c b/lib-src/movemail.c index 1ab59c0e5d..df5cb5a2d1 100644 --- a/lib-src/movemail.c +++ b/lib-src/movemail.c @@ -1,6 +1,6 @@ /* 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. @@ -100,12 +100,6 @@ Boston, MA 02111-1307, USA. */ 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 #include @@ -121,10 +115,6 @@ int _fmode = _O_BINARY; #include #endif -#ifdef STDC_HEADERS -#include -#endif - #if defined (XENIX) || defined (WINDOWSNT) #include #endif @@ -197,11 +187,23 @@ main (argc, argv) 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; @@ -263,7 +265,8 @@ main (argc, argv) 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); } @@ -490,7 +493,7 @@ main (argc, argv) #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)); @@ -682,11 +685,12 @@ char ibuffer[BUFSIZ]; 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; @@ -694,17 +698,18 @@ popmail (user, outfile, preserve, password) 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); } @@ -732,7 +737,20 @@ popmail (user, outfile, preserve, password) 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) @@ -777,7 +795,7 @@ popmail (user, outfile, preserve, password) { if (pop_delete (server, i)) { - error (pop_error); + error ("Error from POP server: %s", pop_error); pop_close (server); return (1); } @@ -785,7 +803,7 @@ popmail (user, outfile, preserve, password) if (pop_quit (server)) { - error (pop_error); + error ("Error from POP server: %s", pop_error); return (1); } @@ -803,8 +821,10 @@ pop_retr (server, msgno, arg) 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); } @@ -823,8 +843,10 @@ pop_retr (server, msgno, arg) 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); }