aboutsummaryrefslogtreecommitdiffstats
path: root/lib-src
diff options
context:
space:
mode:
authorRichard M. Stallman1994-01-04 06:46:12 +0000
committerRichard M. Stallman1994-01-04 06:46:12 +0000
commit8ca83cfd88ae7b0a05cddbe13d3a23155d4d716e (patch)
tree1773b3f6cae340d043045fc06e57939615185747 /lib-src
parent02e8e1677be89f4f605e4c41d56962fa18c4f83a (diff)
downloademacs-8ca83cfd88ae7b0a05cddbe13d3a23155d4d716e.tar.gz
emacs-8ca83cfd88ae7b0a05cddbe13d3a23155d4d716e.zip
Include syswait.h.
Fork a subprocess and use it to copy the mail file.
Diffstat (limited to 'lib-src')
-rw-r--r--lib-src/movemail.c112
1 files changed, 64 insertions, 48 deletions
diff --git a/lib-src/movemail.c b/lib-src/movemail.c
index 60b10b27b43..98134746e61 100644
--- a/lib-src/movemail.c
+++ b/lib-src/movemail.c
@@ -1,6 +1,6 @@
1/* movemail foo bar -- move file foo to file bar, 1/* movemail foo bar -- move file foo to file bar,
2 locking file foo the way /bin/mail respects. 2 locking file foo the way /bin/mail respects.
3 Copyright (C) 1986, 1992 Free Software Foundation, Inc. 3 Copyright (C) 1986, 1992, 1993 Free Software Foundation, Inc.
4 4
5This file is part of GNU Emacs. 5This file is part of GNU Emacs.
6 6
@@ -54,6 +54,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
54#include <errno.h> 54#include <errno.h>
55#define NO_SHORTNAMES /* Tell config not to load remap.h */ 55#define NO_SHORTNAMES /* Tell config not to load remap.h */
56#include <../src/config.h> 56#include <../src/config.h>
57#include <../src/syswait.h>
57 58
58#ifdef USG 59#ifdef USG
59#include <fcntl.h> 60#include <fcntl.h>
@@ -98,6 +99,7 @@ main (argc, argv)
98 char *inname, *outname; 99 char *inname, *outname;
99 int indesc, outdesc; 100 int indesc, outdesc;
100 int nread; 101 int nread;
102 WAITTYPE status;
101 103
102#ifndef MAIL_USE_FLOCK 104#ifndef MAIL_USE_FLOCK
103 struct stat st; 105 struct stat st;
@@ -199,9 +201,9 @@ main (argc, argv)
199 { 201 {
200 /* Create the lock file, but not under the lock file name. */ 202 /* Create the lock file, but not under the lock file name. */
201 /* Give up if cannot do that. */ 203 /* Give up if cannot do that. */
202 desc = open (tempname, O_WRONLY | O_CREAT, 0666); 204 desc = open (tempname, O_WRONLY | O_CREAT | O_EXCL, 0666);
203 if (desc < 0) 205 if (desc < 0)
204 pfatal_with_name ("lock file--see source file lib-src/movemail.c"); 206 pfatal_with_name ("lock file--see source file lib-src/movemail.c");
205 close (desc); 207 close (desc);
206 208
207 tem = link (tempname, lockname); 209 tem = link (tempname, lockname);
@@ -222,86 +224,100 @@ main (argc, argv)
222 delete_lockname = lockname; 224 delete_lockname = lockname;
223#endif /* not MAIL_USE_FLOCK */ 225#endif /* not MAIL_USE_FLOCK */
224 226
227 if (fork () == 0)
228 {
229 seteuid (getuid ());
230
225#ifdef MAIL_USE_FLOCK 231#ifdef MAIL_USE_FLOCK
226 indesc = open (inname, O_RDWR); 232 indesc = open (inname, O_RDWR);
227#else /* if not MAIL_USE_FLOCK */ 233#else /* if not MAIL_USE_FLOCK */
228 indesc = open (inname, O_RDONLY); 234 indesc = open (inname, O_RDONLY);
229#endif /* not MAIL_USE_FLOCK */ 235#endif /* not MAIL_USE_FLOCK */
230#else /* MAIL_USE_MMDF */ 236#else /* MAIL_USE_MMDF */
231 indesc = lk_open (inname, O_RDONLY, 0, 0, 10); 237 indesc = lk_open (inname, O_RDONLY, 0, 0, 10);
232#endif /* MAIL_USE_MMDF */ 238#endif /* MAIL_USE_MMDF */
233 239
234 if (indesc < 0) 240 if (indesc < 0)
235 pfatal_with_name (inname); 241 pfatal_with_name (inname);
236 242
237#if defined (BSD) || defined (XENIX) 243#if defined (BSD) || defined (XENIX)
238 /* In case movemail is setuid to root, make sure the user can 244 /* In case movemail is setuid to root, make sure the user can
239 read the output file. */ 245 read the output file. */
240 /* This is desirable for all systems 246 /* This is desirable for all systems
241 but I don't want to assume all have the umask system call */ 247 but I don't want to assume all have the umask system call */
242 umask (umask (0) & 0333); 248 umask (umask (0) & 0333);
243#endif /* BSD or Xenix */ 249#endif /* BSD or Xenix */
244 outdesc = open (outname, O_WRONLY | O_CREAT | O_EXCL, 0666); 250 outdesc = open (outname, O_WRONLY | O_CREAT | O_EXCL, 0666);
245 if (outdesc < 0) 251 if (outdesc < 0)
246 pfatal_with_name (outname); 252 pfatal_with_name (outname);
247#ifdef MAIL_USE_FLOCK 253#ifdef MAIL_USE_FLOCK
248#ifdef XENIX 254#ifdef XENIX
249 if (locking (indesc, LK_RLCK, 0L) < 0) pfatal_with_name (inname); 255 if (locking (indesc, LK_RLCK, 0L) < 0) pfatal_with_name (inname);
250#else 256#else
251 if (flock (indesc, LOCK_EX) < 0) pfatal_with_name (inname); 257 if (flock (indesc, LOCK_EX) < 0) pfatal_with_name (inname);
252#endif 258#endif
253#endif /* MAIL_USE_FLOCK */ 259#endif /* MAIL_USE_FLOCK */
254 260
255 {
256 char buf[1024];
257
258 while (1)
259 { 261 {
260 nread = read (indesc, buf, sizeof buf); 262 char buf[1024];
261 if (nread != write (outdesc, buf, nread)) 263
264 while (1)
262 { 265 {
263 int saved_errno = errno; 266 nread = read (indesc, buf, sizeof buf);
264 unlink (outname); 267 if (nread != write (outdesc, buf, nread))
265 errno = saved_errno; 268 {
266 pfatal_with_name (outname); 269 int saved_errno = errno;
270 unlink (outname);
271 errno = saved_errno;
272 pfatal_with_name (outname);
273 }
274 if (nread < sizeof buf)
275 break;
267 } 276 }
268 if (nread < sizeof buf)
269 break;
270 } 277 }
271 }
272 278
273#ifdef BSD 279#ifdef BSD
274 if (fsync (outdesc) < 0) 280 if (fsync (outdesc) < 0)
275 pfatal_and_delete (outname); 281 pfatal_and_delete (outname);
276#endif 282#endif
277 283
278 /* Check to make sure no errors before we zap the inbox. */ 284 /* Check to make sure no errors before we zap the inbox. */
279 if (close (outdesc) != 0) 285 if (close (outdesc) != 0)
280 pfatal_and_delete (outname); 286 pfatal_and_delete (outname);
281 287
282#ifdef MAIL_USE_FLOCK 288#ifdef MAIL_USE_FLOCK
283#if defined (STRIDE) || defined (XENIX) 289#if defined (STRIDE) || defined (XENIX)
284 /* Stride, xenix have file locking, but no ftruncate. This mess will do. */ 290 /* Stride, xenix have file locking, but no ftruncate. This mess will do. */
285 close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666)); 291 close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666));
286#else 292#else
287 ftruncate (indesc, 0L); 293 ftruncate (indesc, 0L);
288#endif /* STRIDE or XENIX */ 294#endif /* STRIDE or XENIX */
289#endif /* MAIL_USE_FLOCK */ 295#endif /* MAIL_USE_FLOCK */
290 296
291#ifdef MAIL_USE_MMDF 297#ifdef MAIL_USE_MMDF
292 lk_close (indesc, 0, 0, 0); 298 lk_close (indesc, 0, 0, 0);
293#else 299#else
294 close (indesc); 300 close (indesc);
295#endif 301#endif
296 302
297#ifndef MAIL_USE_FLOCK 303#ifndef MAIL_USE_FLOCK
298 /* Delete the input file; if we can't, at least get rid of its contents. */ 304 /* Delete the input file; if we can't, at least get rid of its contents. */
299#ifdef MAIL_UNLINK_SPOOL 305#ifdef MAIL_UNLINK_SPOOL
300 /* This is generally bad to do, because it destroys the permissions 306 /* This is generally bad to do, because it destroys the permissions
301 that were set on the file. Better to just empty the file. */ 307 that were set on the file. Better to just empty the file. */
302 if (unlink (inname) < 0 && errno != ENOENT) 308 if (unlink (inname) < 0 && errno != ENOENT)
303#endif /* MAIL_UNLINK_SPOOL */ 309#endif /* MAIL_UNLINK_SPOOL */
304 creat (inname, 0600); 310 creat (inname, 0600);
311
312 exit (0);
313 }
314
315 wait (&status);
316 if (!WIFEXITED (status))
317 exit (1);
318 else if (WRETCODE (status) != 0)
319 exit (WRETCODE (status));
320
305#ifndef MAIL_USE_MMDF 321#ifndef MAIL_USE_MMDF
306 unlink (lockname); 322 unlink (lockname);
307#endif /* not MAIL_USE_MMDF */ 323#endif /* not MAIL_USE_MMDF */