annotate lib-src/fakemail.c @ 5750:66d2f63df75f

Correct some spelling and formatting in behavior.el. Mentioned in tracker issue 826, the third thing mentioned there (the file name at the bottom of the file) had already been fixed. lisp/ChangeLog addition: 2013-08-05 Aidan Kehoe <kehoea@parhasard.net> * behavior.el: (override-behavior): Correct some spelling and formatting here, thank you Steven Mitchell in tracker issue 826.
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 05 Aug 2013 10:05:32 +0100
parents a9094f28f9a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* sendmail-like interface to /bin/mail for system V,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1985, 1994 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 442
diff changeset
4 This file is part of XEmacs.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
5406
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4932
diff changeset
6 XEmacs is free software: you can redistribute it and/or modify it
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4932
diff changeset
7 under the terms of the GNU General Public License as published by the
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4932
diff changeset
8 Free Software Foundation, either version 3 of the License, or (at your
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4932
diff changeset
9 option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
5406
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4932
diff changeset
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4932
diff changeset
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4932
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4932
diff changeset
14 for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
5406
061f4f90f874 Convert lib-src/ to GPLv3.
Mike Sperber <sperber@deinprogramm.de>
parents: 4932
diff changeset
17 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 /* Synched up with: FSF 19.28. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 #define NO_SHORTNAMES
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
22 #include <config.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 #if defined (BSD) && !defined (BSD4_1) && !defined (USE_FAKEMAIL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 /* This program is not used in BSD, so just avoid loader complaints. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 main (int argc, char *argv[])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #elif defined (LINUX)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include <stdlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 int
2509
6a9afa282c8e [xemacs-hg @ 2005-01-26 09:53:28 by ben]
ben
parents: 2286
diff changeset
35 main (int argc, char *argv[])
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 /* Linux /bin/mail, if it exists, is NOT the Unix v7 mail that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 fakemail depends on! This causes garbled mail. Better to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 output an error message. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 fprintf (stderr, "Sorry, fakemail does not work on Linux.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 fprintf (stderr, "Make sure you have the sendmail program, and\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 fprintf (stderr, "set the Lisp variable `sendmail-program' to point\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 fprintf (stderr, "to the path of the sendmail binary.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 #else /* not BSD 4.2 (or newer) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 /* These are defined in config in some versions. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 #ifdef static
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 #undef static
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 #ifdef read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 #undef read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 #undef write
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 #undef open
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 #undef close
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 #if __STDC__ || defined(STDC_HEADERS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 #include <stdlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 #include <unistd.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 #include <string.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 #include <ctype.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 #include <time.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 #include <pwd.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 /* Type definitions */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #define boolean int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 #define true 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 #define false 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 /* Various lists */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 struct line_record
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 char *string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 struct line_record *continuation;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 typedef struct line_record *line_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 struct header_record
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 line_list text;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 struct header_record *next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 struct header_record *previous;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 typedef struct header_record *header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 struct stream_record
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 FILE *handle;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 int (*action)(FILE *);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 struct stream_record *rest_streams;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 typedef struct stream_record *stream_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 /* A `struct linebuffer' is a structure which holds a line of text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 * `readline' reads a line from a stream into a linebuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 * and works regardless of the length of the line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 struct linebuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
109 size_t size;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 char *buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 struct linebuffer lb;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 #define new_list() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 ((line_list) xmalloc (sizeof (struct line_record)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 #define new_header() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 ((header) xmalloc (sizeof (struct header_record)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 #define new_stream() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 ((stream_list) xmalloc (sizeof (struct stream_record)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 #define alloc_string(nchars) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 ((char *) xmalloc ((nchars) + 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 /* Global declarations */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 #define BUFLEN 1024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 #define KEYWORD_SIZE 256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 #define FROM_PREFIX "From"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 #define MY_NAME "fakemail"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 #define NIL ((line_list) NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 #define INITIAL_LINE_SIZE 200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 #define MAIL_PROGRAM_NAME "/bin/mail"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
134 static const char *my_name;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 static char *the_date;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 static char *the_user;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 static line_list file_preface;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 static stream_list the_streams;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 static boolean no_problems = true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 #if !__STDC__ && !defined(STDC_HEADERS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 extern FILE *popen ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 extern int fclose (), pclose ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 extern char *malloc (), *realloc ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146
5341
fde0802ee3e0 Zap freebsd.h.
Mike Sperber <sperber@deinprogramm.de>
parents: 5287
diff changeset
147 #if defined(__FreeBSD__)
fde0802ee3e0 Zap freebsd.h.
Mike Sperber <sperber@deinprogramm.de>
parents: 5287
diff changeset
148 #include <osreldate.h>
fde0802ee3e0 Zap freebsd.h.
Mike Sperber <sperber@deinprogramm.de>
parents: 5287
diff changeset
149 #endif
fde0802ee3e0 Zap freebsd.h.
Mike Sperber <sperber@deinprogramm.de>
parents: 5287
diff changeset
150
2687
45609533aa75 [xemacs-hg @ 2005-03-25 16:34:53 by aidan]
aidan
parents: 2509
diff changeset
151 #if defined(__FreeBSD_version) && __FreeBSD_version >= 400000
45609533aa75 [xemacs-hg @ 2005-03-25 16:34:53 by aidan]
aidan
parents: 2509
diff changeset
152 #define CURRENT_USER
45609533aa75 [xemacs-hg @ 2005-03-25 16:34:53 by aidan]
aidan
parents: 2509
diff changeset
153 #endif
45609533aa75 [xemacs-hg @ 2005-03-25 16:34:53 by aidan]
aidan
parents: 2509
diff changeset
154
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 #ifdef CURRENT_USER
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 extern struct passwd *getpwuid ();
2687
45609533aa75 [xemacs-hg @ 2005-03-25 16:34:53 by aidan]
aidan
parents: 2509
diff changeset
157 #if defined(__FreeBSD_version) && __FreeBSD_version >= 400000
45609533aa75 [xemacs-hg @ 2005-03-25 16:34:53 by aidan]
aidan
parents: 2509
diff changeset
158 extern uid_t geteuid ();
45609533aa75 [xemacs-hg @ 2005-03-25 16:34:53 by aidan]
aidan
parents: 2509
diff changeset
159 #else
45609533aa75 [xemacs-hg @ 2005-03-25 16:34:53 by aidan]
aidan
parents: 2509
diff changeset
160 extern unsigned short geteuid ();
45609533aa75 [xemacs-hg @ 2005-03-25 16:34:53 by aidan]
aidan
parents: 2509
diff changeset
161 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 static struct passwd *my_entry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 #define cuserid(s) \
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
164 (my_entry = getpwuid ((int) geteuid ()), \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 my_entry->pw_name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 /* Utilities */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 /* Print error message. `s1' is printf control string, `s2' is arg for it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
173 error (const char *s1, const char *s2)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 printf ("%s: ", my_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 printf (s1, s2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 printf ("\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 no_problems = false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 /* Print error message and exit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
184 fatal (const char *s1, const char *s2)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 error (s1, s2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 /* Like malloc but get fatal error if memory is exhausted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
192 static void *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 xmalloc (size_t size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
195 void *result = malloc (size);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
196 if (result == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 fatal ("virtual memory exhausted", (char *) 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
201 static void *
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
202 xrealloc (void *ptr, size_t size)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
204 void *result = realloc (ptr, size);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
205 if (result == NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 fatal ("virtual memory exhausted", (char *) 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 /* Initialize a linebuffer for use */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 init_linebuffer (struct linebuffer *linebuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 linebuffer->size = INITIAL_LINE_SIZE;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
216 linebuffer->buffer = (char *) xmalloc (INITIAL_LINE_SIZE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 /* Read a line of text from `stream' into `linebuffer'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 * Return the length of the line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 static long
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 readline (struct linebuffer *linebuffer, FILE *stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 char *buffer = linebuffer->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 char *p = linebuffer->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 char *end = p + linebuffer->size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 while (true)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 int c = getc (stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 if (p == end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 linebuffer->size *= 2;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
236 buffer = (char *) xrealloc (buffer, linebuffer->size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 p = buffer + (p - linebuffer->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 end = buffer + linebuffer->size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 linebuffer->buffer = buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 if (c < 0 || c == '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 *p = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 *p++ = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 return p - buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 get_keyword (register char *field, char **rest)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 static char keyword[KEYWORD_SIZE];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 register char *ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 register char c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 ptr = &keyword[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 c = *field++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 if ((isspace ((int) (unsigned char) c)) || (c == ':'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 return (char *) NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 *ptr++ = ((islower ((int) (unsigned char) c)) ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 (toupper ((int) (unsigned char) c)) : c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 while (((c = *field++) != ':') &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (!(isspace ((int) (unsigned char) c))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 *ptr++ = ((islower ((int) (unsigned char) c)) ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 (toupper ((int) (unsigned char) c)) : c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 *ptr++ = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 while (isspace ((int) (unsigned char) c)) c = *field++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 if (c != ':') return (char *) NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 *rest = field;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 return &keyword[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 static boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 has_keyword (char *field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 char *ignored;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
280 return (get_keyword (field, &ignored) != (char *) NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 add_field (line_list the_list, register char *field, register char *where)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 register char c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 while (true)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 *where++ = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 while ((c = *field++) != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 if (c == '(')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 while (*field && *field != ')') ++field;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 if (! (*field++)) break; /* no closer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 if (! (*field)) break; /* closerNULL */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 c = *field;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 *where++ = ((c == ','||c=='>'||c=='<') ? ' ' : c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 if (the_list == NIL) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 field = the_list->string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 the_list = the_list->continuation;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 return where;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 static line_list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 make_file_preface (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 char *the_string, *temp;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
312 time_t idiotic_interface;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 long prefix_length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 long user_length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 long date_length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 line_list result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 prefix_length = strlen (FROM_PREFIX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 time (&idiotic_interface);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 the_date = ctime (&idiotic_interface);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 /* the_date has an unwanted newline at the end */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 date_length = strlen (the_date) - 1;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
323 if (the_date[date_length] == '\n')
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
324 the_date[date_length] = '\0';
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
325 #ifdef WIN32_NATIVE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 temp = "(null)";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 temp = cuserid ((char *) NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 user_length = strlen (temp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 the_user = alloc_string ((size_t) (user_length + 1));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 strcpy (the_user, temp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 the_string = alloc_string ((size_t) (3 + prefix_length +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 user_length +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 date_length));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 temp = the_string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 strcpy (temp, FROM_PREFIX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 temp = &temp[prefix_length];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 *temp++ = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 strcpy (temp, the_user);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 temp = &temp[user_length];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 *temp++ = ' ';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 strcpy (temp, the_date);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 result = new_list ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 result->string = the_string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 result->continuation = ((line_list) NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 write_line_list (register line_list the_list, FILE *the_stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 for ( ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 the_list != ((line_list) NULL) ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 the_list = the_list->continuation)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 fputs (the_list->string, the_stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 putc ('\n', the_stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 close_the_streams (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 register stream_list rem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 for (rem = the_streams;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 rem != ((stream_list) NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 rem = rem->rest_streams)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 no_problems = (no_problems &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 ((*rem->action) (rem->handle) == 0));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 the_streams = ((stream_list) NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 return (no_problems ? 0 : 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 add_a_stream (FILE *the_stream, int (*closing_action)(FILE *))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 stream_list old = the_streams;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 the_streams = new_stream ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 the_streams->handle = the_stream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 the_streams->action = closing_action;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 the_streams->rest_streams = old;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 my_fclose (FILE *the_file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 putc ('\n', the_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 fflush (the_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 return fclose (the_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 static boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 open_a_file (char *name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 FILE *the_stream = fopen (name, "a");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 if (the_stream != ((FILE *) NULL))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 add_a_stream (the_stream, my_fclose);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
402 if (the_user == (char *) NULL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 file_preface = make_file_preface ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 write_line_list (file_preface, the_stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 return true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 put_string (char *s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 register stream_list rem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 for (rem = the_streams;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 rem != ((stream_list) NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 rem = rem->rest_streams)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 fputs (s, rem->handle);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
422 put_line (const char *string)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 register stream_list rem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 for (rem = the_streams;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 rem != ((stream_list) NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 rem = rem->rest_streams)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
429 const char *s = string;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 int column = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 /* Divide STRING into lines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 while (*s != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
435 const char *breakpos;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 /* Find the last char that fits. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 for (breakpos = s; *breakpos && column < 78; ++breakpos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 if (*breakpos == '\t')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 column += 8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 column++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 /* If we didn't reach end of line, break the line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 if (*breakpos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 /* Back up to just after the last comma that fits. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 while (breakpos != s && breakpos[-1] != ',') --breakpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 if (breakpos == s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 /* If no comma fits, move past the first address anyway. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 while (*breakpos != 0 && *breakpos != ',') ++breakpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 if (*breakpos != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 /* Include the comma after it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 ++breakpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 /* Output that much, then break the line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 fwrite (s, 1, breakpos - s, rem->handle);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 column = 8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 /* Skip whitespace and prepare to print more addresses. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 s = breakpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 while (*s == ' ' || *s == '\t') ++s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 if (*s != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 fputs ("\n\t", rem->handle);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 putc ('\n', rem->handle);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 #define mail_error error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 setup_files (register line_list the_list, register char *field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 register char *start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 register char c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 while (true)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 while (((c = *field) != '\0') &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 ((c == ' ') ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (c == '\t') ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 (c == ',')))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 field += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 if (c != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 start = field;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 while (((c = *field) != '\0') &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 (c != ' ') &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 (c != '\t') &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 (c != ','))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 field += 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 *field = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 if (!open_a_file (start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 mail_error ("Could not open file %s", start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 *field = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 if (c != '\0') continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 if (the_list == ((line_list) NULL)) return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 field = the_list->string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 the_list = the_list->continuation;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 args_size (header the_header)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 register header old = the_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 register line_list rem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 register int size = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 {
4932
8b63e21b0436 fix compile issues with gcc 4
Ben Wing <ben@xemacs.org>
parents: 4759
diff changeset
517 char *field = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 register char *keyword = get_keyword (the_header->text->string, &field);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 if ((strcmp (keyword, "TO") == 0) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 (strcmp (keyword, "CC") == 0) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 (strcmp (keyword, "BCC") == 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 size += 1 + strlen (field);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 for (rem = the_header->text->continuation;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 rem != NIL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 rem = rem->continuation)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 size += 1 + strlen (rem->string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 the_header = the_header->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 } while (the_header != old);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 return size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 parse_header (header the_header, register char *where)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 register header old = the_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 {
4932
8b63e21b0436 fix compile issues with gcc 4
Ben Wing <ben@xemacs.org>
parents: 4759
diff changeset
540 char *field = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 register char *keyword = get_keyword (the_header->text->string, &field);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 if (strcmp (keyword, "TO") == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 where = add_field (the_header->text->continuation, field, where);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 else if (strcmp (keyword, "CC") == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 where = add_field (the_header->text->continuation, field, where);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 else if (strcmp (keyword, "BCC") == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 where = add_field (the_header->text->continuation, field, where);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 the_header->previous->next = the_header->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 the_header->next->previous = the_header->previous;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 else if (strcmp (keyword, "FCC") == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 setup_files (the_header->text->continuation, field);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 the_header = the_header->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 } while (the_header != old);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 *where = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 static header
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 read_header (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 register header the_header = ((header) NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 register line_list *next_line = ((line_list *) NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 init_linebuffer (&lb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 long length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 register char *line;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 readline (&lb, stdin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 line = lb.buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 length = strlen (line);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 if (length == 0) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 if (has_keyword (line))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 register header old = the_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 the_header = new_header ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 if (old == ((header) NULL))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 the_header->next = the_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 the_header->previous = the_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 the_header->previous = old;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 the_header->next = old->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 old->next = the_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 next_line = &(the_header->text);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 if (next_line == ((line_list *) NULL))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 /* Not a valid header */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 *next_line = new_list ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 (*next_line)->string = alloc_string ((size_t) length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 strcpy (((*next_line)->string), line);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 next_line = &((*next_line)->continuation);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 *next_line = NIL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 } while (true);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 return the_header->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 write_header (header the_header)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 register header old = the_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 register line_list the_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 for (the_list = the_header->text;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 the_list != NIL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 the_list = the_list->continuation)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 put_line (the_list->string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 the_header = the_header->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 } while (the_header != old);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 put_line ("");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 main (int argc, char *argv[])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 char *command_line;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 header the_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 long name_length;
4759
aa5ed11f473b Remove support for obsolete systems. See xemacs-patches message with ID
Jerry James <james@xemacs.org>
parents: 2687
diff changeset
635 const char *mail_program_name;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 char buf[BUFLEN + 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 register int size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 FILE *the_pipe;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 mail_program_name = getenv ("FAKEMAILER");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 if (!(mail_program_name && *mail_program_name))
4759
aa5ed11f473b Remove support for obsolete systems. See xemacs-patches message with ID
Jerry James <james@xemacs.org>
parents: 2687
diff changeset
642 mail_program_name = MAIL_PROGRAM_NAME;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 name_length = strlen (mail_program_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 my_name = MY_NAME;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 the_streams = ((stream_list) NULL);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
647 the_date = (char *) NULL;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
648 the_user = (char *) NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 the_header = read_header ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 command_line = alloc_string ((size_t) (name_length +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 args_size (the_header)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 strcpy (command_line, mail_program_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 parse_header (the_header, &command_line[name_length]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 the_pipe = popen (command_line, "w");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 if (the_pipe == ((FILE *) NULL))
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
658 fatal ("cannot open pipe to real mailer", (char *) NULL);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 add_a_stream (the_pipe, pclose);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 write_header (the_header);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 /* Dump the message itself */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 while (!feof (stdin))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 size = fread (buf, 1, BUFLEN, stdin);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 buf[size] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 put_string (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 return close_the_streams ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 #endif /* not BSD 4.2 (or newer) */