/* 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.
* "po:username". This will cause movemail to open a connection to
* a pop server running on $MAILHOST (environment variable). Movemail
* must be setuid to root in order to work with POP.
- *
+ *
* New module: popmail.c
* Modified routines:
* main - added code within #ifdef MAIL_USE_POP; added setuid (getuid ())
- * after POP code.
+ * after POP code.
* New routines in movemail.c:
* get_errmsg - return pointer to system error message
*
*/
#define NO_SHORTNAMES /* Tell config not to load remap.h */
-#include <../src/config.h>
+#include <config.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <stdio.h>
#include <errno.h>
-#include <../src/syswait.h>
+
#include <getopt.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#include "syswait.h"
#ifdef MAIL_USE_POP
#include "pop.h"
#endif
implemented and used on Unix. */
//#define DISABLE_DIRECT_ACCESS
-/* Ensure all file i/o is in binary mode. */
#include <fcntl.h>
-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>
#ifndef F_OK
#define F_OK 0
#define X_OK 1
#define W_OK 2
#define R_OK 4
#endif
-#endif /* USG */
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef STDC_HEADERS
-#include <stdlib.h>
-#endif
#if defined (XENIX) || defined (WINDOWSNT)
#include <sys/locking.h>
#endif
#if !defined (MAIL_USE_SYSTEM_LOCK) && !defined (MAIL_USE_MMDF) && \
- defined (HAVE_LIBMAIL) && defined (HAVE_MAILLOCK_H)
+ (defined (HAVE_LIBMAIL) || defined (HAVE_LIBLOCKFILE)) && \
+ defined (HAVE_MAILLOCK_H)
#include <maillock.h>
/* We can't use maillock unless we know what directory system mail
files appear in. */
extern int errno;
#endif
char *strerror ();
-extern char *rindex ();
+#ifdef HAVE_INDEX
+extern char *index __P ((const char *, int));
+#endif
+#ifdef HAVE_RINDEX
+extern char *rindex __P((const char *, int));
+#endif
void fatal ();
void error ();
# define ARGSTR "p"
#endif /* MAIL_USE_POP */
+#ifdef WINDOWSNT
+ /* Ensure all file i/o is in binary mode. */
+ _fmode = _O_BINARY;
+#endif
+
delete_lockname = 0;
while ((c = getopt (argc, argv, ARGSTR)) != EOF)
preserve_mail++;
break;
default:
- exit(1);
+ exit (EXIT_FAILURE);
}
}
#endif
)
{
- fprintf (stderr, "Usage: movemail [-p] inbox destfile%s\n",
#ifdef MAIL_USE_POP
- " [POP-password]"
+ fprintf (stderr, "Usage: movemail [-p] inbox destfile%s\n",
+ " [POP-password]");
#else
- ""
+ fprintf (stderr, "Usage: movemail [-p] inbox destfile%s\n", "");
#endif
- );
- exit (1);
+ exit (EXIT_FAILURE);
}
inname = argv[optind];
if (desc < 0)
{
char *message = (char *) xmalloc (strlen (tempname) + 50);
- sprintf (message, "%s--see source file lib-src/movemail.c",
+ sprintf (message, "creating %s, which would become the lock file",
tempname);
pfatal_with_name (message);
}
pfatal_with_name (inname);
}
-
+
{
char buf[1024];
#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));
if (spool_name)
mailunlock ();
#endif
- exit (0);
+ exit (EXIT_SUCCESS);
}
wait (&status);
if (!WIFEXITED (status))
- exit (1);
+ exit (EXIT_FAILURE);
else if (WRETCODE (status) != 0)
exit (WRETCODE (status));
#endif /* ! DISABLE_DIRECT_ACCESS */
- return 0;
+ return EXIT_SUCCESS;
}
#ifdef MAIL_USE_MAILLOCK
{
if (delete_lockname)
unlink (delete_lockname);
- error (s1, s2);
- exit (1);
+ error (s1, s2, 0);
+ exit (EXIT_FAILURE);
}
-/* Print error message. `s1' is printf control string, `s2' is arg for it. */
+/* Print error message. `s1' is printf control string, `s2' and `s3'
+ are args for it or null. */
void
error (s1, s2, s3)
char *s1, *s2, *s3;
{
fprintf (stderr, "movemail: ");
- fprintf (stderr, s1, s2, s3);
+ if (s3)
+ fprintf (stderr, s1, s2, s3);
+ else if (s2)
+ fprintf (stderr, s1, s2);
+ else
+ fprintf (stderr, s1);
fprintf (stderr, "\n");
}
FILE *sfo;
char ibuffer[BUFSIZ];
char obuffer[BUFSIZ];
-char Errmsg[80];
+char Errmsg[200]; /* POP errors, at least, can exceed
+ the original length of 80. */
+
+/*
+ * The full legal syntax for a POP mailbox specification for movemail
+ * is "po:username:hostname". The ":hostname" is optional; if it is
+ * omitted, the MAILHOST environment variable will be consulted. Note
+ * that by the time popmail() is called the "po:" has been stripped
+ * off of the front of the mailbox name.
+ *
+ * If the mailbox is in the form "po:username:hostname", then it is
+ * modified by this function -- the second colon is replaced by a
+ * null.
+ *
+ * Return a value suitable for passing to `exit'.
+ */
-popmail (user, outfile, preserve, password, reverse_order)
- char *user;
+int
+popmail (mailbox, outfile, preserve, password, reverse_order)
+ char *mailbox;
char *outfile;
int preserve;
char *password;
char *getenv ();
popserver server;
int start, end, increment;
+ char *user, *hostname;
+
+ user = mailbox;
+ if ((hostname = index(mailbox, ':')))
+ *hostname++ = '\0';
- server = pop_open (0, user, password, POP_NO_GETPASS);
+ server = pop_open (hostname, user, password, POP_NO_GETPASS);
if (! server)
{
- error (pop_error);
- return (1);
+ error ("Error connecting to POP server: %s", pop_error, 0);
+ return EXIT_FAILURE;
}
if (pop_stat (server, &nmsgs, &nbytes))
{
- error (pop_error);
- return (1);
+ error ("Error getting message count from POP server: %s", pop_error, 0);
+ return EXIT_FAILURE;
}
if (!nmsgs)
{
pop_close (server);
- return (0);
+ return EXIT_SUCCESS;
}
mbfi = open (outfile, O_WRONLY | O_CREAT | O_EXCL, 0666);
{
pop_close (server);
error ("Error in open: %s, %s", strerror (errno), outfile);
- return (1);
+ return EXIT_FAILURE;
}
fchown (mbfi, getuid (), -1);
if ((mbf = fdopen (mbfi, "wb")) == NULL)
{
pop_close (server);
- error ("Error in fdopen: %s", strerror (errno));
+ error ("Error in fdopen: %s", strerror (errno), 0);
close (mbfi);
unlink (outfile);
- return (1);
+ return EXIT_FAILURE;
}
if (reverse_order)
mbx_delimit_begin (mbf);
if (pop_retr (server, i, mbf) != OK)
{
- error (Errmsg);
+ error (Errmsg, 0, 0);
close (mbfi);
- return (1);
+ return EXIT_FAILURE;
}
mbx_delimit_end (mbf);
fflush (mbf);
if (ferror (mbf))
{
- error ("Error in fflush: %s", strerror (errno));
+ error ("Error in fflush: %s", strerror (errno), 0);
pop_close (server);
close (mbfi);
- return (1);
+ return EXIT_FAILURE;
}
}
#ifdef BSD_SYSTEM
if (fsync (mbfi) < 0)
{
- error ("Error in fsync: %s", strerror (errno));
- return (1);
+ error ("Error in fsync: %s", strerror (errno), 0);
+ return EXIT_FAILURE;
}
#endif
if (close (mbfi) == -1)
{
- error ("Error in close: %s", strerror (errno));
- return (1);
+ error ("Error in close: %s", strerror (errno), 0);
+ return EXIT_FAILURE;
}
if (! preserve)
{
if (pop_delete (server, i))
{
- error (pop_error);
+ error ("Error from POP server: %s", pop_error, 0);
pop_close (server);
- return (1);
+ return EXIT_FAILURE;
}
}
if (pop_quit (server))
{
- error (pop_error);
- return (1);
+ error ("Error from POP server: %s", pop_error, 0);
+ return EXIT_FAILURE;
}
-
- return (0);
+
+ return EXIT_SUCCESS;
}
int
pop_retr (server, msgno, arg)
popserver server;
+ int msgno;
FILE *arg;
{
extern char *strerror ();
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);
}
line++;
len--;
}
- if (fwrite (line, 1, len, mbf) != len)
+ if (fwrite (line, 1, len, mbf) != len)
return (NOTOK);
if (fputc (0x0a, mbf) == EOF)
return (NOTOK);
return (OK);
}
+int
mbx_delimit_end (mbf)
FILE *mbf;
{
}
#endif /* ! HAVE_STRERROR */
+
+/* arch-tag: 1c323112-41fe-4fe5-8de9-494de631f73f
+ (do not change this comment) */
+
+/* movemail.c ends here */