X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/873fbd0b84997863af25e3ddae23b6c078a3e6f5..3ab713fdac16ef6ae249b3da69d69e78361f6792:/lib-src/movemail.c
diff --git a/lib-src/movemail.c b/lib-src/movemail.c
index 733303455b..682aa10aa3 100644
--- a/lib-src/movemail.c
+++ b/lib-src/movemail.c
@@ -1,7 +1,8 @@
/* movemail foo bar -- move file foo to file bar,
locking file foo the way /bin/mail respects.
- Copyright (C) 1986, 1992, 1993, 1994, 1996, 1999, 2001, 2002, 2003, 2004,
- 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+Copyright (C) 1986, 1992-1994, 1996, 1999, 2001-2011
+ Free Software Foundation, Inc.
This file is part of GNU Emacs.
@@ -63,12 +64,13 @@ along with GNU Emacs. If not, see . */
#include
#include
-#ifdef HAVE_UNISTD_H
#include
-#endif
#ifdef HAVE_FCNTL_H
#include
#endif
+#ifdef HAVE_STRING_H
+#include
+#endif
#include "syswait.h"
#ifdef MAIL_USE_POP
#include "pop.h"
@@ -140,25 +142,23 @@ static char *mail_spool_name ();
#endif
#endif
+#ifndef HAVE_STRERROR
char *strerror (int);
-#ifdef HAVE_INDEX
-extern char *index (const char *, int);
-#endif
-#ifdef HAVE_RINDEX
-extern char *rindex (const char *, int);
#endif
-void fatal (char *s1, char *s2, char *s3);
-void error (char *s1, char *s2, char *s3);
-void pfatal_with_name (char *name);
-void pfatal_and_delete (char *name);
-char *concat (char *s1, char *s2, char *s3);
-long *xmalloc (unsigned int size);
-int popmail (char *mailbox, char *outfile, int preserve, char *password, int reverse_order);
-int pop_retr (popserver server, int msgno, FILE *arg);
-int mbx_write (char *line, int len, FILE *mbf);
-int mbx_delimit_begin (FILE *mbf);
-int mbx_delimit_end (FILE *mbf);
+static void fatal (const char *s1, const char *s2, const char *s3) NO_RETURN;
+static void error (const char *s1, const char *s2, const char *s3);
+static void pfatal_with_name (char *name) NO_RETURN;
+static void pfatal_and_delete (char *name) NO_RETURN;
+static char *concat (const char *s1, const char *s2, const char *s3);
+static long *xmalloc (unsigned int size);
+#ifdef MAIL_USE_POP
+static int popmail (char *mailbox, char *outfile, int preserve, char *password, int reverse_order);
+static int pop_retr (popserver server, int msgno, FILE *arg);
+static int mbx_write (char *line, int len, FILE *mbf);
+static int mbx_delimit_begin (FILE *mbf);
+static int mbx_delimit_end (FILE *mbf);
+#endif
/* Nonzero means this is name of a lock file to delete on fatal error. */
char *delete_lockname;
@@ -168,7 +168,7 @@ main (int argc, char **argv)
{
char *inname, *outname;
int indesc, outdesc;
- int nread;
+ ssize_t nread;
int status;
int c, preserve_mail = 0;
@@ -355,7 +355,7 @@ main (int argc, char **argv)
time_t touched_lock, now;
#endif
- if (setuid (getuid ()) < 0 || setegid (real_gid) < 0)
+ if (setuid (getuid ()) < 0 || setregid (-1, real_gid) < 0)
fatal ("Failed to drop privileges", 0, 0);
#ifndef MAIL_USE_MMDF
@@ -382,7 +382,7 @@ main (int argc, char **argv)
if (outdesc < 0)
pfatal_with_name (outname);
- if (setegid (priv_gid) < 0)
+ if (setregid (-1, priv_gid) < 0)
fatal ("Failed to regain privileges", 0, 0);
/* This label exists so we can retry locking
@@ -479,7 +479,7 @@ main (int argc, char **argv)
#endif
/* Prevent symlink attacks truncating other users' mailboxes */
- if (setegid (real_gid) < 0)
+ if (setregid (-1, real_gid) < 0)
fatal ("Failed to drop privileges", 0, 0);
/* Check to make sure no errors before we zap the inbox. */
@@ -489,7 +489,8 @@ main (int argc, char **argv)
#ifdef MAIL_USE_SYSTEM_LOCK
if (! preserve_mail)
{
- ftruncate (indesc, 0L);
+ if (ftruncate (indesc, 0L) != 0)
+ pfatal_with_name (inname);
}
#endif /* MAIL_USE_SYSTEM_LOCK */
@@ -514,7 +515,7 @@ main (int argc, char **argv)
#endif /* not MAIL_USE_SYSTEM_LOCK */
/* End of mailbox truncation */
- if (setegid (priv_gid) < 0)
+ if (setregid (-1, priv_gid) < 0)
fatal ("Failed to regain privileges", 0, 0);
#ifdef MAIL_USE_MAILLOCK
@@ -550,14 +551,13 @@ main (int argc, char **argv)
string-comparing the two paths, because one or both of them might
be symbolic links pointing to some other directory. */
static char *
-mail_spool_name (inname)
- char *inname;
+mail_spool_name (char *inname)
{
struct stat stat1, stat2;
char *indir, *fname;
int status;
- if (! (fname = rindex (inname, '/')))
+ if (! (fname = strrchr (inname, '/')))
return NULL;
fname++;
@@ -587,8 +587,8 @@ mail_spool_name (inname)
/* Print error message and exit. */
-void
-fatal (char *s1, char *s2, char *s3)
+static void
+fatal (const char *s1, const char *s2, const char *s3)
{
if (delete_lockname)
unlink (delete_lockname);
@@ -599,8 +599,8 @@ fatal (char *s1, char *s2, char *s3)
/* Print error message. `s1' is printf control string, `s2' and `s3'
are args for it or null. */
-void
-error (char *s1, char *s2, char *s3)
+static void
+error (const char *s1, const char *s2, const char *s3)
{
fprintf (stderr, "movemail: ");
if (s3)
@@ -612,13 +612,13 @@ error (char *s1, char *s2, char *s3)
fprintf (stderr, "\n");
}
-void
+static void
pfatal_with_name (char *name)
{
fatal ("%s for %s", strerror (errno), name);
}
-void
+static void
pfatal_and_delete (char *name)
{
char *s = strerror (errno);
@@ -628,10 +628,10 @@ pfatal_and_delete (char *name)
/* Return a newly-allocated string whose contents concatenate those of s1, s2, s3. */
-char *
-concat (char *s1, char *s2, char *s3)
+static char *
+concat (const char *s1, const char *s2, const char *s3)
{
- int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
+ size_t len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
strcpy (result, s1);
@@ -644,7 +644,7 @@ concat (char *s1, char *s2, char *s3)
/* Like malloc but get fatal error if memory is exhausted. */
-long *
+static long *
xmalloc (unsigned int size)
{
long *result = (long *) malloc (size);
@@ -694,7 +694,7 @@ char Errmsg[200]; /* POP errors, at least, can exceed
* Return a value suitable for passing to `exit'.
*/
-int
+static int
popmail (char *mailbox, char *outfile, int preserve, char *password, int reverse_order)
{
int nmsgs, nbytes;
@@ -707,7 +707,7 @@ popmail (char *mailbox, char *outfile, int preserve, char *password, int reverse
char *user, *hostname;
user = mailbox;
- if ((hostname = index(mailbox, ':')))
+ if ((hostname = strchr (mailbox, ':')))
*hostname++ = '\0';
server = pop_open (hostname, user, password, POP_NO_GETPASS);
@@ -820,10 +820,9 @@ popmail (char *mailbox, char *outfile, int preserve, char *password, int reverse
return EXIT_SUCCESS;
}
-int
+static int
pop_retr (popserver server, int msgno, FILE *arg)
{
- extern char *strerror (int);
char *line;
int ret;
@@ -868,7 +867,7 @@ pop_retr (popserver server, int msgno, FILE *arg)
&& (a[3] == 'm') \
&& (a[4] == ' '))
-int
+static int
mbx_write (char *line, int len, FILE *mbf)
{
#ifdef MOVEMAIL_QUOTE_POP_FROM_LINES
@@ -892,7 +891,7 @@ mbx_write (char *line, int len, FILE *mbf)
return (OK);
}
-int
+static int
mbx_delimit_begin (FILE *mbf)
{
time_t now;
@@ -909,7 +908,7 @@ mbx_delimit_begin (FILE *mbf)
return (OK);
}
-int
+static int
mbx_delimit_end (FILE *mbf)
{
if (putc ('\n', mbf) == EOF)
@@ -934,7 +933,5 @@ strerror (errnum)
#endif /* ! HAVE_STRERROR */
-/* arch-tag: 1c323112-41fe-4fe5-8de9-494de631f73f
- (do not change this comment) */
/* movemail.c ends here */