# HG changeset patch # User Richard M. Stallman # Date 757665972 0 # Node ID d7408b99b88f8a4bac983f9d8ea5588a669d7b04 # Parent c89fd1fbf06850e5ee5b026a11d0d088135e927c Include syswait.h. Fork a subprocess and use it to copy the mail file. diff -r c89fd1fbf068 -r d7408b99b88f lib-src/movemail.c --- a/lib-src/movemail.c Tue Jan 04 06:41:18 1994 +0000 +++ b/lib-src/movemail.c Tue Jan 04 06:46:12 1994 +0000 @@ -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 Free Software Foundation, Inc. + Copyright (C) 1986, 1992, 1993 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -54,6 +54,7 @@ #include #define NO_SHORTNAMES /* Tell config not to load remap.h */ #include <../src/config.h> +#include <../src/syswait.h> #ifdef USG #include @@ -98,6 +99,7 @@ char *inname, *outname; int indesc, outdesc; int nread; + WAITTYPE status; #ifndef MAIL_USE_FLOCK struct stat st; @@ -199,9 +201,9 @@ { /* Create the lock file, but not under the lock file name. */ /* Give up if cannot do that. */ - desc = open (tempname, O_WRONLY | O_CREAT, 0666); + desc = open (tempname, O_WRONLY | O_CREAT | O_EXCL, 0666); if (desc < 0) - pfatal_with_name ("lock file--see source file lib-src/movemail.c"); + pfatal_with_name ("lock file--see source file lib-src/movemail.c"); close (desc); tem = link (tempname, lockname); @@ -222,86 +224,100 @@ delete_lockname = lockname; #endif /* not MAIL_USE_FLOCK */ + if (fork () == 0) + { + seteuid (getuid ()); + #ifdef MAIL_USE_FLOCK - indesc = open (inname, O_RDWR); -#else /* if not MAIL_USE_FLOCK */ - indesc = open (inname, O_RDONLY); + indesc = open (inname, O_RDWR); +#else /* if not MAIL_USE_FLOCK */ + indesc = open (inname, O_RDONLY); #endif /* not MAIL_USE_FLOCK */ -#else /* MAIL_USE_MMDF */ - indesc = lk_open (inname, O_RDONLY, 0, 0, 10); +#else /* MAIL_USE_MMDF */ + indesc = lk_open (inname, O_RDONLY, 0, 0, 10); #endif /* MAIL_USE_MMDF */ - if (indesc < 0) - pfatal_with_name (inname); + if (indesc < 0) + pfatal_with_name (inname); #if defined (BSD) || defined (XENIX) - /* In case movemail is setuid to root, make sure the user can - read the output file. */ - /* This is desirable for all systems - but I don't want to assume all have the umask system call */ - umask (umask (0) & 0333); + /* In case movemail is setuid to root, make sure the user can + read the output file. */ + /* This is desirable for all systems + but I don't want to assume all have the umask system call */ + umask (umask (0) & 0333); #endif /* BSD or Xenix */ - outdesc = open (outname, O_WRONLY | O_CREAT | O_EXCL, 0666); - if (outdesc < 0) - pfatal_with_name (outname); + outdesc = open (outname, O_WRONLY | O_CREAT | O_EXCL, 0666); + if (outdesc < 0) + pfatal_with_name (outname); #ifdef MAIL_USE_FLOCK #ifdef XENIX - if (locking (indesc, LK_RLCK, 0L) < 0) pfatal_with_name (inname); + if (locking (indesc, LK_RLCK, 0L) < 0) pfatal_with_name (inname); #else - if (flock (indesc, LOCK_EX) < 0) pfatal_with_name (inname); + if (flock (indesc, LOCK_EX) < 0) pfatal_with_name (inname); #endif #endif /* MAIL_USE_FLOCK */ - { - char buf[1024]; + { + char buf[1024]; - while (1) - { - nread = read (indesc, buf, sizeof buf); - if (nread != write (outdesc, buf, nread)) + while (1) { - int saved_errno = errno; - unlink (outname); - errno = saved_errno; - pfatal_with_name (outname); + nread = read (indesc, buf, sizeof buf); + if (nread != write (outdesc, buf, nread)) + { + int saved_errno = errno; + unlink (outname); + errno = saved_errno; + pfatal_with_name (outname); + } + if (nread < sizeof buf) + break; } - if (nread < sizeof buf) - break; } - } #ifdef BSD - if (fsync (outdesc) < 0) - pfatal_and_delete (outname); + if (fsync (outdesc) < 0) + pfatal_and_delete (outname); #endif - /* Check to make sure no errors before we zap the inbox. */ - if (close (outdesc) != 0) - pfatal_and_delete (outname); + /* Check to make sure no errors before we zap the inbox. */ + if (close (outdesc) != 0) + pfatal_and_delete (outname); #ifdef MAIL_USE_FLOCK #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)); + /* Stride, xenix have file locking, but no ftruncate. This mess will do. */ + close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666)); #else - ftruncate (indesc, 0L); + ftruncate (indesc, 0L); #endif /* STRIDE or XENIX */ #endif /* MAIL_USE_FLOCK */ #ifdef MAIL_USE_MMDF - lk_close (indesc, 0, 0, 0); + lk_close (indesc, 0, 0, 0); #else - close (indesc); + close (indesc); #endif #ifndef MAIL_USE_FLOCK - /* Delete the input file; if we can't, at least get rid of its contents. */ + /* Delete the input file; if we can't, at least get rid of its contents. */ #ifdef MAIL_UNLINK_SPOOL - /* This is generally bad to do, because it destroys the permissions - that were set on the file. Better to just empty the file. */ - if (unlink (inname) < 0 && errno != ENOENT) + /* This is generally bad to do, because it destroys the permissions + that were set on the file. Better to just empty the file. */ + if (unlink (inname) < 0 && errno != ENOENT) #endif /* MAIL_UNLINK_SPOOL */ - creat (inname, 0600); + creat (inname, 0600); + + exit (0); + } + + wait (&status); + if (!WIFEXITED (status)) + exit (1); + else if (WRETCODE (status) != 0) + exit (WRETCODE (status)); + #ifndef MAIL_USE_MMDF unlink (lockname); #endif /* not MAIL_USE_MMDF */