Mercurial > emacs
annotate lib-src/fakemail.c @ 69215:ef5cd9601f14
(mh-folder-list): Fix problem with passing in a folder and getting
nothing back. Fix problem with passing in empty string and getting the
entire filesystem (or infinite loop). Don't append slash to folder.
These fixes fix problems observed with the pick search. Thanks to
Thomas Baumann for the help (closes SF #1435381).
author | Bill Wohler <wohler@newt.com> |
---|---|
date | Tue, 28 Feb 2006 23:54:53 +0000 |
parents | 3661e9b3c48f |
children | e112ec9aa49b c5406394f567 |
rev | line source |
---|---|
18 | 1 /* sendmail-like interface to /bin/mail for system V, |
64769
6358e3c6075c
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64083
diff
changeset
|
2 Copyright (C) 1985, 1994, 1999, 2002, 2003, 2004, |
68647
3661e9b3c48f
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64769
diff
changeset
|
3 2005, 2006 Free Software Foundation, Inc. |
18 | 4 |
5 This file is part of GNU Emacs. | |
6 | |
37 | 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 | |
6109 | 9 the Free Software Foundation; either version 2, or (at your option) |
37 | 10 any later version. |
18 | 11 |
37 | 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 | |
64083 | 19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
20 Boston, MA 02110-1301, USA. */ | |
18 | 21 |
22 #define NO_SHORTNAMES | |
42134
de525d9743c9
Include "config.h", not <../src/config.h>.
Dave Love <fx@gnu.org>
parents:
34951
diff
changeset
|
23 #define _XOPEN_SOURCE 500 /* for cuserid */ |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
24 |
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
25 #ifdef HAVE_CONFIG_H |
42469 | 26 #include <config.h> |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
27 #endif |
18 | 28 |
16218
32f82ca8b41f
Replaced all BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
16121
diff
changeset
|
29 #if defined (BSD_SYSTEM) && !defined (BSD4_1) && !defined (USE_FAKEMAIL) |
18 | 30 /* This program isnot used in BSD, so just avoid loader complaints. */ |
15683 | 31 int |
18 | 32 main () |
33 { | |
16121 | 34 return 0; |
18 | 35 } |
36 #else /* not BSD 4.2 (or newer) */ | |
5447
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
37 #ifdef MSDOS |
15683 | 38 int |
5447
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
39 main () |
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
40 { |
16121 | 41 return 0; |
5447
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
42 } |
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
43 #else /* not MSDOS */ |
18 | 44 /* This conditional contains all the rest of the file. */ |
45 | |
46 /* These are defined in config in some versions. */ | |
47 | |
48 #ifdef static | |
49 #undef static | |
50 #endif | |
51 | |
15099
857388330750
[WINDOWSNT]: Include ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
52 #ifdef WINDOWSNT |
857388330750
[WINDOWSNT]: Include ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
53 #include "ntlib.h" |
857388330750
[WINDOWSNT]: Include ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
54 #endif |
857388330750
[WINDOWSNT]: Include ntlib.h.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
55 |
18 | 56 #include <stdio.h> |
57 #include <string.h> | |
58 #include <ctype.h> | |
59 #include <time.h> | |
60 #include <pwd.h> | |
18841
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
61 |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
62 /* This is to declare cuserid. */ |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
63 #ifdef HAVE_UNISTD_H |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
64 #include <unistd.h> |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
65 #endif |
18 | 66 |
67 /* Type definitions */ | |
68 | |
69 #define boolean int | |
70 #define true 1 | |
71 #define false 0 | |
72 | |
73 /* Various lists */ | |
74 | |
75 struct line_record | |
76 { | |
77 char *string; | |
78 struct line_record *continuation; | |
79 }; | |
80 typedef struct line_record *line_list; | |
81 | |
82 struct header_record | |
83 { | |
84 line_list text; | |
85 struct header_record *next; | |
86 struct header_record *previous; | |
87 }; | |
88 typedef struct header_record *header; | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
89 |
18 | 90 struct stream_record |
91 { | |
92 FILE *handle; | |
93 int (*action)(); | |
94 struct stream_record *rest_streams; | |
95 }; | |
96 typedef struct stream_record *stream_list; | |
97 | |
98 /* A `struct linebuffer' is a structure which holds a line of text. | |
99 * `readline' reads a line from a stream into a linebuffer | |
100 * and works regardless of the length of the line. | |
101 */ | |
102 | |
103 struct linebuffer | |
104 { | |
105 long size; | |
106 char *buffer; | |
107 }; | |
108 | |
109 struct linebuffer lb; | |
110 | |
111 #define new_list() \ | |
112 ((line_list) xmalloc (sizeof (struct line_record))) | |
113 #define new_header() \ | |
114 ((header) xmalloc (sizeof (struct header_record))) | |
115 #define new_stream() \ | |
116 ((stream_list) xmalloc (sizeof (struct stream_record))) | |
117 #define alloc_string(nchars) \ | |
118 ((char *) xmalloc ((nchars) + 1)) | |
119 | |
120 /* Global declarations */ | |
121 | |
122 #define BUFLEN 1024 | |
123 #define KEYWORD_SIZE 256 | |
124 #define FROM_PREFIX "From" | |
125 #define MY_NAME "fakemail" | |
126 #define NIL ((line_list) NULL) | |
127 #define INITIAL_LINE_SIZE 200 | |
128 | |
129 #ifndef MAIL_PROGRAM_NAME | |
130 #define MAIL_PROGRAM_NAME "/bin/mail" | |
131 #endif | |
132 | |
133 static char *my_name; | |
134 static char *the_date; | |
135 static char *the_user; | |
136 static line_list file_preface; | |
137 static stream_list the_streams; | |
138 static boolean no_problems = true; | |
139 | |
140 extern FILE *popen (); | |
141 extern int fclose (), pclose (); | |
142 | |
143 #ifdef CURRENT_USER | |
144 extern struct passwd *getpwuid (); | |
145 extern unsigned short geteuid (); | |
146 static struct passwd *my_entry; | |
147 #define cuserid(s) \ | |
148 (my_entry = getpwuid (((int) geteuid ())), \ | |
149 my_entry->pw_name) | |
150 #endif | |
151 | |
152 /* Utilities */ | |
153 | |
154 /* Print error message. `s1' is printf control string, `s2' is arg for it. */ | |
155 | |
156 static void | |
157 error (s1, s2) | |
158 char *s1, *s2; | |
159 { | |
160 printf ("%s: ", my_name); | |
161 printf (s1, s2); | |
162 printf ("\n"); | |
163 no_problems = false; | |
164 } | |
165 | |
166 /* Print error message and exit. */ | |
167 | |
168 static void | |
169 fatal (s1, s2) | |
170 char *s1, *s2; | |
171 { | |
172 error (s1, s2); | |
55442
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
173 exit (EXIT_FAILURE); |
18 | 174 } |
175 | |
176 /* Like malloc but get fatal error if memory is exhausted. */ | |
177 | |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
178 static long * |
18 | 179 xmalloc (size) |
180 int size; | |
181 { | |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
182 long *result = (long *) malloc (((unsigned) size)); |
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
183 if (result == ((long *) NULL)) |
18 | 184 fatal ("virtual memory exhausted", 0); |
185 return result; | |
186 } | |
187 | |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
188 static long * |
18 | 189 xrealloc (ptr, size) |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
190 long *ptr; |
18 | 191 int size; |
192 { | |
12833
25464bf61eb1
(xmalloc, xrealloc): Use return-type long *.
Richard M. Stallman <rms@gnu.org>
parents:
10265
diff
changeset
|
193 long *result = (long *) realloc (ptr, ((unsigned) size)); |
12840
4e9a14304b8b
(xrealloc): Change cast to match return type.
Karl Heuer <kwzh@gnu.org>
parents:
12833
diff
changeset
|
194 if (result == ((long *) NULL)) |
18 | 195 fatal ("virtual memory exhausted"); |
196 return result; | |
197 } | |
198 | |
199 /* Initialize a linebuffer for use */ | |
200 | |
201 void | |
202 init_linebuffer (linebuffer) | |
203 struct linebuffer *linebuffer; | |
204 { | |
205 linebuffer->size = INITIAL_LINE_SIZE; | |
206 linebuffer->buffer = ((char *) xmalloc (INITIAL_LINE_SIZE)); | |
207 } | |
208 | |
209 /* Read a line of text from `stream' into `linebuffer'. | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
210 Return the length of the line. */ |
18 | 211 |
212 long | |
213 readline (linebuffer, stream) | |
214 struct linebuffer *linebuffer; | |
215 FILE *stream; | |
216 { | |
217 char *buffer = linebuffer->buffer; | |
218 char *p = linebuffer->buffer; | |
219 char *end = p + linebuffer->size; | |
220 | |
221 while (true) | |
222 { | |
223 int c = getc (stream); | |
224 if (p == end) | |
225 { | |
226 linebuffer->size *= 2; | |
34951
1efc40541908
(readline): Cast buffer to "long *" to pacify
Eli Zaretskii <eliz@gnu.org>
parents:
34609
diff
changeset
|
227 buffer = ((char *) xrealloc ((long *)buffer, linebuffer->size)); |
6992
ed57331fb222
(readline): Fix updating of p when buffer grows.
Richard M. Stallman <rms@gnu.org>
parents:
6954
diff
changeset
|
228 p = buffer + (p - linebuffer->buffer); |
6954
774fdc20d115
(readline): When extending the buffer,
Richard M. Stallman <rms@gnu.org>
parents:
6109
diff
changeset
|
229 end = buffer + linebuffer->size; |
18 | 230 linebuffer->buffer = buffer; |
231 } | |
232 if (c < 0 || c == '\n') | |
233 { | |
234 *p = 0; | |
235 break; | |
236 } | |
237 *p++ = c; | |
238 } | |
239 | |
240 return p - buffer; | |
241 } | |
242 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
243 /* Extract a colon-terminated keyword from the string FIELD. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
244 Return that keyword as a string stored in a static buffer. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
245 Store the address of the rest of the string into *REST. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
246 |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
247 If there is no keyword, return NULL and don't alter *REST. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
248 |
18 | 249 char * |
250 get_keyword (field, rest) | |
251 register char *field; | |
252 char **rest; | |
253 { | |
254 static char keyword[KEYWORD_SIZE]; | |
255 register char *ptr; | |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
256 register int c; |
18 | 257 |
258 ptr = &keyword[0]; | |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
259 c = (unsigned char) *field++; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
260 if (isspace (c) || c == ':') |
18 | 261 return ((char *) NULL); |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
262 *ptr++ = (islower (c) ? toupper (c) : c); |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
263 while (((c = (unsigned char) *field++) != ':') && ! isspace (c)) |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
264 *ptr++ = (islower (c) ? toupper (c) : c); |
18 | 265 *ptr++ = '\0'; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
266 while (isspace (c)) |
34609
cb2667416fa5
(get_keyword): Make sure that isspace and
Gerd Moellmann <gerd@gnu.org>
parents:
26083
diff
changeset
|
267 c = (unsigned char) *field++; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
268 if (c != ':') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
269 return ((char *) NULL); |
18 | 270 *rest = field; |
271 return &keyword[0]; | |
272 } | |
273 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
274 /* Nonzero if the string FIELD starts with a colon-terminated keyword. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
275 |
18 | 276 boolean |
277 has_keyword (field) | |
278 char *field; | |
279 { | |
280 char *ignored; | |
281 return (get_keyword (field, &ignored) != ((char *) NULL)); | |
282 } | |
283 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
284 /* Store the string FIELD, followed by any lines in THE_LIST, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
285 into the buffer WHERE. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
286 Concatenate lines, putting just a space between them. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
287 Delete everything contained in parentheses. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
288 When a recipient name contains <...>, we discard |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
289 everything except what is inside the <...>. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
290 |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
291 We don't pay attention to overflowing WHERE; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
292 the caller has to make it big enough. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
293 |
18 | 294 char * |
295 add_field (the_list, field, where) | |
296 line_list the_list; | |
297 register char *field, *where; | |
298 { | |
299 register char c; | |
300 while (true) | |
301 { | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
302 char *this_recipient_where; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
303 int in_quotes = 0; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
304 |
18 | 305 *where++ = ' '; |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
306 this_recipient_where = where; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
307 |
18 | 308 while ((c = *field++) != '\0') |
309 { | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
310 if (c == '\\') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
311 *where++ = c; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
312 else if (c == '"') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
313 { |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
314 in_quotes = ! in_quotes; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
315 *where++ = c; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
316 } |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
317 else if (in_quotes) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
318 *where++ = c; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
319 else if (c == '(') |
18 | 320 { |
321 while (*field && *field != ')') ++field; | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
322 if (! (*field++)) break; /* no close */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
323 continue; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
324 } |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
325 else if (c == ',') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
326 { |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
327 *where++ = ' '; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
328 /* When we get to the end of one recipient, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
329 don't discard it if the next one has <...>. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
330 this_recipient_where = where; |
18 | 331 } |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
332 else if (c == '<') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
333 /* Discard everything we got before the `<'. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
334 where = this_recipient_where; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
335 else if (c == '>') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
336 /* Discard the rest of this name that follows the `>'. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
337 { |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
338 while (*field && *field != ',') ++field; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
339 if (! (*field++)) break; /* no comma */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
340 continue; |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
341 } |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
342 else |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
343 *where++ = c; |
18 | 344 } |
345 if (the_list == NIL) break; | |
346 field = the_list->string; | |
347 the_list = the_list->continuation; | |
348 } | |
349 return where; | |
350 } | |
351 | |
352 line_list | |
353 make_file_preface () | |
354 { | |
355 char *the_string, *temp; | |
356 long idiotic_interface; | |
357 long prefix_length; | |
358 long user_length; | |
359 long date_length; | |
360 line_list result; | |
361 | |
362 prefix_length = strlen (FROM_PREFIX); | |
363 time (&idiotic_interface); | |
364 the_date = ctime (&idiotic_interface); | |
365 /* the_date has an unwanted newline at the end */ | |
366 date_length = strlen (the_date) - 1; | |
367 the_date[date_length] = '\0'; | |
368 temp = cuserid ((char *) NULL); | |
369 user_length = strlen (temp); | |
370 the_user = alloc_string (user_length + 1); | |
371 strcpy (the_user, temp); | |
18841
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
372 the_string = alloc_string (3 + prefix_length |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
373 + user_length |
36704f455f32
[HAVE_UNISTD_H]: Include unistd.h.
Richard M. Stallman <rms@gnu.org>
parents:
16218
diff
changeset
|
374 + date_length); |
18 | 375 temp = the_string; |
376 strcpy (temp, FROM_PREFIX); | |
377 temp = &temp[prefix_length]; | |
378 *temp++ = ' '; | |
379 strcpy (temp, the_user); | |
380 temp = &temp[user_length]; | |
381 *temp++ = ' '; | |
382 strcpy (temp, the_date); | |
383 result = new_list (); | |
384 result->string = the_string; | |
385 result->continuation = ((line_list) NULL); | |
386 return result; | |
387 } | |
388 | |
389 void | |
390 write_line_list (the_list, the_stream) | |
391 register line_list the_list; | |
392 FILE *the_stream; | |
393 { | |
394 for ( ; | |
395 the_list != ((line_list) NULL) ; | |
396 the_list = the_list->continuation) | |
397 { | |
398 fputs (the_list->string, the_stream); | |
399 putc ('\n', the_stream); | |
400 } | |
401 return; | |
402 } | |
403 | |
404 int | |
405 close_the_streams () | |
406 { | |
407 register stream_list rem; | |
408 for (rem = the_streams; | |
409 rem != ((stream_list) NULL); | |
410 rem = rem->rest_streams) | |
411 no_problems = (no_problems && | |
412 ((*rem->action) (rem->handle) == 0)); | |
413 the_streams = ((stream_list) NULL); | |
55442
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
414 return (no_problems ? EXIT_SUCCESS : EXIT_FAILURE); |
18 | 415 } |
416 | |
417 void | |
418 add_a_stream (the_stream, closing_action) | |
419 FILE *the_stream; | |
420 int (*closing_action)(); | |
421 { | |
422 stream_list old = the_streams; | |
423 the_streams = new_stream (); | |
424 the_streams->handle = the_stream; | |
425 the_streams->action = closing_action; | |
426 the_streams->rest_streams = old; | |
427 return; | |
428 } | |
429 | |
430 int | |
431 my_fclose (the_file) | |
432 FILE *the_file; | |
433 { | |
434 putc ('\n', the_file); | |
435 fflush (the_file); | |
436 return fclose (the_file); | |
437 } | |
438 | |
439 boolean | |
440 open_a_file (name) | |
441 char *name; | |
442 { | |
443 FILE *the_stream = fopen (name, "a"); | |
444 if (the_stream != ((FILE *) NULL)) | |
445 { | |
446 add_a_stream (the_stream, my_fclose); | |
447 if (the_user == ((char *) NULL)) | |
448 file_preface = make_file_preface (); | |
449 write_line_list (file_preface, the_stream); | |
450 return true; | |
451 } | |
452 return false; | |
453 } | |
454 | |
455 void | |
456 put_string (s) | |
457 char *s; | |
458 { | |
459 register stream_list rem; | |
460 for (rem = the_streams; | |
461 rem != ((stream_list) NULL); | |
462 rem = rem->rest_streams) | |
463 fputs (s, rem->handle); | |
464 return; | |
465 } | |
466 | |
467 void | |
20 | 468 put_line (string) |
469 char *string; | |
18 | 470 { |
471 register stream_list rem; | |
472 for (rem = the_streams; | |
473 rem != ((stream_list) NULL); | |
474 rem = rem->rest_streams) | |
475 { | |
20 | 476 char *s = string; |
477 int column = 0; | |
478 | |
479 /* Divide STRING into lines. */ | |
480 while (*s != 0) | |
481 { | |
482 char *breakpos; | |
483 | |
5959
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
484 /* Find the last char that fits. */ |
20 | 485 for (breakpos = s; *breakpos && column < 78; ++breakpos) |
486 { | |
487 if (*breakpos == '\t') | |
488 column += 8; | |
489 else | |
490 column++; | |
491 } | |
5959
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
492 /* If we didn't reach end of line, break the line. */ |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
493 if (*breakpos) |
20 | 494 { |
5959
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
495 /* Back up to just after the last comma that fits. */ |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
496 while (breakpos != s && breakpos[-1] != ',') --breakpos; |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
497 |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
498 if (breakpos == s) |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
499 { |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
500 /* If no comma fits, move past the first address anyway. */ |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
501 while (*breakpos != 0 && *breakpos != ',') ++breakpos; |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
502 if (*breakpos != 0) |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
503 /* Include the comma after it. */ |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
504 ++breakpos; |
e4337a7bbe32
(put_line): Don't break the line if it all fits.
Richard M. Stallman <rms@gnu.org>
parents:
5447
diff
changeset
|
505 } |
20 | 506 } |
507 /* Output that much, then break the line. */ | |
508 fwrite (s, 1, breakpos - s, rem->handle); | |
509 column = 8; | |
510 | |
511 /* Skip whitespace and prepare to print more addresses. */ | |
512 s = breakpos; | |
513 while (*s == ' ' || *s == '\t') ++s; | |
3219
1aa8fa0a569e
(put_line): Don't output \n\t unless more text follows.
Richard M. Stallman <rms@gnu.org>
parents:
37
diff
changeset
|
514 if (*s != 0) |
1aa8fa0a569e
(put_line): Don't output \n\t unless more text follows.
Richard M. Stallman <rms@gnu.org>
parents:
37
diff
changeset
|
515 fputs ("\n\t", rem->handle); |
20 | 516 } |
18 | 517 putc ('\n', rem->handle); |
518 } | |
519 return; | |
520 } | |
521 | |
522 #define mail_error error | |
523 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
524 /* Handle an FCC field. FIELD is the text of the first line (after |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
525 the header name), and THE_LIST holds the continuation lines if any. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
526 Call open_a_file for each file. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
527 |
18 | 528 void |
529 setup_files (the_list, field) | |
530 register line_list the_list; | |
531 register char *field; | |
532 { | |
533 register char *start; | |
534 register char c; | |
535 while (true) | |
536 { | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
537 while (((c = *field) != '\0') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
538 && (c == ' ' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
539 || c == '\t' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
540 || c == ',')) |
18 | 541 field += 1; |
542 if (c != '\0') | |
543 { | |
544 start = field; | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
545 while (((c = *field) != '\0') |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
546 && c != ' ' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
547 && c != '\t' |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
548 && c != ',') |
18 | 549 field += 1; |
550 *field = '\0'; | |
551 if (!open_a_file (start)) | |
552 mail_error ("Could not open file %s", start); | |
553 *field = c; | |
554 if (c != '\0') continue; | |
555 } | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
556 if (the_list == ((line_list) NULL)) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
557 return; |
18 | 558 field = the_list->string; |
559 the_list = the_list->continuation; | |
560 } | |
561 } | |
562 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
563 /* Compute the total size of all recipient names stored in THE_HEADER. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
564 The result says how big to make the buffer to pass to parse_header. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
565 |
18 | 566 int |
567 args_size (the_header) | |
568 header the_header; | |
569 { | |
570 register header old = the_header; | |
571 register line_list rem; | |
572 register int size = 0; | |
573 do | |
574 { | |
575 char *field; | |
576 register char *keyword = get_keyword (the_header->text->string, &field); | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
577 if ((strcmp (keyword, "TO") == 0) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
578 || (strcmp (keyword, "CC") == 0) |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
579 || (strcmp (keyword, "BCC") == 0)) |
18 | 580 { |
581 size += 1 + strlen (field); | |
582 for (rem = the_header->text->continuation; | |
583 rem != NIL; | |
584 rem = rem->continuation) | |
585 size += 1 + strlen (rem->string); | |
586 } | |
587 the_header = the_header->next; | |
588 } while (the_header != old); | |
589 return size; | |
590 } | |
591 | |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
592 /* Scan the header described by the lists THE_HEADER, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
593 and put all recipient names into the buffer WHERE. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
594 Precede each recipient name with a space. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
595 |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
596 Also, if the header has any FCC fields, call setup_files for each one. */ |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
597 |
21389
48690fd8d40a
(_XOPEN_SOURCE): Define for declaration of cuserid.
Andreas Schwab <schwab@suse.de>
parents:
18841
diff
changeset
|
598 void |
18 | 599 parse_header (the_header, where) |
600 header the_header; | |
601 register char *where; | |
602 { | |
603 register header old = the_header; | |
604 do | |
605 { | |
606 char *field; | |
607 register char *keyword = get_keyword (the_header->text->string, &field); | |
608 if (strcmp (keyword, "TO") == 0) | |
609 where = add_field (the_header->text->continuation, field, where); | |
610 else if (strcmp (keyword, "CC") == 0) | |
611 where = add_field (the_header->text->continuation, field, where); | |
612 else if (strcmp (keyword, "BCC") == 0) | |
613 { | |
614 where = add_field (the_header->text->continuation, field, where); | |
615 the_header->previous->next = the_header->next; | |
616 the_header->next->previous = the_header->previous; | |
617 } | |
618 else if (strcmp (keyword, "FCC") == 0) | |
619 setup_files (the_header->text->continuation, field); | |
620 the_header = the_header->next; | |
621 } while (the_header != old); | |
622 *where = '\0'; | |
623 return; | |
624 } | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
625 |
10265
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
626 /* Read lines from the input until we get a blank line. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
627 Create a list of `header' objects, one for each header field, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
628 each of which points to a list of `line_list' objects, |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
629 one for each line in that field. |
c53a70ec8d85
(xmalloc, xrealloc): Add casts.
Richard M. Stallman <rms@gnu.org>
parents:
9621
diff
changeset
|
630 Continuation lines are grouped in the headers they continue. */ |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
631 |
18 | 632 header |
633 read_header () | |
634 { | |
635 register header the_header = ((header) NULL); | |
636 register line_list *next_line = ((line_list *) NULL); | |
637 | |
638 init_linebuffer (&lb); | |
639 | |
640 do | |
641 { | |
642 long length; | |
643 register char *line; | |
644 | |
645 readline (&lb, stdin); | |
646 line = lb.buffer; | |
647 length = strlen (line); | |
648 if (length == 0) break; | |
649 | |
650 if (has_keyword (line)) | |
651 { | |
652 register header old = the_header; | |
653 the_header = new_header (); | |
654 if (old == ((header) NULL)) | |
655 { | |
656 the_header->next = the_header; | |
657 the_header->previous = the_header; | |
658 } | |
659 else | |
660 { | |
661 the_header->previous = old; | |
662 the_header->next = old->next; | |
663 old->next = the_header; | |
664 } | |
665 next_line = &(the_header->text); | |
666 } | |
667 | |
668 if (next_line == ((line_list *) NULL)) | |
669 { | |
670 /* Not a valid header */ | |
55442
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
671 exit (EXIT_FAILURE); |
18 | 672 } |
673 *next_line = new_list (); | |
674 (*next_line)->string = alloc_string (length); | |
675 strcpy (((*next_line)->string), line); | |
676 next_line = &((*next_line)->continuation); | |
677 *next_line = NIL; | |
678 | |
679 } while (true); | |
680 | |
681 return the_header->next; | |
682 } | |
683 | |
684 void | |
685 write_header (the_header) | |
686 header the_header; | |
687 { | |
688 register header old = the_header; | |
689 do | |
690 { | |
691 register line_list the_list; | |
692 for (the_list = the_header->text; | |
693 the_list != NIL; | |
694 the_list = the_list->continuation) | |
695 put_line (the_list->string); | |
696 the_header = the_header->next; | |
697 } while (the_header != old); | |
698 put_line (""); | |
699 return; | |
700 } | |
701 | |
15683 | 702 int |
18 | 703 main (argc, argv) |
704 int argc; | |
705 char **argv; | |
706 { | |
707 char *command_line; | |
708 header the_header; | |
709 long name_length; | |
710 char *mail_program_name; | |
711 char buf[BUFLEN + 1]; | |
712 register int size; | |
713 FILE *the_pipe; | |
714 | |
715 extern char *getenv (); | |
716 | |
717 mail_program_name = getenv ("FAKEMAILER"); | |
718 if (!(mail_program_name && *mail_program_name)) | |
719 mail_program_name = MAIL_PROGRAM_NAME; | |
720 name_length = strlen (mail_program_name); | |
721 | |
722 my_name = MY_NAME; | |
723 the_streams = ((stream_list) NULL); | |
724 the_date = ((char *) NULL); | |
725 the_user = ((char *) NULL); | |
726 | |
727 the_header = read_header (); | |
728 command_line = alloc_string (name_length + args_size (the_header)); | |
729 strcpy (command_line, mail_program_name); | |
730 parse_header (the_header, &command_line[name_length]); | |
42181
358035cb58d9
Conditionally include config.h.
Pavel Janík <Pavel@Janik.cz>
parents:
42134
diff
changeset
|
731 |
18 | 732 the_pipe = popen (command_line, "w"); |
733 if (the_pipe == ((FILE *) NULL)) | |
734 fatal ("cannot open pipe to real mailer"); | |
735 | |
736 add_a_stream (the_pipe, pclose); | |
737 | |
738 write_header (the_header); | |
739 | |
740 /* Dump the message itself */ | |
741 | |
742 while (!feof (stdin)) | |
743 { | |
744 size = fread (buf, 1, BUFLEN, stdin); | |
745 buf[size] = '\0'; | |
746 put_string (buf); | |
747 } | |
748 | |
749 exit (close_the_streams ()); | |
750 } | |
751 | |
5447
6f0905b05218
(main) [MSDOS]: Dummy stub just to make the file compile.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
752 #endif /* not MSDOS */ |
18 | 753 #endif /* not BSD 4.2 (or newer) */ |
52401 | 754 |
755 /* arch-tag: acb0afa6-315a-4c5b-b9e3-def5725c8783 | |
756 (do not change this comment) */ | |
55442
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
757 |
a47704955f8d
Throughout, replace 0 destined for `exit' arg with `EXIT_SUCCESS'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
52401
diff
changeset
|
758 /* fakemail.c ends here */ |