X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/d0dff6e50560a7b6656b62f3a338faa347717f6a..4984edc7c449d68ad08785bbdc6a01675aeca6e7:/lib-src/fakemail.c diff --git a/lib-src/fakemail.c b/lib-src/fakemail.c index 400861d4fd..30d39db533 100644 --- a/lib-src/fakemail.c +++ b/lib-src/fakemail.c @@ -1,5 +1,6 @@ /* sendmail-like interface to /bin/mail for system V, - Copyright (C) 1985, 1994 Free Software Foundation, Inc. + Copyright (C) 1985, 1994, 1999, 2002, 2003, 2004, + 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -15,26 +16,29 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ #define NO_SHORTNAMES -#include <../src/config.h> +#define _XOPEN_SOURCE 500 /* for cuserid */ + +#ifdef HAVE_CONFIG_H +#include +#endif -#if defined (BSD) && !defined (BSD4_1) && !defined (USE_FAKEMAIL) +#if defined (BSD_SYSTEM) && !defined (BSD4_1) && !defined (USE_FAKEMAIL) /* This program isnot used in BSD, so just avoid loader complaints. */ int main () { - return 0; + return 0; } #else /* not BSD 4.2 (or newer) */ #ifdef MSDOS int main () { - return 0; + return 0; } #else /* not MSDOS */ /* This conditional contains all the rest of the file. */ @@ -45,13 +49,6 @@ main () #undef static #endif -#ifdef read -#undef read -#undef write -#undef open -#undef close -#endif - #ifdef WINDOWSNT #include "ntlib.h" #endif @@ -61,6 +58,11 @@ main () #include #include #include + +/* This is to declare cuserid. */ +#ifdef HAVE_UNISTD_H +#include +#endif /* Type definitions */ @@ -68,6 +70,15 @@ main () #define true 1 #define false 0 +#define TM_YEAR_BASE 1900 + +/* Nonzero if TM_YEAR is a struct tm's tm_year value that causes + asctime to have well-defined behavior. */ +#ifndef TM_YEAR_IN_ASCTIME_RANGE +# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \ + (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE) +#endif + /* Various lists */ struct line_record @@ -84,7 +95,7 @@ struct header_record struct header_record *previous; }; typedef struct header_record *header; - + struct stream_record { FILE *handle; @@ -168,7 +179,7 @@ fatal (s1, s2) char *s1, *s2; { error (s1, s2); - exit (1); + exit (EXIT_FAILURE); } /* Like malloc but get fatal error if memory is exhausted. */ @@ -205,8 +216,7 @@ init_linebuffer (linebuffer) } /* Read a line of text from `stream' into `linebuffer'. - * Return the length of the line. - */ + Return the length of the line. */ long readline (linebuffer, stream) @@ -223,7 +233,7 @@ readline (linebuffer, stream) if (p == end) { linebuffer->size *= 2; - buffer = ((char *) xrealloc (buffer, linebuffer->size)); + buffer = ((char *) xrealloc ((long *)buffer, linebuffer->size)); p = buffer + (p - linebuffer->buffer); end = buffer + linebuffer->size; linebuffer->buffer = buffer; @@ -252,18 +262,18 @@ get_keyword (field, rest) { static char keyword[KEYWORD_SIZE]; register char *ptr; - register char c; + register int c; ptr = &keyword[0]; - c = *field++; + c = (unsigned char) *field++; if (isspace (c) || c == ':') return ((char *) NULL); *ptr++ = (islower (c) ? toupper (c) : c); - while (((c = *field++) != ':') && ! isspace (c)) + while (((c = (unsigned char) *field++) != ':') && ! isspace (c)) *ptr++ = (islower (c) ? toupper (c) : c); *ptr++ = '\0'; while (isspace (c)) - c = *field++; + c = (unsigned char) *field++; if (c != ':') return ((char *) NULL); *rest = field; @@ -353,6 +363,7 @@ make_file_preface () { char *the_string, *temp; long idiotic_interface; + struct tm *tm; long prefix_length; long user_length; long date_length; @@ -360,7 +371,13 @@ make_file_preface () prefix_length = strlen (FROM_PREFIX); time (&idiotic_interface); - the_date = ctime (&idiotic_interface); + /* Convert to a string, checking for out-of-range time stamps. + Don't use 'ctime', as that might dump core if the hardware clock + is set to a bizarre value. */ + tm = localtime (&idiotic_interface); + if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year) + && (the_date = asctime (tm)))) + fatal ("current time is out of range", 0); /* the_date has an unwanted newline at the end */ date_length = strlen (the_date) - 1; the_date[date_length] = '\0'; @@ -368,9 +385,9 @@ make_file_preface () user_length = strlen (temp); the_user = alloc_string (user_length + 1); strcpy (the_user, temp); - the_string = alloc_string (3 + prefix_length + - user_length + - date_length); + the_string = alloc_string (3 + prefix_length + + user_length + + date_length); temp = the_string; strcpy (temp, FROM_PREFIX); temp = &temp[prefix_length]; @@ -410,7 +427,7 @@ close_the_streams () no_problems = (no_problems && ((*rem->action) (rem->handle) == 0)); the_streams = ((stream_list) NULL); - return (no_problems ? 0 : 1); + return (no_problems ? EXIT_SUCCESS : EXIT_FAILURE); } void @@ -594,6 +611,7 @@ args_size (the_header) Also, if the header has any FCC fields, call setup_files for each one. */ +void parse_header (the_header, where) header the_header; register char *where; @@ -620,13 +638,13 @@ parse_header (the_header, where) *where = '\0'; return; } - + /* Read lines from the input until we get a blank line. Create a list of `header' objects, one for each header field, each of which points to a list of `line_list' objects, one for each line in that field. Continuation lines are grouped in the headers they continue. */ - + header read_header () { @@ -666,7 +684,7 @@ read_header () if (next_line == ((line_list *) NULL)) { /* Not a valid header */ - exit (1); + exit (EXIT_FAILURE); } *next_line = new_list (); (*next_line)->string = alloc_string (length); @@ -676,6 +694,8 @@ read_header () } while (true); + if (! the_header) + fatal ("input message has no header"); return the_header->next; } @@ -726,7 +746,7 @@ main (argc, argv) command_line = alloc_string (name_length + args_size (the_header)); strcpy (command_line, mail_program_name); parse_header (the_header, &command_line[name_length]); - + the_pipe = popen (command_line, "w"); if (the_pipe == ((FILE *) NULL)) fatal ("cannot open pipe to real mailer"); @@ -749,3 +769,8 @@ main (argc, argv) #endif /* not MSDOS */ #endif /* not BSD 4.2 (or newer) */ + +/* arch-tag: acb0afa6-315a-4c5b-b9e3-def5725c8783 + (do not change this comment) */ + +/* fakemail.c ends here */