Mercurial > emacs
annotate lib-src/movemail.c @ 18626:d3d968d0773a
(rindex): Add declaration.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Sat, 05 Jul 1997 03:19:16 +0000 |
| parents | 0b2b8a0f7570 |
| children | 4c524f5214ce |
| 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 |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
82 #undef access |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
83 #undef unlink |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
84 #define fork() 0 |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
85 #define sys_wait(var) (*(var) = 0) |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
86 /* 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
|
87 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
|
88 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
|
89 client or something other than Samba, the locking call might work |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
90 properly - make sure it does before you enable this! */ |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
91 #define DISABLE_DIRECT_ACCESS |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
92 #endif /* WINDOWSNT */ |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
93 |
| 23 | 94 #ifdef USG |
| 95 #include <fcntl.h> | |
| 96 #include <unistd.h> | |
| 27 | 97 #ifndef F_OK |
| 98 #define F_OK 0 | |
| 99 #define X_OK 1 | |
| 100 #define W_OK 2 | |
| 101 #define R_OK 4 | |
| 102 #endif | |
| 23 | 103 #endif /* USG */ |
| 104 | |
|
6862
653504b6b5dd
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
6813
diff
changeset
|
105 #ifdef HAVE_UNISTD_H |
|
653504b6b5dd
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
6813
diff
changeset
|
106 #include <unistd.h> |
|
653504b6b5dd
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
6813
diff
changeset
|
107 #endif |
|
653504b6b5dd
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
6813
diff
changeset
|
108 |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
109 #if defined (XENIX) || defined (WINDOWSNT) |
| 23 | 110 #include <sys/locking.h> |
| 111 #endif | |
| 112 | |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
113 #ifdef MAIL_USE_LOCKF |
|
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
114 #define MAIL_USE_SYSTEM_LOCK |
|
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
115 #endif |
|
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
116 |
|
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
117 #ifdef MAIL_USE_FLOCK |
|
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
118 #define MAIL_USE_SYSTEM_LOCK |
|
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
119 #endif |
|
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
120 |
| 25 | 121 #ifdef MAIL_USE_MMDF |
| 122 extern int lk_open (), lk_close (); | |
| 123 #endif | |
| 124 | |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
125 #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
|
126 defined (HAVE_LIBMAIL) && defined (HAVE_MAILLOCK_H) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
127 #include <maillock.h> |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
128 /* 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
|
129 files appear in. */ |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
130 #ifdef MAILDIR |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
131 #define MAIL_USE_MAILLOCK |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
132 static char *mail_spool_name (); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
133 #endif |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
134 #endif |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
135 |
| 23 | 136 /* Cancel substitutions made by config.h for Emacs. */ |
| 137 #undef open | |
| 138 #undef read | |
| 139 #undef write | |
| 140 #undef close | |
| 141 | |
| 571 | 142 #ifndef errno |
| 23 | 143 extern int errno; |
| 571 | 144 #endif |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
145 char *strerror (); |
|
18626
d3d968d0773a
(rindex): Add declaration.
Richard M. Stallman <rms@gnu.org>
parents:
17069
diff
changeset
|
146 extern char *rindex (); |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
147 |
|
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
148 void fatal (); |
|
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
149 void error (); |
|
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
150 void pfatal_with_name (); |
|
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
151 void pfatal_and_delete (); |
|
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
152 char *concat (); |
|
11675
496576df5d46
(xmalloc): Declare it to return long *.
Richard M. Stallman <rms@gnu.org>
parents:
10399
diff
changeset
|
153 long *xmalloc (); |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
154 int popmail (); |
|
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
155 int pop_retr (); |
|
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
156 int mbx_write (); |
|
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
157 int mbx_delimit_begin (); |
|
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
158 int mbx_delimit_end (); |
| 23 | 159 |
| 160 /* Nonzero means this is name of a lock file to delete on fatal error. */ | |
| 161 char *delete_lockname; | |
| 162 | |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
163 int |
| 23 | 164 main (argc, argv) |
| 165 int argc; | |
| 166 char **argv; | |
| 167 { | |
| 168 char *inname, *outname; | |
| 169 int indesc, outdesc; | |
| 170 int nread; | |
| 5435 | 171 WAITTYPE status; |
|
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
172 int c, preserve_mail = 0; |
| 23 | 173 |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
174 #ifndef MAIL_USE_SYSTEM_LOCK |
| 23 | 175 struct stat st; |
| 176 long now; | |
| 177 int tem; | |
| 178 char *lockname, *p; | |
|
601
3db1540d4b97
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
580
diff
changeset
|
179 char *tempname; |
| 23 | 180 int desc; |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
181 #endif /* not MAIL_USE_SYSTEM_LOCK */ |
| 23 | 182 |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
183 #ifdef MAIL_USE_MAILLOCK |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
184 char *spool_name; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
185 #endif |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
186 |
| 23 | 187 delete_lockname = 0; |
| 188 | |
|
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
189 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
|
190 { |
|
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
191 switch (c) { |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
192 case 'p': |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
193 preserve_mail++; |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
194 break; |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
195 default: |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
196 exit(1); |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
197 } |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
198 } |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
199 |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
200 if ( |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
201 #ifdef MAIL_USE_POP |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
202 (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
|
203 #else |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
204 (argc - optind != 2) |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
205 #endif |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
206 ) |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
207 { |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
208 fprintf (stderr, "Usage: movemail [-p] inbox destfile%s\n", |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
209 #ifdef MAIL_USE_POP |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
210 " [POP-password]" |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
211 #else |
|
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 #endif |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
214 ); |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
215 exit (1); |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
216 } |
| 23 | 217 |
|
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
218 inname = argv[optind]; |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
219 outname = argv[optind+1]; |
| 23 | 220 |
| 25 | 221 #ifdef MAIL_USE_MMDF |
| 222 mmdf_init (argv[0]); | |
| 223 #endif | |
| 224 | |
|
12793
0464324deda7
(main): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
12777
diff
changeset
|
225 if (*outname == 0) |
|
0464324deda7
(main): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
12777
diff
changeset
|
226 fatal ("Destination file name is empty", 0); |
|
0464324deda7
(main): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
12777
diff
changeset
|
227 |
| 120 | 228 /* Check access to output file. */ |
| 23 | 229 if (access (outname, F_OK) == 0 && access (outname, W_OK) != 0) |
| 230 pfatal_with_name (outname); | |
| 231 | |
| 14036 | 232 /* Also check that outname's directory is writable to the real uid. */ |
| 23 | 233 { |
|
5446
726a3dc867a6
(malloc): Don't declare it.
Richard M. Stallman <rms@gnu.org>
parents:
5435
diff
changeset
|
234 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
|
235 char *p; |
| 23 | 236 strcpy (buf, outname); |
| 237 p = buf + strlen (buf); | |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
238 while (p > buf && !IS_DIRECTORY_SEP (p[-1])) |
| 23 | 239 *--p = 0; |
| 240 if (p == buf) | |
| 241 *p++ = '.'; | |
| 242 if (access (buf, W_OK) != 0) | |
| 243 pfatal_with_name (buf); | |
| 244 free (buf); | |
| 245 } | |
| 246 | |
| 247 #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
|
248 if (!strncmp (inname, "po:", 3)) |
| 23 | 249 { |
|
12442
981986d7d82f
(main) [MAIL_USE_POP]: When a user specifies a
Richard M. Stallman <rms@gnu.org>
parents:
12389
diff
changeset
|
250 int status; |
| 23 | 251 |
|
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
252 status = popmail (inname + 3, outname, preserve_mail, |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
253 (argc - optind == 3) ? argv[optind+2] : NULL); |
| 23 | 254 exit (status); |
| 255 } | |
| 256 | |
|
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
257 setuid (getuid ()); |
| 23 | 258 #endif /* MAIL_USE_POP */ |
| 259 | |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
260 #ifndef DISABLE_DIRECT_ACCESS |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
261 |
| 120 | 262 /* Check access to input file. */ |
| 263 if (access (inname, R_OK | W_OK) != 0) | |
| 264 pfatal_with_name (inname); | |
| 265 | |
| 25 | 266 #ifndef MAIL_USE_MMDF |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
267 #ifndef MAIL_USE_SYSTEM_LOCK |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
268 #ifdef MAIL_USE_MAILLOCK |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
269 spool_name = mail_spool_name (inname); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
270 if (! spool_name) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
271 #endif |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
272 { |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
273 /* 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
|
274 If it exists, the mail file is locked. */ |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
275 /* Note: this locking mechanism is *required* by the mailer |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
276 (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
|
277 |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
278 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
|
279 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
|
280 |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
281 So, if creation of the lock file fails |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
282 due to access permission on the mail spool directory, |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
283 you simply MUST change the permission |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
284 and/or make movemail a setgid program |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
285 so it can create lock files properly. |
|
351
5729b1cc3942
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
127
diff
changeset
|
286 |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
287 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
|
288 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
|
289 |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
290 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
|
291 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
|
292 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
|
293 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
|
294 to bug-gnu-emacs@prep.ai.mit.edu so we can fix it. */ |
| 23 | 295 |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
296 lockname = concat (inname, ".lock", ""); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
297 tempname = (char *) xmalloc (strlen (inname) + strlen ("EXXXXXX") + 1); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
298 strcpy (tempname, inname); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
299 p = tempname + strlen (tempname); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
300 while (p != tempname && !IS_DIRECTORY_SEP (p[-1])) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
301 p--; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
302 *p = 0; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
303 strcpy (p, "EXXXXXX"); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
304 mktemp (tempname); |
|
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
305 unlink (tempname); |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
306 |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
307 while (1) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
308 { |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
309 /* 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
|
310 /* Give up if cannot do that. */ |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
311 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
|
312 if (desc < 0) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
313 { |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
314 char *message = (char *) xmalloc (strlen (tempname) + 50); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
315 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
|
316 tempname); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
317 pfatal_with_name (message); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
318 } |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
319 close (desc); |
| 23 | 320 |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
321 tem = link (tempname, lockname); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
322 unlink (tempname); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
323 if (tem >= 0) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
324 break; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
325 sleep (1); |
|
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 /* If lock file is five minutes old, unlock it. |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
328 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
|
329 and wedgitude, and long enough to avoid being fooled |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
330 by time differences between machines. */ |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
331 if (stat (lockname, &st) >= 0) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
332 { |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
333 now = time (0); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
334 if (st.st_ctime < now - 300) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
335 unlink (lockname); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
336 } |
| 23 | 337 } |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
338 |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
339 delete_lockname = lockname; |
| 23 | 340 } |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
341 #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
|
342 #endif /* not MAIL_USE_MMDF */ |
| 23 | 343 |
| 5435 | 344 if (fork () == 0) |
| 345 { | |
|
16366
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
346 int lockcount = 0; |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
347 int status = 0; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
348 #if defined (MAIL_USE_MAILLOCK) && defined (HAVE_TOUCHLOCK) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
349 long touched_lock, now; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
350 #endif |
|
16366
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
351 |
|
6813
76f93e487956
(main): Use setuid, not seteuid.
Karl Heuer <kwzh@gnu.org>
parents:
6690
diff
changeset
|
352 setuid (getuid ()); |
| 5435 | 353 |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
354 #ifndef MAIL_USE_MMDF |
|
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
355 #ifdef MAIL_USE_SYSTEM_LOCK |
| 5435 | 356 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
|
357 #else /* if not MAIL_USE_SYSTEM_LOCK */ |
| 5435 | 358 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
|
359 #endif /* not MAIL_USE_SYSTEM_LOCK */ |
| 5435 | 360 #else /* MAIL_USE_MMDF */ |
| 361 indesc = lk_open (inname, O_RDONLY, 0, 0, 10); | |
| 25 | 362 #endif /* MAIL_USE_MMDF */ |
| 363 | |
| 5435 | 364 if (indesc < 0) |
| 365 pfatal_with_name (inname); | |
| 23 | 366 |
|
16218
32f82ca8b41f
Replaced all BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
15105
diff
changeset
|
367 #if defined (BSD_SYSTEM) || defined (XENIX) |
| 5435 | 368 /* In case movemail is setuid to root, make sure the user can |
| 369 read the output file. */ | |
| 370 /* This is desirable for all systems | |
| 371 but I don't want to assume all have the umask system call */ | |
| 372 umask (umask (0) & 0333); | |
|
16218
32f82ca8b41f
Replaced all BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
15105
diff
changeset
|
373 #endif /* BSD_SYSTEM || XENIX */ |
| 5435 | 374 outdesc = open (outname, O_WRONLY | O_CREAT | O_EXCL, 0666); |
| 375 if (outdesc < 0) | |
| 376 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
|
377 |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
378 /* 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
|
379 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
|
380 retry_lock: |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
381 |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
382 /* Try to lock it. */ |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
383 #ifdef MAIL_USE_MAILLOCK |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
384 if (spool_name) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
385 { |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
386 /* 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
|
387 non-zero. */ |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
388 status = 0 - maillock (spool_name, 1); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
389 #ifdef HAVE_TOUCHLOCK |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
390 touched_lock = time (0); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
391 #endif |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
392 lockcount = 5; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
393 } |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
394 else |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
395 #endif /* MAIL_USE_MAILLOCK */ |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
396 { |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
397 #ifdef MAIL_USE_SYSTEM_LOCK |
|
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
398 #ifdef MAIL_USE_LOCKF |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
399 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
|
400 #else /* not MAIL_USE_LOCKF */ |
| 23 | 401 #ifdef XENIX |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
402 status = locking (indesc, LK_RLCK, 0L); |
| 23 | 403 #else |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
404 #ifdef WINDOWSNT |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
405 status = locking (indesc, LK_RLCK, -1L); |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
406 #else |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
407 status = flock (indesc, LOCK_EX); |
| 23 | 408 #endif |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
409 #endif |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
410 #endif /* not MAIL_USE_LOCKF */ |
|
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
411 #endif /* MAIL_USE_SYSTEM_LOCK */ |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
412 } |
| 23 | 413 |
|
16366
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
414 /* 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
|
415 for certain failure codes. */ |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
416 if (status < 0) |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
417 { |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
418 if (++lockcount <= 5) |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
419 { |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
420 #ifdef EAGAIN |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
421 if (errno == EAGAIN) |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
422 { |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
423 sleep (1); |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
424 goto retry_lock; |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
425 } |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
426 #endif |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
427 #ifdef EBUSY |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
428 if (errno == EBUSY) |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
429 { |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
430 sleep (1); |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
431 goto retry_lock; |
|
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 #endif |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
434 } |
|
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 pfatal_with_name (inname); |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
437 } |
|
ed13d19dbce5
(main): If the lock call fails with EBUSY or
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
438 |
| 5435 | 439 { |
| 440 char buf[1024]; | |
| 604 | 441 |
| 5435 | 442 while (1) |
| 604 | 443 { |
| 5435 | 444 nread = read (indesc, buf, sizeof buf); |
| 445 if (nread != write (outdesc, buf, nread)) | |
| 446 { | |
| 447 int saved_errno = errno; | |
| 448 unlink (outname); | |
| 449 errno = saved_errno; | |
| 450 pfatal_with_name (outname); | |
| 451 } | |
| 452 if (nread < sizeof buf) | |
| 453 break; | |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
454 #if defined (MAIL_USE_MAILLOCK) && defined (HAVE_TOUCHLOCK) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
455 if (spool_name) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
456 { |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
457 now = time (0); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
458 if (now - touched_lock > 60) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
459 { |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
460 touchlock (); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
461 touched_lock = now; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
462 } |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
463 } |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
464 #endif /* MAIL_USE_MAILLOCK */ |
| 604 | 465 } |
| 466 } | |
| 23 | 467 |
|
16218
32f82ca8b41f
Replaced all BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
15105
diff
changeset
|
468 #ifdef BSD_SYSTEM |
| 5435 | 469 if (fsync (outdesc) < 0) |
| 470 pfatal_and_delete (outname); | |
| 23 | 471 #endif |
| 472 | |
| 5435 | 473 /* Check to make sure no errors before we zap the inbox. */ |
| 474 if (close (outdesc) != 0) | |
| 475 pfatal_and_delete (outname); | |
| 23 | 476 |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
477 #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
|
478 if (! preserve_mail) |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
479 { |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
480 #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
|
481 /* 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
|
482 This mess will do. */ |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
483 close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666)); |
| 23 | 484 #else |
|
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
485 ftruncate (indesc, 0L); |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
486 } |
| 23 | 487 #endif /* STRIDE or XENIX */ |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
488 #endif /* MAIL_USE_SYSTEM_LOCK */ |
| 25 | 489 |
| 490 #ifdef MAIL_USE_MMDF | |
| 5435 | 491 lk_close (indesc, 0, 0, 0); |
| 25 | 492 #else |
| 5435 | 493 close (indesc); |
| 25 | 494 #endif |
| 23 | 495 |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
496 #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
|
497 if (! preserve_mail) |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
498 { |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
499 /* 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
|
500 contents. */ |
| 571 | 501 #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
|
502 /* 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
|
503 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
|
504 if (unlink (inname) < 0 && errno != ENOENT) |
| 571 | 505 #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
|
506 creat (inname, 0600); |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
507 } |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
508 #endif /* not MAIL_USE_SYSTEM_LOCK */ |
| 5435 | 509 |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
510 #ifdef MAIL_USE_MAILLOCK |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
511 /* 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
|
512 acquired the lock! */ |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
513 if (spool_name) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
514 mailunlock (); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
515 #endif |
| 5435 | 516 exit (0); |
| 517 } | |
| 518 | |
| 519 wait (&status); | |
| 520 if (!WIFEXITED (status)) | |
| 521 exit (1); | |
| 522 else if (WRETCODE (status) != 0) | |
| 523 exit (WRETCODE (status)); | |
| 524 | |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
525 #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
|
526 #ifdef MAIL_USE_MAILLOCK |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
527 if (! spool_name) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
528 #endif /* MAIL_USE_MAILLOCK */ |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
529 unlink (lockname); |
|
6690
a1a42eefcc61
(main): Fix up MAIL_USE_MMDF conditional where
Richard M. Stallman <rms@gnu.org>
parents:
5532
diff
changeset
|
530 #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
|
531 |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
532 #endif /* ! DISABLE_DIRECT_ACCESS */ |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
533 |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
534 return 0; |
| 23 | 535 } |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
536 |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
537 #ifdef MAIL_USE_MAILLOCK |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
538 /* 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
|
539 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
|
540 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
|
541 be symbolic links pointing to some other directory. */ |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
542 static char * |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
543 mail_spool_name (inname) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
544 char *inname; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
545 { |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
546 struct stat stat1, stat2; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
547 char *indir, *fname; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
548 int status; |
|
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 if (! (fname = rindex (inname, '/'))) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
551 return NULL; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
552 |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
553 fname++; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
554 |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
555 if (stat (MAILDIR, &stat1) < 0) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
556 return NULL; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
557 |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
558 indir = (char *) xmalloc (fname - inname + 1); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
559 strncpy (indir, inname, fname - inname); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
560 indir[fname-inname] = '\0'; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
561 |
|
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 status = stat (indir, &stat2); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
564 |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
565 free (indir); |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
566 |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
567 if (status < 0) |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
568 return NULL; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
569 |
|
18626
d3d968d0773a
(rindex): Add declaration.
Richard M. Stallman <rms@gnu.org>
parents:
17069
diff
changeset
|
570 if (stat1.st_dev == stat2.st_dev |
|
d3d968d0773a
(rindex): Add declaration.
Richard M. Stallman <rms@gnu.org>
parents:
17069
diff
changeset
|
571 && stat1.st_ino == stat2.st_ino) |
|
16897
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
572 return fname; |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
573 |
|
523d5c54a3f5
Include maillock.h (conditionally).
Richard M. Stallman <rms@gnu.org>
parents:
16366
diff
changeset
|
574 return NULL; |
|
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 #endif /* MAIL_USE_MAILLOCK */ |
| 23 | 577 |
| 578 /* Print error message and exit. */ | |
| 579 | |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
580 void |
| 23 | 581 fatal (s1, s2) |
| 582 char *s1, *s2; | |
| 583 { | |
| 584 if (delete_lockname) | |
| 585 unlink (delete_lockname); | |
| 586 error (s1, s2); | |
| 587 exit (1); | |
| 588 } | |
| 589 | |
| 590 /* Print error message. `s1' is printf control string, `s2' is arg for it. */ | |
| 591 | |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
592 void |
| 120 | 593 error (s1, s2, s3) |
| 594 char *s1, *s2, *s3; | |
| 23 | 595 { |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
596 fprintf (stderr, "movemail: "); |
|
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
597 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
|
598 fprintf (stderr, "\n"); |
| 23 | 599 } |
| 600 | |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
601 void |
| 23 | 602 pfatal_with_name (name) |
| 603 char *name; | |
| 604 { | |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
605 char *s = concat ("", strerror (errno), " for %s"); |
| 23 | 606 fatal (s, name); |
| 607 } | |
| 608 | |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
609 void |
|
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
610 pfatal_and_delete (name) |
|
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
611 char *name; |
|
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
612 { |
|
9490
4e70299f958d
Make functions that return nothing void, not implicitly int.
David J. MacKenzie <djm@gnu.org>
parents:
9157
diff
changeset
|
613 char *s = concat ("", strerror (errno), " for %s"); |
|
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
614 unlink (name); |
|
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
615 fatal (s, name); |
|
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
616 } |
|
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
617 |
| 23 | 618 /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3. */ |
| 619 | |
| 620 char * | |
| 621 concat (s1, s2, s3) | |
| 622 char *s1, *s2, *s3; | |
| 623 { | |
| 624 int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3); | |
| 625 char *result = (char *) xmalloc (len1 + len2 + len3 + 1); | |
| 626 | |
| 627 strcpy (result, s1); | |
| 628 strcpy (result + len1, s2); | |
| 629 strcpy (result + len1 + len2, s3); | |
| 630 *(result + len1 + len2 + len3) = 0; | |
| 631 | |
| 632 return result; | |
| 633 } | |
| 634 | |
| 635 /* Like malloc but get fatal error if memory is exhausted. */ | |
| 636 | |
|
11675
496576df5d46
(xmalloc): Declare it to return long *.
Richard M. Stallman <rms@gnu.org>
parents:
10399
diff
changeset
|
637 long * |
| 23 | 638 xmalloc (size) |
| 571 | 639 unsigned size; |
| 23 | 640 { |
|
11675
496576df5d46
(xmalloc): Declare it to return long *.
Richard M. Stallman <rms@gnu.org>
parents:
10399
diff
changeset
|
641 long *result = (long *) malloc (size); |
| 23 | 642 if (!result) |
| 643 fatal ("virtual memory exhausted", 0); | |
| 644 return result; | |
| 645 } | |
| 646 | |
| 647 /* This is the guts of the interface to the Post Office Protocol. */ | |
| 648 | |
| 649 #ifdef MAIL_USE_POP | |
| 650 | |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
651 #ifndef WINDOWSNT |
| 23 | 652 #include <sys/socket.h> |
| 653 #include <netinet/in.h> | |
| 654 #include <netdb.h> | |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
655 #else |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
656 #undef _WINSOCKAPI_ |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
657 #include <winsock.h> |
|
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
658 #endif |
|
634
52d0ff659265
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
604
diff
changeset
|
659 #include <pwd.h> |
| 23 | 660 |
| 661 #define NOTOK (-1) | |
| 662 #define OK 0 | |
| 663 #define DONE 1 | |
| 664 | |
| 665 char *progname; | |
| 666 FILE *sfi; | |
| 667 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
|
668 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
|
669 char obuffer[BUFSIZ]; |
| 23 | 670 char Errmsg[80]; |
| 671 | |
|
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
672 popmail (user, outfile, preserve, password) |
| 120 | 673 char *user; |
| 674 char *outfile; | |
|
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
675 int preserve; |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
676 char *password; |
| 23 | 677 { |
| 120 | 678 int nmsgs, nbytes; |
| 679 register int i; | |
| 680 int mbfi; | |
| 681 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
|
682 char *getenv (); |
|
9630
5410efcb7b6e
PopServer renamed to popserver throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9612
diff
changeset
|
683 popserver server; |
| 23 | 684 |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
685 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
|
686 if (! server) |
| 120 | 687 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
688 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
|
689 return (1); |
| 23 | 690 } |
| 691 | |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
692 if (pop_stat (server, &nmsgs, &nbytes)) |
| 120 | 693 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
694 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
|
695 return (1); |
| 120 | 696 } |
| 23 | 697 |
| 120 | 698 if (!nmsgs) |
| 699 { | |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
700 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
|
701 return (0); |
| 23 | 702 } |
| 703 | |
| 120 | 704 mbfi = open (outfile, O_WRONLY | O_CREAT | O_EXCL, 0666); |
| 705 if (mbfi < 0) | |
| 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 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
|
708 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
|
709 return (1); |
| 120 | 710 } |
| 711 fchown (mbfi, getuid (), -1); | |
| 712 | |
|
15101
f86169152e74
(access, unlink) [WINDOWSNT]: Macros undefined.
Richard M. Stallman <rms@gnu.org>
parents:
14649
diff
changeset
|
713 if ((mbf = fdopen (mbfi, "wb")) == NULL) |
| 120 | 714 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
715 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
|
716 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
|
717 close (mbfi); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
718 unlink (outfile); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
719 return (1); |
| 120 | 720 } |
| 721 | |
| 722 for (i = 1; i <= nmsgs; i++) | |
| 723 { | |
| 724 mbx_delimit_begin (mbf); | |
|
17069
0b2b8a0f7570
(popmail): Remove some unnecessary function
Karl Heuer <kwzh@gnu.org>
parents:
16994
diff
changeset
|
725 if (pop_retr (server, i, mbf) != OK) |
| 120 | 726 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
727 error (Errmsg); |
| 120 | 728 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
|
729 return (1); |
| 120 | 730 } |
| 731 mbx_delimit_end (mbf); | |
| 732 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
|
733 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
|
734 { |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
735 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
|
736 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
|
737 close (mbfi); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
738 return (1); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
739 } |
| 120 | 740 } |
| 741 | |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
742 /* 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
|
743 * 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
|
744 * 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
|
745 * 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
|
746 * 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
|
747 |
|
16218
32f82ca8b41f
Replaced all BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
15105
diff
changeset
|
748 #ifdef BSD_SYSTEM |
|
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
749 if (fsync (mbfi) < 0) |
|
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
750 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
751 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
|
752 return (1); |
|
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
753 } |
|
9491
dd3b83e4ceb0
Eliminate some -Wall warnings.
David J. MacKenzie <djm@gnu.org>
parents:
9490
diff
changeset
|
754 #endif |
|
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
755 |
|
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
756 if (close (mbfi) == -1) |
|
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
757 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
758 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
|
759 return (1); |
|
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
760 } |
|
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
761 |
|
16909
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
762 if (! preserve) |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
763 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
|
764 { |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
765 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
|
766 { |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
767 error (pop_error); |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
768 pop_close (server); |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
769 return (1); |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
770 } |
|
d878e23bbfa6
(main): Do not display "[POP-password]" in the usage
Richard M. Stallman <rms@gnu.org>
parents:
16897
diff
changeset
|
771 } |
| 23 | 772 |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
773 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
|
774 { |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
775 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
|
776 return (1); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
777 } |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
778 |
|
447
2e226dcdaf0f
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
351
diff
changeset
|
779 return (0); |
| 23 | 780 } |
| 781 | |
|
17069
0b2b8a0f7570
(popmail): Remove some unnecessary function
Karl Heuer <kwzh@gnu.org>
parents:
16994
diff
changeset
|
782 int |
|
0b2b8a0f7570
(popmail): Remove some unnecessary function
Karl Heuer <kwzh@gnu.org>
parents:
16994
diff
changeset
|
783 pop_retr (server, msgno, arg) |
|
9630
5410efcb7b6e
PopServer renamed to popserver throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9612
diff
changeset
|
784 popserver server; |
|
17069
0b2b8a0f7570
(popmail): Remove some unnecessary function
Karl Heuer <kwzh@gnu.org>
parents:
16994
diff
changeset
|
785 FILE *arg; |
| 23 | 786 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
787 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
|
788 char *line; |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
789 int ret; |
| 23 | 790 |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
791 if (pop_retrieve_first (server, msgno, &line)) |
| 120 | 792 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
793 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
|
794 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
|
795 return (NOTOK); |
| 23 | 796 } |
| 797 | |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
798 while (! (ret = pop_retrieve_next (server, &line))) |
| 120 | 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 if (! line) |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
801 break; |
| 23 | 802 |
|
17069
0b2b8a0f7570
(popmail): Remove some unnecessary function
Karl Heuer <kwzh@gnu.org>
parents:
16994
diff
changeset
|
803 if (mbx_write (line, 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
|
804 { |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
805 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
|
806 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
|
807 return (NOTOK); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
808 } |
| 23 | 809 } |
| 810 | |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
811 if (ret) |
| 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 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
|
814 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
|
815 return (NOTOK); |
| 23 | 816 } |
|
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 return (OK); |
| 23 | 819 } |
| 820 | |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
821 /* 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
|
822 #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
|
823 && (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
|
824 && (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
|
825 && (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
|
826 && (a[4] == ' ')) |
| 23 | 827 |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
828 int |
| 120 | 829 mbx_write (line, mbf) |
| 830 char *line; | |
| 831 FILE *mbf; | |
| 23 | 832 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
833 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
|
834 { |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
835 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
|
836 return (NOTOK); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
837 } |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
838 if (fputs (line, mbf) == EOF) |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
839 return (NOTOK); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
840 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
|
841 return (NOTOK); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
842 return (OK); |
| 23 | 843 } |
| 844 | |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
845 int |
| 120 | 846 mbx_delimit_begin (mbf) |
| 847 FILE *mbf; | |
| 23 | 848 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
849 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
|
850 return (NOTOK); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
851 return (OK); |
| 23 | 852 } |
| 853 | |
| 120 | 854 mbx_delimit_end (mbf) |
| 855 FILE *mbf; | |
| 23 | 856 { |
|
9157
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
857 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
|
858 return (NOTOK); |
|
29f4cce05fa5
Improve POP code, move most of it into a separate file.
Richard M. Stallman <rms@gnu.org>
parents:
8449
diff
changeset
|
859 return (OK); |
| 23 | 860 } |
| 861 | |
| 862 #endif /* MAIL_USE_POP */ | |
|
5532
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
863 |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
864 #ifndef HAVE_STRERROR |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
865 char * |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
866 strerror (errnum) |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
867 int errnum; |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
868 { |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
869 extern char *sys_errlist[]; |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
870 extern int sys_nerr; |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
871 |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
872 if (errnum >= 0 && errnum < sys_nerr) |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
873 return sys_errlist[errnum]; |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
874 return (char *) "Unknown error"; |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
875 } |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
876 |
|
9c86c71e879d
[! HAVE_STRERROR] (strerror): Define the function.
Roland McGrath <roland@gnu.org>
parents:
5524
diff
changeset
|
877 #endif /* ! HAVE_STRERROR */ |
