Mercurial > emacs
annotate lib-src/movemail.c @ 22724:6a6568360d51
(rmail): If existing buffer, use local
enable-multibyte-characters for rmail-enable-multibyte.
(rmail-revert): Bind coding-system-for-read to raw-text,
then convert and make buffer multibyte, as in `rmail'.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Thu, 09 Jul 1998 04:45:33 +0000 |
parents | 95d38cf99591 |
children | 0ba967162ee0 |
rev | line source |
---|---|
23 | 1 /* movemail foo bar -- move file foo to file bar, |
2 locking file foo the way /bin/mail respects. | |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
3 Copyright (C) 1986, 1992, 1993, 1994, 1996 Free Software Foundation, Inc. |
23 | 4 |
5 This file is part of GNU Emacs. | |
6 | |
38 | 7 GNU Emacs is free software; you can redistribute it and/or modify |
8 it under the terms of the GNU General Public License as published by | |
5524
f14a0fe979d9
(get_errmsg, pfatal_with_name, pfatal_and_delete): Call strerror instead of
Roland McGrath <roland@gnu.org>
parents:
5446
diff
changeset
|
9 the Free Software Foundation; either version 2, or (at your option) |
38 | 10 any later version. |
23 | 11 |
38 | 12 GNU Emacs is distributed in the hope that it will be useful, |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GNU Emacs; see the file COPYING. If not, write to | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
20 Boston, MA 02111-1307, USA. */ |
23 | 21 |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
22 /* Important notice: defining MAIL_USE_FLOCK or MAIL_USE_LOCKF *will |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
23 cause loss of mail* if you do it on a system that does not normally |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
24 use flock as its way of interlocking access to inbox files. The |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
25 setting of MAIL_USE_FLOCK and MAIL_USE_LOCKF *must agree* with the |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
26 system's own conventions. It is not a choice that is up to you. |
510
4eaef1578a15
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
447
diff
changeset
|
27 |
4eaef1578a15
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
447
diff
changeset
|
28 So, if your system uses lock files rather than flock, then the only way |
4eaef1578a15
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
447
diff
changeset
|
29 you can get proper operation is to enable movemail to write lockfiles there. |
4eaef1578a15
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
447
diff
changeset
|
30 This means you must either give that directory access modes |
4eaef1578a15
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
447
diff
changeset
|
31 that permit everyone to write lockfiles in it, or you must make movemail |
4eaef1578a15
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
447
diff
changeset
|
32 a setuid or setgid program. */ |
4eaef1578a15
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
447
diff
changeset
|
33 |
23 | 34 /* |
35 * Modified January, 1986 by Michael R. Gretzinger (Project Athena) | |
36 * | |
14649 | 37 * Added POP (Post Office Protocol) service. When compiled -DMAIL_USE_POP |
23 | 38 * movemail will accept input filename arguments of the form |
39 * "po:username". This will cause movemail to open a connection to | |
40 * a pop server running on $MAILHOST (environment variable). Movemail | |
41 * must be setuid to root in order to work with POP. | |
42 * | |
43 * New module: popmail.c | |
44 * Modified routines: | |
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
45 * main - added code within #ifdef MAIL_USE_POP; added setuid (getuid ()) |
23 | 46 * after POP code. |
47 * New routines in movemail.c: | |
48 * get_errmsg - return pointer to system error message | |
49 * | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
50 * Modified August, 1993 by Jonathan Kamens (OpenVision Technologies) |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
51 * |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
52 * Move all of the POP code into a separate file, "pop.c". |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
53 * Use strerror instead of get_errmsg. |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
54 * |
23 | 55 */ |
56 | |
8449
805f9284065b
Include config.h first thing.
Richard M. Stallman <rms@gnu.org>
parents:
6862
diff
changeset
|
57 #define NO_SHORTNAMES /* Tell config not to load remap.h */ |
805f9284065b
Include config.h first thing.
Richard M. Stallman <rms@gnu.org>
parents:
6862
diff
changeset
|
58 #include <../src/config.h> |
23 | 59 #include <sys/types.h> |
60 #include <sys/stat.h> | |
61 #include <sys/file.h> | |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
62 #include <stdio.h> |
23 | 63 #include <errno.h> |
5435 | 64 #include <../src/syswait.h> |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
65 #include <getopt.h> |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
66 #ifdef MAIL_USE_POP |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
67 #include "pop.h" |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
68 #endif |
23 | 69 |
5446
726a3dc867a6
(malloc): Don't declare it.
Richard M. Stallman <rms@gnu.org>
parents:
5435
diff
changeset
|
70 #ifdef MSDOS |
726a3dc867a6
(malloc): Don't declare it.
Richard M. Stallman <rms@gnu.org>
parents:
5435
diff
changeset
|
71 #undef access |
726a3dc867a6
(malloc): Don't declare it.
Richard M. Stallman <rms@gnu.org>
parents:
5435
diff
changeset
|
72 #endif /* MSDOS */ |
726a3dc867a6
(malloc): Don't declare it.
Richard M. Stallman <rms@gnu.org>
parents:
5435
diff
changeset
|
73 |
15105
328889a58f6d
(DIRECTORY_SEP, IS_DIRECTORY_SEP): Definitions copied from lisp.h.
Richard M. Stallman <rms@gnu.org>
parents:
15101
diff
changeset
|
74 #ifndef DIRECTORY_SEP |
328889a58f6d
(DIRECTORY_SEP, IS_DIRECTORY_SEP): Definitions copied from lisp.h.
Richard M. Stallman <rms@gnu.org>
parents:
15101
diff
changeset
|
75 #define DIRECTORY_SEP '/' |
328889a58f6d
(DIRECTORY_SEP, IS_DIRECTORY_SEP): Definitions copied from lisp.h.
Richard M. Stallman <rms@gnu.org>
parents:
15101
diff
changeset
|
76 #endif |
328889a58f6d
(DIRECTORY_SEP, IS_DIRECTORY_SEP): Definitions copied from lisp.h.
Richard M. Stallman <rms@gnu.org>
parents:
15101
diff
changeset
|
77 #ifndef IS_DIRECTORY_SEP |
328889a58f6d
(DIRECTORY_SEP, IS_DIRECTORY_SEP): Definitions copied from lisp.h.
Richard M. Stallman <rms@gnu.org>
parents:
15101
diff
changeset
|
78 #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP) |
328889a58f6d
(DIRECTORY_SEP, IS_DIRECTORY_SEP): Definitions copied from lisp.h.
Richard M. Stallman <rms@gnu.org>
parents:
15101
diff
changeset
|
79 #endif |
328889a58f6d
(DIRECTORY_SEP, IS_DIRECTORY_SEP): Definitions copied from lisp.h.
Richard M. Stallman <rms@gnu.org>
parents:
15101
diff
changeset
|
80 |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
81 #ifdef WINDOWSNT |
21905
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
82 #include "ntlib.h" |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
83 #undef access |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
84 #undef unlink |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
85 #define fork() 0 |
22316
95d38cf99591
(sys_wait): Rename to wait.
Andrew Innes <andrewi@gnu.org>
parents:
22235
diff
changeset
|
86 #define wait(var) (*(var) = 0) |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
87 /* Unfortunately, Samba doesn't seem to properly lock Unix files even |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
88 though the locking call succeeds (and indeed blocks local access from |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
89 other NT programs). If you have direct file access using an NFS |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
90 client or something other than Samba, the locking call might work |
21905
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
91 properly - make sure it does before you enable this! |
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
92 |
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
93 [18-Feb-97 andrewi] I now believe my comment above to be incorrect, |
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
94 since it was based on a misunderstanding of how locking calls are |
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
95 implemented and used on Unix. */ |
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
96 //#define DISABLE_DIRECT_ACCESS |
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
97 |
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
98 /* Ensure all file i/o is in binary mode. */ |
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
99 #include <fcntl.h> |
b1e64615e700
[WINDOWSNT]: Undefine DISABLE_DIRECT_ACCESS. Force
Richard M. Stallman <rms@gnu.org>
parents:
21396
diff
changeset
|
100 int _fmode = _O_BINARY; |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
101 #endif /* WINDOWSNT */ |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
102 |
21390
5ade0c90128e
Move cancelations up. Include <stdlib.h> if
Andreas Schwab <schwab@suse.de>
parents:
20760
diff
changeset
|
103 /* Cancel substitutions made by config.h for Emacs. */ |
5ade0c90128e
Move cancelations up. Include <stdlib.h> if
Andreas Schwab <schwab@suse.de>
parents:
20760
diff
changeset
|
104 #undef open |
5ade0c90128e
Move cancelations up. Include <stdlib.h> if
Andreas Schwab <schwab@suse.de>
parents:
20760
diff
changeset
|
105 #undef read |
5ade0c90128e
Move cancelations up. Include <stdlib.h> if
Andreas Schwab <schwab@suse.de>
parents:
20760
diff
changeset
|
106 #undef write |
5ade0c90128e
Move cancelations up. Include <stdlib.h> if
Andreas Schwab <schwab@suse.de>
parents:
20760
diff
changeset
|
107 #undef close |
5ade0c90128e
Move cancelations up. Include <stdlib.h> if
Andreas Schwab <schwab@suse.de>
parents:
20760
diff
changeset
|
108 |
23 | 109 #ifdef USG |
110 #include <fcntl.h> | |
111 #include <unistd.h> | |
27 | 112 #ifndef F_OK |
113 #define F_OK 0 | |
114 #define X_OK 1 | |
115 #define W_OK 2 | |
116 #define R_OK 4 | |
117 #endif | |
23 | 118 #endif /* USG */ |
119 | |
6862
653504b6b5dd
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
6813
diff
changeset
|
120 #ifdef HAVE_UNISTD_H |
653504b6b5dd
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
6813
diff
changeset
|
121 #include <unistd.h> |
653504b6b5dd
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
6813
diff
changeset
|
122 #endif |
653504b6b5dd
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
6813
diff
changeset
|
123 |
21390
5ade0c90128e
Move cancelations up. Include <stdlib.h> if
Andreas Schwab <schwab@suse.de>
parents:
20760
diff
changeset
|
124 #ifdef STDC_HEADERS |
5ade0c90128e
Move cancelations up. Include <stdlib.h> if
Andreas Schwab <schwab@suse.de>
parents:
20760
diff
changeset
|
125 #include <stdlib.h> |
5ade0c90128e
Move cancelations up. Include <stdlib.h> if
Andreas Schwab <schwab@suse.de>
parents:
20760
diff
changeset
|
126 #endif |
5ade0c90128e
Move cancelations up. Include <stdlib.h> if
Andreas Schwab <schwab@suse.de>
parents:
20760
diff
changeset
|
127 |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
128 #if defined (XENIX) || defined (WINDOWSNT) |
23 | 129 #include <sys/locking.h> |
130 #endif | |
131 | |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
132 #ifdef MAIL_USE_LOCKF |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
133 #define MAIL_USE_SYSTEM_LOCK |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
134 #endif |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
135 |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
136 #ifdef MAIL_USE_FLOCK |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
137 #define MAIL_USE_SYSTEM_LOCK |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
138 #endif |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
139 |
25 | 140 #ifdef MAIL_USE_MMDF |
141 extern int lk_open (), lk_close (); | |
142 #endif | |
143 | |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
144 #if !defined (MAIL_USE_SYSTEM_LOCK) && !defined (MAIL_USE_MMDF) && \ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
145 defined (HAVE_LIBMAIL) && defined (HAVE_MAILLOCK_H) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
146 #include <maillock.h> |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
147 /* We can't use maillock unless we know what directory system mail |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
148 files appear in. */ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
149 #ifdef MAILDIR |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
150 #define MAIL_USE_MAILLOCK |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
151 static char *mail_spool_name (); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
152 #endif |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
153 #endif |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
154 |
571 | 155 #ifndef errno |
23 | 156 extern int errno; |
571 | 157 #endif |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
158 char *strerror (); |
18626
d3d968d0773a
(rindex): Add declaration.
Richard M. Stallman <rms@gnu.org>
parents:
17069
diff
changeset
|
159 extern char *rindex (); |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
160 |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
161 void fatal (); |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
162 void error (); |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
163 void pfatal_with_name (); |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
164 void pfatal_and_delete (); |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
165 char *concat (); |
11675
496576df5d46
(xmalloc): Declare it to return long *.
Richard M. Stallman <rms@gnu.org>
parents:
10399
diff
changeset
|
166 long *xmalloc (); |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
167 int popmail (); |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
168 int pop_retr (); |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
169 int mbx_write (); |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
170 int mbx_delimit_begin (); |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
171 int mbx_delimit_end (); |
23 | 172 |
173 /* Nonzero means this is name of a lock file to delete on fatal error. */ | |
174 char *delete_lockname; | |
175 | |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
176 int |
23 | 177 main (argc, argv) |
178 int argc; | |
179 char **argv; | |
180 { | |
181 char *inname, *outname; | |
182 int indesc, outdesc; | |
183 int nread; | |
5435 | 184 WAITTYPE status; |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
185 int c, preserve_mail = 0; |
23 | 186 |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
187 #ifndef MAIL_USE_SYSTEM_LOCK |
23 | 188 struct stat st; |
189 long now; | |
190 int tem; | |
191 char *lockname, *p; | |
601
3db1540d4b97
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
580
diff
changeset
|
192 char *tempname; |
23 | 193 int desc; |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
194 #endif /* not MAIL_USE_SYSTEM_LOCK */ |
23 | 195 |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
196 #ifdef MAIL_USE_MAILLOCK |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
197 char *spool_name; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
198 #endif |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
199 |
23 | 200 delete_lockname = 0; |
201 | |
22235
ee90e9da3a70
Undo this previous change:
Richard M. Stallman <rms@gnu.org>
parents:
21905
diff
changeset
|
202 while ((c = getopt (argc, argv, "p")) != EOF) |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
203 { |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
204 switch (c) { |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
205 case 'p': |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
206 preserve_mail++; |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
207 break; |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
208 default: |
22235
ee90e9da3a70
Undo this previous change:
Richard M. Stallman <rms@gnu.org>
parents:
21905
diff
changeset
|
209 exit(1); |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
210 } |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
211 } |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
212 |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
213 if ( |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
214 #ifdef MAIL_USE_POP |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
215 (argc - optind < 2) || (argc - optind > 3) |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
216 #else |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
217 (argc - optind != 2) |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
218 #endif |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
219 ) |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
220 { |
22235
ee90e9da3a70
Undo this previous change:
Richard M. Stallman <rms@gnu.org>
parents:
21905
diff
changeset
|
221 fprintf (stderr, "Usage: movemail [-p] inbox destfile%s\n", |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
222 #ifdef MAIL_USE_POP |
22235
ee90e9da3a70
Undo this previous change:
Richard M. Stallman <rms@gnu.org>
parents:
21905
diff
changeset
|
223 " [POP-password]" |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
224 #else |
22235
ee90e9da3a70
Undo this previous change:
Richard M. Stallman <rms@gnu.org>
parents:
21905
diff
changeset
|
225 "" |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
226 #endif |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
227 ); |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
228 exit (1); |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
229 } |
23 | 230 |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
231 inname = argv[optind]; |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
232 outname = argv[optind+1]; |
23 | 233 |
25 | 234 #ifdef MAIL_USE_MMDF |
235 mmdf_init (argv[0]); | |
236 #endif | |
237 | |
12793
0464324deda7
(main): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
12777
diff
changeset
|
238 if (*outname == 0) |
0464324deda7
(main): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
12777
diff
changeset
|
239 fatal ("Destination file name is empty", 0); |
0464324deda7
(main): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
12777
diff
changeset
|
240 |
120 | 241 /* Check access to output file. */ |
23 | 242 if (access (outname, F_OK) == 0 && access (outname, W_OK) != 0) |
243 pfatal_with_name (outname); | |
244 | |
14036 | 245 /* Also check that outname's directory is writable to the real uid. */ |
23 | 246 { |
5446
726a3dc867a6
(malloc): Don't declare it.
Richard M. Stallman <rms@gnu.org>
parents:
5435
diff
changeset
|
247 char *buf = (char *) xmalloc (strlen (outname) + 1); |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
248 char *p; |
23 | 249 strcpy (buf, outname); |
250 p = buf + strlen (buf); | |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
251 while (p > buf && !IS_DIRECTORY_SEP (p[-1])) |
23 | 252 *--p = 0; |
253 if (p == buf) | |
254 *p++ = '.'; | |
255 if (access (buf, W_OK) != 0) | |
256 pfatal_with_name (buf); | |
257 free (buf); | |
258 } | |
259 | |
260 #ifdef MAIL_USE_POP | |
3309
f00054d40753
* movemail.c [MAIL_USE_POP] (main): Don't use non-portable
Jim Blandy <jimb@redhat.com>
parents:
733
diff
changeset
|
261 if (!strncmp (inname, "po:", 3)) |
23 | 262 { |
12442
981986d7d82f
(main) [MAIL_USE_POP]: When a user specifies a
Richard M. Stallman <rms@gnu.org>
parents:
12389
diff
changeset
|
263 int status; |
23 | 264 |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
265 status = popmail (inname + 3, outname, preserve_mail, |
22235
ee90e9da3a70
Undo this previous change:
Richard M. Stallman <rms@gnu.org>
parents:
21905
diff
changeset
|
266 (argc - optind == 3) ? argv[optind+2] : NULL); |
23 | 267 exit (status); |
268 } | |
269 | |
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
270 setuid (getuid ()); |
23 | 271 #endif /* MAIL_USE_POP */ |
272 | |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
273 #ifndef DISABLE_DIRECT_ACCESS |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
274 |
120 | 275 /* Check access to input file. */ |
276 if (access (inname, R_OK | W_OK) != 0) | |
277 pfatal_with_name (inname); | |
278 | |
25 | 279 #ifndef MAIL_USE_MMDF |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
280 #ifndef MAIL_USE_SYSTEM_LOCK |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
281 #ifdef MAIL_USE_MAILLOCK |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
282 spool_name = mail_spool_name (inname); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
283 if (! spool_name) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
284 #endif |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
285 { |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
286 /* Use a lock file named after our first argument with .lock appended: |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
287 If it exists, the mail file is locked. */ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
288 /* Note: this locking mechanism is *required* by the mailer |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
289 (on systems which use it) to prevent loss of mail. |
351
5729b1cc3942
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
127
diff
changeset
|
290 |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
291 On systems that use a lock file, extracting the mail without locking |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
292 WILL occasionally cause loss of mail due to timing errors! |
351
5729b1cc3942
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
127
diff
changeset
|
293 |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
294 So, if creation of the lock file fails |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
295 due to access permission on the mail spool directory, |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
296 you simply MUST change the permission |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
297 and/or make movemail a setgid program |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
298 so it can create lock files properly. |
351
5729b1cc3942
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
127
diff
changeset
|
299 |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
300 You might also wish to verify that your system is one |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
301 which uses lock files for this purpose. Some systems use other methods. |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
302 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
303 If your system uses the `flock' system call for mail locking, |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
304 define MAIL_USE_SYSTEM_LOCK in config.h or the s-*.h file |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
305 and recompile movemail. If the s- file for your system |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
306 should define MAIL_USE_SYSTEM_LOCK but does not, send a bug report |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
307 to bug-gnu-emacs@prep.ai.mit.edu so we can fix it. */ |
23 | 308 |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
309 lockname = concat (inname, ".lock", ""); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
310 tempname = (char *) xmalloc (strlen (inname) + strlen ("EXXXXXX") + 1); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
311 strcpy (tempname, inname); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
312 p = tempname + strlen (tempname); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
313 while (p != tempname && !IS_DIRECTORY_SEP (p[-1])) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
314 p--; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
315 *p = 0; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
316 strcpy (p, "EXXXXXX"); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
317 mktemp (tempname); |
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
318 unlink (tempname); |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
319 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
320 while (1) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
321 { |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
322 /* Create the lock file, but not under the lock file name. */ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
323 /* Give up if cannot do that. */ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
324 desc = open (tempname, O_WRONLY | O_CREAT | O_EXCL, 0666); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
325 if (desc < 0) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
326 { |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
327 char *message = (char *) xmalloc (strlen (tempname) + 50); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
328 sprintf (message, "%s--see source file lib-src/movemail.c", |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
329 tempname); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
330 pfatal_with_name (message); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
331 } |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
332 close (desc); |
23 | 333 |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
334 tem = link (tempname, lockname); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
335 unlink (tempname); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
336 if (tem >= 0) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
337 break; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
338 sleep (1); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
339 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
340 /* If lock file is five minutes old, unlock it. |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
341 Five minutes should be good enough to cope with crashes |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
342 and wedgitude, and long enough to avoid being fooled |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
343 by time differences between machines. */ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
344 if (stat (lockname, &st) >= 0) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
345 { |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
346 now = time (0); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
347 if (st.st_ctime < now - 300) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
348 unlink (lockname); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
349 } |
23 | 350 } |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
351 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
352 delete_lockname = lockname; |
23 | 353 } |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
354 #endif /* not MAIL_USE_SYSTEM_LOCK */ |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
355 #endif /* not MAIL_USE_MMDF */ |
23 | 356 |
5435 | 357 if (fork () == 0) |
358 { | |
16366
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
359 int lockcount = 0; |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
360 int status = 0; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
361 #if defined (MAIL_USE_MAILLOCK) && defined (HAVE_TOUCHLOCK) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
362 long touched_lock, now; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
363 #endif |
16366
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
364 |
6813
76f93e487956
(main): Use setuid, not seteuid.
Karl Heuer <kwzh@gnu.org>
parents:
6690
diff
changeset
|
365 setuid (getuid ()); |
5435 | 366 |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
367 #ifndef MAIL_USE_MMDF |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
368 #ifdef MAIL_USE_SYSTEM_LOCK |
5435 | 369 indesc = open (inname, O_RDWR); |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
370 #else /* if not MAIL_USE_SYSTEM_LOCK */ |
5435 | 371 indesc = open (inname, O_RDONLY); |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
372 #endif /* not MAIL_USE_SYSTEM_LOCK */ |
5435 | 373 #else /* MAIL_USE_MMDF */ |
374 indesc = lk_open (inname, O_RDONLY, 0, 0, 10); | |
25 | 375 #endif /* MAIL_USE_MMDF */ |
376 | |
5435 | 377 if (indesc < 0) |
378 pfatal_with_name (inname); | |
23 | 379 |
16218
32f82ca8b41f
Replaced all BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
15105
diff
changeset
|
380 #if defined (BSD_SYSTEM) || defined (XENIX) |
5435 | 381 /* In case movemail is setuid to root, make sure the user can |
382 read the output file. */ | |
383 /* This is desirable for all systems | |
384 but I don't want to assume all have the umask system call */ | |
385 umask (umask (0) & 0333); | |
16218
32f82ca8b41f
Replaced all BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
15105
diff
changeset
|
386 #endif /* BSD_SYSTEM || XENIX */ |
5435 | 387 outdesc = open (outname, O_WRONLY | O_CREAT | O_EXCL, 0666); |
388 if (outdesc < 0) | |
389 pfatal_with_name (outname); | |
16366
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
390 |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
391 /* This label exists so we can retry locking |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
392 after a delay, if it got EAGAIN or EBUSY. */ |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
393 retry_lock: |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
394 |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
395 /* Try to lock it. */ |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
396 #ifdef MAIL_USE_MAILLOCK |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
397 if (spool_name) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
398 { |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
399 /* The "0 - " is to make it a negative number if maillock returns |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
400 non-zero. */ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
401 status = 0 - maillock (spool_name, 1); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
402 #ifdef HAVE_TOUCHLOCK |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
403 touched_lock = time (0); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
404 #endif |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
405 lockcount = 5; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
406 } |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
407 else |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
408 #endif /* MAIL_USE_MAILLOCK */ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
409 { |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
410 #ifdef MAIL_USE_SYSTEM_LOCK |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
411 #ifdef MAIL_USE_LOCKF |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
412 status = lockf (indesc, F_LOCK, 0); |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
413 #else /* not MAIL_USE_LOCKF */ |
23 | 414 #ifdef XENIX |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
415 status = locking (indesc, LK_RLCK, 0L); |
23 | 416 #else |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
417 #ifdef WINDOWSNT |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
418 status = locking (indesc, LK_RLCK, -1L); |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
419 #else |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
420 status = flock (indesc, LOCK_EX); |
23 | 421 #endif |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
422 #endif |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
423 #endif /* not MAIL_USE_LOCKF */ |
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
424 #endif /* MAIL_USE_SYSTEM_LOCK */ |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
425 } |
23 | 426 |
16366
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
427 /* If it fails, retry up to 5 times |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
428 for certain failure codes. */ |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
429 if (status < 0) |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
430 { |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
431 if (++lockcount <= 5) |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
432 { |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
433 #ifdef EAGAIN |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
434 if (errno == EAGAIN) |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
435 { |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
436 sleep (1); |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
437 goto retry_lock; |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
438 } |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
439 #endif |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
440 #ifdef EBUSY |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
441 if (errno == EBUSY) |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
442 { |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
443 sleep (1); |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
444 goto retry_lock; |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
445 } |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
446 #endif |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
447 } |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
448 |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
449 pfatal_with_name (inname); |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
450 } |
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
451 |
5435 | 452 { |
453 char buf[1024]; | |
604 | 454 |
5435 | 455 while (1) |
604 | 456 { |
5435 | 457 nread = read (indesc, buf, sizeof buf); |
458 if (nread != write (outdesc, buf, nread)) | |
459 { | |
460 int saved_errno = errno; | |
461 unlink (outname); | |
462 errno = saved_errno; | |
463 pfatal_with_name (outname); | |
464 } | |
465 if (nread < sizeof buf) | |
466 break; | |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
467 #if defined (MAIL_USE_MAILLOCK) && defined (HAVE_TOUCHLOCK) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
468 if (spool_name) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
469 { |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
470 now = time (0); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
471 if (now - touched_lock > 60) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
472 { |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
473 touchlock (); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
474 touched_lock = now; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
475 } |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
476 } |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
477 #endif /* MAIL_USE_MAILLOCK */ |
604 | 478 } |
479 } | |
23 | 480 |
16218
32f82ca8b41f
Replaced all BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
15105
diff
changeset
|
481 #ifdef BSD_SYSTEM |
5435 | 482 if (fsync (outdesc) < 0) |
483 pfatal_and_delete (outname); | |
23 | 484 #endif |
485 | |
5435 | 486 /* Check to make sure no errors before we zap the inbox. */ |
487 if (close (outdesc) != 0) | |
488 pfatal_and_delete (outname); | |
23 | 489 |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
490 #ifdef MAIL_USE_SYSTEM_LOCK |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
491 if (! preserve_mail) |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
492 { |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
493 #if defined (STRIDE) || defined (XENIX) || defined (WINDOWSNT) |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
494 /* Stride, xenix have file locking, but no ftruncate. |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
495 This mess will do. */ |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
496 close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666)); |
23 | 497 #else |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
498 ftruncate (indesc, 0L); |
20760
4f1f4b226cb0
(main): Fix interwoven brace and cpp conditional nesting.
Andreas Schwab <schwab@suse.de>
parents:
20418
diff
changeset
|
499 #endif /* STRIDE or XENIX */ |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
500 } |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
501 #endif /* MAIL_USE_SYSTEM_LOCK */ |
25 | 502 |
503 #ifdef MAIL_USE_MMDF | |
5435 | 504 lk_close (indesc, 0, 0, 0); |
25 | 505 #else |
5435 | 506 close (indesc); |
25 | 507 #endif |
23 | 508 |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
509 #ifndef MAIL_USE_SYSTEM_LOCK |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
510 if (! preserve_mail) |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
511 { |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
512 /* Delete the input file; if we can't, at least get rid of its |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
513 contents. */ |
571 | 514 #ifdef MAIL_UNLINK_SPOOL |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
515 /* This is generally bad to do, because it destroys the permissions |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
516 that were set on the file. Better to just empty the file. */ |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
517 if (unlink (inname) < 0 && errno != ENOENT) |
571 | 518 #endif /* MAIL_UNLINK_SPOOL */ |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
519 creat (inname, 0600); |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
520 } |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
521 #endif /* not MAIL_USE_SYSTEM_LOCK */ |
5435 | 522 |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
523 #ifdef MAIL_USE_MAILLOCK |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
524 /* This has to occur in the child, i.e., in the process that |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
525 acquired the lock! */ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
526 if (spool_name) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
527 mailunlock (); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
528 #endif |
5435 | 529 exit (0); |
530 } | |
531 | |
532 wait (&status); | |
533 if (!WIFEXITED (status)) | |
534 exit (1); | |
535 else if (WRETCODE (status) != 0) | |
536 exit (WRETCODE (status)); | |
537 | |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
538 #if !defined (MAIL_USE_MMDF) && !defined (MAIL_USE_SYSTEM_LOCK) |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
539 #ifdef MAIL_USE_MAILLOCK |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
540 if (! spool_name) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
541 #endif /* MAIL_USE_MAILLOCK */ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
542 unlink (lockname); |
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
543 #endif /* not MAIL_USE_MMDF and not MAIL_USE_SYSTEM_LOCK */ |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
544 |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
545 #endif /* ! DISABLE_DIRECT_ACCESS */ |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
546 |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
547 return 0; |
23 | 548 } |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
549 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
550 #ifdef MAIL_USE_MAILLOCK |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
551 /* This function uses stat to confirm that the mail directory is |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
552 identical to the directory of the input file, rather than just |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
553 string-comparing the two paths, because one or both of them might |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
554 be symbolic links pointing to some other directory. */ |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
555 static char * |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
556 mail_spool_name (inname) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
557 char *inname; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
558 { |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
559 struct stat stat1, stat2; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
560 char *indir, *fname; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
561 int status; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
562 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
563 if (! (fname = rindex (inname, '/'))) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
564 return NULL; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
565 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
566 fname++; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
567 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
568 if (stat (MAILDIR, &stat1) < 0) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
569 return NULL; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
570 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
571 indir = (char *) xmalloc (fname - inname + 1); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
572 strncpy (indir, inname, fname - inname); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
573 indir[fname-inname] = '\0'; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
574 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
575 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
576 status = stat (indir, &stat2); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
577 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
578 free (indir); |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
579 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
580 if (status < 0) |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
581 return NULL; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
582 |
18626
d3d968d0773a
(rindex): Add declaration.
Richard M. Stallman <rms@gnu.org>
parents:
17069
diff
changeset
|
583 if (stat1.st_dev == stat2.st_dev |
d3d968d0773a
(rindex): Add declaration.
Richard M. Stallman <rms@gnu.org>
parents:
17069
diff
changeset
|
584 && stat1.st_ino == stat2.st_ino) |
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
585 return fname; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
586 |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
587 return NULL; |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
588 } |
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
589 #endif /* MAIL_USE_MAILLOCK */ |
23 | 590 |
591 /* Print error message and exit. */ | |
592 | |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
593 void |
23 | 594 fatal (s1, s2) |
595 char *s1, *s2; | |
596 { | |
597 if (delete_lockname) | |
598 unlink (delete_lockname); | |
599 error (s1, s2); | |
600 exit (1); | |
601 } | |
602 | |
603 /* Print error message. `s1' is printf control string, `s2' is arg for it. */ | |
604 | |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
605 void |
120 | 606 error (s1, s2, s3) |
607 char *s1, *s2, *s3; | |
23 | 608 { |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
609 fprintf (stderr, "movemail: "); |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
610 fprintf (stderr, s1, s2, s3); |
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
611 fprintf (stderr, "\n"); |
23 | 612 } |
613 | |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
614 void |
23 | 615 pfatal_with_name (name) |
616 char *name; | |
617 { | |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
618 char *s = concat ("", strerror (errno), " for %s"); |
23 | 619 fatal (s, name); |
620 } | |
621 | |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
622 void |
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
623 pfatal_and_delete (name) |
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
624 char *name; |
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
625 { |
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
626 char *s = concat ("", strerror (errno), " for %s"); |
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
627 unlink (name); |
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
628 fatal (s, name); |
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
629 } |
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
630 |
23 | 631 /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3. */ |
632 | |
633 char * | |
634 concat (s1, s2, s3) | |
635 char *s1, *s2, *s3; | |
636 { | |
637 int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3); | |
638 char *result = (char *) xmalloc (len1 + len2 + len3 + 1); | |
639 | |
640 strcpy (result, s1); | |
641 strcpy (result + len1, s2); | |
642 strcpy (result + len1 + len2, s3); | |
643 *(result + len1 + len2 + len3) = 0; | |
644 | |
645 return result; | |
646 } | |
647 | |
648 /* Like malloc but get fatal error if memory is exhausted. */ | |
649 | |
11675
496576df5d46
(xmalloc): Declare it to return long *.
Richard M. Stallman <rms@gnu.org>
parents:
10399
diff
changeset
|
650 long * |
23 | 651 xmalloc (size) |
571 | 652 unsigned size; |
23 | 653 { |
11675
496576df5d46
(xmalloc): Declare it to return long *.
Richard M. Stallman <rms@gnu.org>
parents:
10399
diff
changeset
|
654 long *result = (long *) malloc (size); |
23 | 655 if (!result) |
656 fatal ("virtual memory exhausted", 0); | |
657 return result; | |
658 } | |
659 | |
660 /* This is the guts of the interface to the Post Office Protocol. */ | |
661 | |
662 #ifdef MAIL_USE_POP | |
663 | |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
664 #ifndef WINDOWSNT |
23 | 665 #include <sys/socket.h> |
666 #include <netinet/in.h> | |
667 #include <netdb.h> | |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
668 #else |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
669 #undef _WINSOCKAPI_ |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
670 #include <winsock.h> |
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
671 #endif |
634
52d0ff659265
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
604
diff
changeset
|
672 #include <pwd.h> |
23 | 673 |
674 #define NOTOK (-1) | |
675 #define OK 0 | |
676 #define DONE 1 | |
677 | |
678 char *progname; | |
679 FILE *sfi; | |
680 FILE *sfo; | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
681 char ibuffer[BUFSIZ]; |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
682 char obuffer[BUFSIZ]; |
23 | 683 char Errmsg[80]; |
684 | |
22235
ee90e9da3a70
Undo this previous change:
Richard M. Stallman <rms@gnu.org>
parents:
21905
diff
changeset
|
685 popmail (user, outfile, preserve, password) |
120 | 686 char *user; |
687 char *outfile; | |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
688 int preserve; |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
689 char *password; |
23 | 690 { |
120 | 691 int nmsgs, nbytes; |
692 register int i; | |
693 int mbfi; | |
694 FILE *mbf; | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
695 char *getenv (); |
9630
5410efcb7b6e
PopServer renamed to popserver throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9612
diff
changeset
|
696 popserver server; |
23 | 697 |
22235
ee90e9da3a70
Undo this previous change:
Richard M. Stallman <rms@gnu.org>
parents:
21905
diff
changeset
|
698 server = pop_open (0, user, password, POP_NO_GETPASS); |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
699 if (! server) |
120 | 700 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
701 error (pop_error); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
702 return (1); |
23 | 703 } |
704 | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
705 if (pop_stat (server, &nmsgs, &nbytes)) |
120 | 706 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
707 error (pop_error); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
708 return (1); |
120 | 709 } |
23 | 710 |
120 | 711 if (!nmsgs) |
712 { | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
713 pop_close (server); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
714 return (0); |
23 | 715 } |
716 | |
120 | 717 mbfi = open (outfile, O_WRONLY | O_CREAT | O_EXCL, 0666); |
718 if (mbfi < 0) | |
719 { | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
720 pop_close (server); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
721 error ("Error in open: %s, %s", strerror (errno), outfile); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
722 return (1); |
120 | 723 } |
724 fchown (mbfi, getuid (), -1); | |
725 | |
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
726 if ((mbf = fdopen (mbfi, "wb")) == NULL) |
120 | 727 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
728 pop_close (server); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
729 error ("Error in fdopen: %s", strerror (errno)); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
730 close (mbfi); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
731 unlink (outfile); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
732 return (1); |
120 | 733 } |
734 | |
735 for (i = 1; i <= nmsgs; i++) | |
736 { | |
737 mbx_delimit_begin (mbf); | |
17069
0b2b8a0f7570
(popmail): Remove some unnecessary function
Karl Heuer <kwzh@gnu.org>
parents:
16994
diff
changeset
|
738 if (pop_retr (server, i, mbf) != OK) |
120 | 739 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
740 error (Errmsg); |
120 | 741 close (mbfi); |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
742 return (1); |
120 | 743 } |
744 mbx_delimit_end (mbf); | |
745 fflush (mbf); | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
746 if (ferror (mbf)) |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
747 { |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
748 error ("Error in fflush: %s", strerror (errno)); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
749 pop_close (server); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
750 close (mbfi); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
751 return (1); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
752 } |
120 | 753 } |
754 | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
755 /* On AFS, a call to write only modifies the file in the local |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
756 * workstation's AFS cache. The changes are not written to the server |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
757 * until a call to fsync or close is made. Users with AFS home |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
758 * directories have lost mail when over quota because these checks were |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
759 * not made in previous versions of movemail. */ |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
760 |
16218
32f82ca8b41f
Replaced all BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
15105
diff
changeset
|
761 #ifdef BSD_SYSTEM |
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
762 if (fsync (mbfi) < 0) |
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
763 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
764 error ("Error in fsync: %s", strerror (errno)); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
765 return (1); |
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
766 } |
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
9490
diff
changeset
|
767 #endif |
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
768 |
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
769 if (close (mbfi) == -1) |
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
770 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
771 error ("Error in close: %s", strerror (errno)); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
772 return (1); |
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
773 } |
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
774 |
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
775 if (! preserve) |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
776 for (i = 1; i <= nmsgs; i++) |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
777 { |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
778 if (pop_delete (server, i)) |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
779 { |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
780 error (pop_error); |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
781 pop_close (server); |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
782 return (1); |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
783 } |
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
784 } |
23 | 785 |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
786 if (pop_quit (server)) |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
787 { |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
788 error (pop_error); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
789 return (1); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
790 } |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
791 |
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
792 return (0); |
23 | 793 } |
794 | |
17069
0b2b8a0f7570
(popmail): Remove some unnecessary function
Karl Heuer <kwzh@gnu.org>
parents:
16994
diff
changeset
|
795 int |
0b2b8a0f7570
(popmail): Remove some unnecessary function
Karl Heuer <kwzh@gnu.org>
parents:
16994
diff
changeset
|
796 pop_retr (server, msgno, arg) |
9630
5410efcb7b6e
PopServer renamed to popserver throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9612
diff
changeset
|
797 popserver server; |
17069
0b2b8a0f7570
(popmail): Remove some unnecessary function
Karl Heuer <kwzh@gnu.org>
parents:
16994
diff
changeset
|
798 FILE *arg; |
23 | 799 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
800 extern char *strerror (); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
801 char *line; |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
802 int ret; |
23 | 803 |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
804 if (pop_retrieve_first (server, msgno, &line)) |
120 | 805 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
806 strncpy (Errmsg, pop_error, sizeof (Errmsg)); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
807 Errmsg[sizeof (Errmsg)-1] = '\0'; |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
808 return (NOTOK); |
23 | 809 } |
810 | |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20387
diff
changeset
|
811 while ((ret = pop_retrieve_next (server, &line)) >= 0) |
120 | 812 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
813 if (! line) |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
814 break; |
23 | 815 |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20387
diff
changeset
|
816 if (mbx_write (line, ret, arg) != OK) |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
817 { |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
818 strcpy (Errmsg, strerror (errno)); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
819 pop_close (server); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
820 return (NOTOK); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
821 } |
23 | 822 } |
823 | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
824 if (ret) |
120 | 825 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
826 strncpy (Errmsg, pop_error, sizeof (Errmsg)); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
827 Errmsg[sizeof (Errmsg)-1] = '\0'; |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
828 return (NOTOK); |
23 | 829 } |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
830 |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
831 return (OK); |
23 | 832 } |
833 | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
834 /* Do this as a macro instead of using strcmp to save on execution time. */ |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
835 #define IS_FROM_LINE(a) ((a[0] == 'F') \ |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
836 && (a[1] == 'r') \ |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
837 && (a[2] == 'o') \ |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
838 && (a[3] == 'm') \ |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
839 && (a[4] == ' ')) |
23 | 840 |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
841 int |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20387
diff
changeset
|
842 mbx_write (line, len, mbf) |
120 | 843 char *line; |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20387
diff
changeset
|
844 int len; |
120 | 845 FILE *mbf; |
23 | 846 { |
20387
4c524f5214ce
(mbx_write) [MAIL_USE_POP]: Disable the code which quotes with a
Paul Eggert <eggert@twinsun.com>
parents:
18626
diff
changeset
|
847 #ifdef MOVEMAIL_QUOTE_POP_FROM_LINES |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
848 if (IS_FROM_LINE (line)) |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
849 { |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
850 if (fputc ('>', mbf) == EOF) |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
851 return (NOTOK); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
852 } |
20387
4c524f5214ce
(mbx_write) [MAIL_USE_POP]: Disable the code which quotes with a
Paul Eggert <eggert@twinsun.com>
parents:
18626
diff
changeset
|
853 #endif |
4c524f5214ce
(mbx_write) [MAIL_USE_POP]: Disable the code which quotes with a
Paul Eggert <eggert@twinsun.com>
parents:
18626
diff
changeset
|
854 if (line[0] == '\037') |
4c524f5214ce
(mbx_write) [MAIL_USE_POP]: Disable the code which quotes with a
Paul Eggert <eggert@twinsun.com>
parents:
18626
diff
changeset
|
855 { |
4c524f5214ce
(mbx_write) [MAIL_USE_POP]: Disable the code which quotes with a
Paul Eggert <eggert@twinsun.com>
parents:
18626
diff
changeset
|
856 if (fputs ("^_", mbf) == EOF) |
4c524f5214ce
(mbx_write) [MAIL_USE_POP]: Disable the code which quotes with a
Paul Eggert <eggert@twinsun.com>
parents:
18626
diff
changeset
|
857 return (NOTOK); |
4c524f5214ce
(mbx_write) [MAIL_USE_POP]: Disable the code which quotes with a
Paul Eggert <eggert@twinsun.com>
parents:
18626
diff
changeset
|
858 line++; |
4c524f5214ce
(mbx_write) [MAIL_USE_POP]: Disable the code which quotes with a
Paul Eggert <eggert@twinsun.com>
parents:
18626
diff
changeset
|
859 len--; |
4c524f5214ce
(mbx_write) [MAIL_USE_POP]: Disable the code which quotes with a
Paul Eggert <eggert@twinsun.com>
parents:
18626
diff
changeset
|
860 } |
20418
7e1538a45702
Allow messages retrieved from the POP
Karl Heuer <kwzh@gnu.org>
parents:
20387
diff
changeset
|
861 if (fwrite (line, 1, len, mbf) != len) |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
862 return (NOTOK); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
863 if (fputc (0x0a, mbf) == EOF) |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
864 return (NOTOK); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
865 return (OK); |
23 | 866 } |
867 | |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
868 int |
120 | 869 mbx_delimit_begin (mbf) |
870 FILE *mbf; | |
23 | 871 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
872 if (fputs ("\f\n0, unseen,,\n", mbf) == EOF) |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
873 return (NOTOK); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
874 return (OK); |
23 | 875 } |
876 | |
120 | 877 mbx_delimit_end (mbf) |
878 FILE *mbf; | |
23 | 879 { |
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
880 if (putc ('\037', mbf) == EOF) |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
881 return (NOTOK); |
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
882 return (OK); |
23 | 883 } |
884 | |
885 #endif /* MAIL_USE_POP */ | |
5532
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
886 |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
887 #ifndef HAVE_STRERROR |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
888 char * |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
889 strerror (errnum) |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
890 int errnum; |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
891 { |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
892 extern char *sys_errlist[]; |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
893 extern int sys_nerr; |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
894 |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
895 if (errnum >= 0 && errnum < sys_nerr) |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
896 return sys_errlist[errnum]; |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
897 return (char *) "Unknown error"; |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
898 } |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
899 |
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
900 #endif /* ! HAVE_STRERROR */ |