annotate src/prepstdreply.c @ 745:5edfa9eef6c7

Add $random0$ through $random5$ substitutions
author Ben Schmidt
date Mon, 20 Sep 2010 02:31:03 +1000
parents b00eb39643c1
children ecb991e41a4c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
190
c37f95babe75 Add GPL header
mmj
parents: 189
diff changeset
1 /* Copyright (C) 2004 Mads Martin Joergensen <mmj at mmj.dk>
652
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
2 * Copyright (C) 2007 Morten K. Poulsen <morten at afdelingp.dk>
190
c37f95babe75 Add GPL header
mmj
parents: 189
diff changeset
3 *
c37f95babe75 Add GPL header
mmj
parents: 189
diff changeset
4 * $Id$
c37f95babe75 Add GPL header
mmj
parents: 189
diff changeset
5 *
225
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
7 * of this software and associated documentation files (the "Software"), to
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
8 * deal in the Software without restriction, including without limitation the
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
10 * sell copies of the Software, and to permit persons to whom the Software is
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
11 * furnished to do so, subject to the following conditions:
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
12 *
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
13 * The above copyright notice and this permission notice shall be included in
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
14 * all copies or substantial portions of the Software.
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
15 *
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
3f177909efc8 Goodbye GPL license, Welcome MIT
mmj
parents: 190
diff changeset
22 * IN THE SOFTWARE.
190
c37f95babe75 Add GPL header
mmj
parents: 189
diff changeset
23 */
c37f95babe75 Add GPL header
mmj
parents: 189
diff changeset
24
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
25 #include <stdlib.h>
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
26 #include <stdio.h>
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
27 #include <unistd.h>
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
28 #include <sys/types.h>
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
29 #include <sys/stat.h>
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
30 #include <fcntl.h>
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
31 #include <string.h>
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
32 #include <errno.h>
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
33
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
34 #include "prepstdreply.h"
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
35 #include "strgen.h"
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
36 #include "chomp.h"
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
37 #include "log_error.h"
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
38 #include "mygetline.h"
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
39 #include "wrappers.h"
245
00eadc106b34 changed to use the new memory wrappers
mortenp
parents: 225
diff changeset
40 #include "memory.h"
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
41 #include "getlistaddr.h"
518
f745db86c61c free() -> myfree()
mmj
parents: 422
diff changeset
42 #include "mlmmj.h"
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
43 #include "getlistdelim.h"
652
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
44 #include "unistr.h"
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
45
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
46 char *substitute(const char *line, const char *listaddr, const char *listdelim,
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
47 size_t datacount, char **data)
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
48 {
365
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
49 char *s1, *s2;
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
50
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
51 s1 = substitute_one(line, listaddr, listdelim, datacount, data);
365
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
52 while(s1) {
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
53 s2 = substitute_one(s1, listaddr, listdelim, datacount, data);
365
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
54 if(s2) {
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
55 myfree(s1);
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
56 s1 = s2;
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
57 } else
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
58 return s1;
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
59 }
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
60
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
61 return mystrdup(line);
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
62 }
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
63
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
64 char *substitute_one(const char *line, const char *listaddr,
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
65 const char *listdelim, size_t datacount, char **data)
365
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
66 {
363
000cf869301c Further fixups to new prepstdreply. Seems to work now, needs more testing though
mmj
parents: 362
diff changeset
67 char *fqdn, *listname, *d1, *d2, *token, *value = NULL;
365
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
68 char *retstr, *origline;
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
69 size_t len, i;
365
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
70
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
71 if(line == NULL)
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
72 return NULL;
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
73
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
74 origline = mystrdup(line);
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
75
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
76 d1 = strchr(origline, '$');
362
4c1afa9908ab *GRRR* FFS
mmj
parents: 361
diff changeset
77
365
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
78 if(d1 == NULL) {
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
79 myfree(origline);
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
80 return NULL;
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
81 } else
362
4c1afa9908ab *GRRR* FFS
mmj
parents: 361
diff changeset
82 d2 = strchr(d1 + 1, '$');
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
83
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
84 if(d1 && d2) {
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
85 len = d2 - d1;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
86 token = mymalloc(len + 1);
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
87 snprintf(token, len, "%s", d1 + 1);
365
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
88 } else {
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
89 myfree(origline);
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
90 return NULL;
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
91 }
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
92
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
93 *d1 = '\0';
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
94
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
95 fqdn = genlistfqdn(listaddr);
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
96 listname = genlistname(listaddr);
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
97
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
98 if(strcmp(token, "listaddr") == 0) {
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
99 value = mystrdup(listaddr);
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
100 goto concatandreturn;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
101 } else if(strcmp(token, "listowner") == 0) {
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
102 value = concatstr(4, listname, listdelim, "owner@", fqdn);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
103 goto concatandreturn;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
104 } else if(strcmp(token, "helpaddr") == 0) {
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
105 value = concatstr(4, listname, listdelim, "help@", fqdn);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
106 goto concatandreturn;
610
af32f7ed5d3d Added list FAQ feature (Henne Vogelsang)
mortenp
parents: 607
diff changeset
107 } else if(strcmp(token, "faqaddr") == 0) {
af32f7ed5d3d Added list FAQ feature (Henne Vogelsang)
mortenp
parents: 607
diff changeset
108 value = concatstr(4, listname, listdelim, "faq@", fqdn);
af32f7ed5d3d Added list FAQ feature (Henne Vogelsang)
mortenp
parents: 607
diff changeset
109 goto concatandreturn;
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
110 } else if(strcmp(token, "listgetN") == 0) {
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
111 value = concatstr(4, listname, listdelim, "get-N@", fqdn);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
112 goto concatandreturn;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
113 } else if(strcmp(token, "listunsubaddr") == 0) {
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
114 value = concatstr(4, listname, listdelim, "unsubscribe@", fqdn);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
115 goto concatandreturn;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
116 } else if(strcmp(token, "digestunsubaddr") == 0) {
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
117 value = concatstr(4, listname, listdelim,
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
118 "unsubscribe-digest@", fqdn);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
119 goto concatandreturn;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
120 } else if(strcmp(token, "nomailunsubaddr") == 0) {
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
121 value = concatstr(4, listname, listdelim,
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
122 "unsubscribe-nomail@", fqdn);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
123 goto concatandreturn;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
124 } else if(strcmp(token, "listsubaddr") == 0) {
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
125 value = concatstr(4, listname, listdelim, "subscribe@", fqdn);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
126 goto concatandreturn;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
127 } else if(strcmp(token, "digestsubaddr") == 0) {
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
128 value = concatstr(4, listname, listdelim, "subscribe-digest@",
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
129 fqdn);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
130 goto concatandreturn;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
131 } else if(strcmp(token, "nomailsubaddr") == 0) {
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
132 value = concatstr(4, listname, listdelim, "subscribe-nomail@",
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
133 fqdn);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
134 goto concatandreturn;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
135 }
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
136 if(data) {
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
137 for(i = 0; i < datacount; i++) {
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
138 if(strcmp(token, data[i*2]) == 0) {
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
139 value = mystrdup(data[(i*2)+1]);
365
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
140 goto concatandreturn;
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
141 }
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
142 }
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
143 }
365
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
144
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
145 myfree(origline);
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
146 return NULL;
24a86824b6b8 Substitute all of them and convert moderation to prepstdreply
mmj
parents: 364
diff changeset
147
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
148 concatandreturn:
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
149 retstr = concatstr(3, origline, value, d2 + 1);
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
150 myfree(origline);
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
151 myfree(value);
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
152 myfree(token);
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
153 myfree(fqdn);
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
154 myfree(listname);
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
155
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
156 return retstr;
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
157 }
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
158
652
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
159
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
160 int open_listtext(const char *listdir, const char *filename)
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
161 {
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
162 char *tmp;
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
163 int fd;
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
164
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
165 tmp = concatstr(3, listdir, "/text/", filename);
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
166 fd = open(tmp, O_RDONLY);
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
167 myfree(tmp);
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
168 if (fd >= 0)
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
169 return fd;
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
170
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
171 tmp = concatstr(2, DEFAULTTEXTDIR "/default/", filename);
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
172 fd = open(tmp, O_RDONLY);
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
173 myfree(tmp);
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
174 if (fd >= 0)
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
175 return fd;
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
176
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
177 tmp = concatstr(2, DEFAULTTEXTDIR "/en/", filename);
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
178 fd = open(tmp, O_RDONLY);
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
179 myfree(tmp);
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
180 if (fd >= 0)
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
181 return fd;
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
182
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
183 log_error(LOG_ARGS, "Could not open listtext '%s'", filename);
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
184 return -1;
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
185 }
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
186
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
187
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
188 char *prepstdreply(const char *listdir, const char *filename, const char *from,
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
189 const char *to, const char *replyto, size_t tokencount,
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
190 char **data, const char *mailname)
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
191 {
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
192 size_t i, len;
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
193 int infd, outfd, mailfd;
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
194 char *listaddr, *listdelim, *tmp, *retstr = NULL;
652
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
195 char *listfqdn, *line, *utfline, *utfsub, *utfsub2;
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
196 char *str = NULL;
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
197 char **moredata;
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
198 char *headers[10] = { NULL }; /* relies on NULL to flag end */
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
199
652
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
200 if ((infd = open_listtext(listdir, filename)) < 0) {
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
201 return NULL;
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
202 }
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
203
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
204 listaddr = getlistaddr(listdir);
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
205 listdelim = getlistdelim(listdir);
641
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
206 listfqdn = genlistfqdn(listaddr);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
207
278
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
208 do {
281
97634188c50c standard replies did not work before
mmj
parents: 278
diff changeset
209 tmp = random_str();
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
210 if (retstr)
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
211 myfree(retstr);
278
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
212 retstr = concatstr(3, listdir, "/queue/", tmp);
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
213 myfree(tmp);
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
214
281
97634188c50c standard replies did not work before
mmj
parents: 278
diff changeset
215 outfd = open(retstr, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
278
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
216
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
217 } while ((outfd < 0) && (errno == EEXIST));
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
218
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
219 if(outfd < 0) {
281
97634188c50c standard replies did not work before
mmj
parents: 278
diff changeset
220 log_error(LOG_ARGS, "Could not open std mail %s", retstr);
641
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
221 myfree(listaddr);
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
222 myfree(listdelim);
641
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
223 myfree(listfqdn);
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
224 myfree(retstr);
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
225 return NULL;
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
226 }
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
227
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
228 moredata = mymalloc(2*(tokencount+6) * sizeof(char *));
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
229 for (i=0; i<2*tokencount; i++) {
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
230 moredata[i] = data[i];
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
231 }
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
232 for (i=0; i<6; i++) {
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
233 moredata[2*(tokencount+i)] = mystrdup("randomN");
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
234 moredata[2*(tokencount+i)][6] = '0' + i;
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
235 moredata[2*(tokencount+i)+1] = random_str();
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
236 }
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
237 tokencount += 6;
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
238
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
239 tmp = substitute(from, listaddr, listdelim,
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
240 tokencount, moredata);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
241 headers[0] = concatstr(2, "From: ", tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
242 myfree(tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
243 tmp = substitute(to, listaddr, listdelim,
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
244 tokencount, moredata);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
245 headers[1] = concatstr(2, "To: ", tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
246 myfree(tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
247 headers[2] = genmsgid(listfqdn);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
248 chomp(headers[2]);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
249 headers[3] = gendatestr();
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
250 chomp(headers[3]);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
251 headers[4] = mystrdup("Subject: mlmmj administrivia");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
252 headers[5] = mystrdup("MIME-Version: 1.0");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
253 headers[6] = mystrdup("Content-Type: text/plain; charset=utf-8");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
254 headers[7] = mystrdup("Content-Transfer-Encoding: 8bit");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
255
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
256 if(replyto) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
257 tmp = substitute(replyto, listaddr, listdelim,
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
258 tokencount, moredata);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
259 headers[8] = concatstr(2, "Reply-To: ", tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
260 myfree(tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
261 }
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
262
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
263 for(;;) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
264 line = mygetline(infd);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
265 if (!line) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
266 log_error(LOG_ARGS, "No body in '%s' listtext",
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
267 filename);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
268 break;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
269 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
270 if (*line == '\n') {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
271 /* end of headers */
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
272 myfree(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
273 line = NULL;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
274 break;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
275 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
276 chomp(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
277 if (*line == ' ' || *line == '\t') {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
278 /* line beginning with linear whitespace is a
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
279 continuation of previous header line */
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
280 utfsub = unistr_escaped_to_utf8(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
281 str = substitute(utfsub, listaddr, listdelim,
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
282 tokencount, moredata);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
283 myfree(utfsub);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
284 len = strlen(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
285 str[len] = '\n';
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
286 if(writen(outfd, str, len+1) < 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
287 log_error(LOG_ARGS, "Could not write std mail");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
288 myfree(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
289 myfree(line);
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
290 myfree(retstr);
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
291 retstr = NULL;
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
292 goto freeandreturn;
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
293 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
294 myfree(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
295 } else {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
296 tmp = line;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
297 len = 0;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
298 while (*tmp && *tmp != ':') {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
299 tmp++;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
300 len++;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
301 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
302 if (!*tmp) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
303 log_error(LOG_ARGS, "No headers or invalid "
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
304 "header in '%s' listtext",
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
305 filename);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
306 break;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
307 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
308 tmp++;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
309 len++;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
310 /* remove the standard header if one matches */
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
311 for (i=0; headers[i] != NULL; i++) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
312 if (strncasecmp(line, headers[i], len) == 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
313 myfree(headers[i]);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
314 while (headers[i] != NULL) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
315 headers[i] = headers[i+1];
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
316 i++;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
317 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
318 break;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
319 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
320 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
321 utfsub = unistr_escaped_to_utf8(tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
322 *tmp = '\0';
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
323 utfsub2 = substitute(utfsub, listaddr, listdelim,
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
324 tokencount, moredata);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
325 myfree(utfsub);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
326 if (strncasecmp(line, "Subject:", len) == 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
327 tmp = unistr_utf8_to_header(utfsub2);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
328 myfree(utfsub2);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
329 str = concatstr(2, line, tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
330 myfree(tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
331 } else {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
332 str = concatstr(2, line, utfsub2);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
333 myfree(utfsub2);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
334 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
335 len = strlen(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
336 str[len] = '\n';
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
337 if(writen(outfd, str, len+1) < 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
338 log_error(LOG_ARGS, "Could not write std mail");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
339 myfree(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
340 myfree(line);
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
341 myfree(retstr);
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
342 retstr = NULL;
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
343 goto freeandreturn;
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
344 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
345 myfree(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
346 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
347 myfree(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
348 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
349
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
350 for (i=0; headers[i] != NULL; i++) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
351 len = strlen(headers[i]);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
352 headers[i][len] = '\n';
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
353 if(writen(outfd, headers[i], len+1) < 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
354 log_error(LOG_ARGS, "Could not write std mail");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
355 if (line)
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
356 myfree(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
357 myfree(str);
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
358 myfree(retstr);
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
359 retstr = NULL;
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
360 goto freeandreturn;
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
361 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
362 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
363
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
364 /* end the headers */
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
365 if(writen(outfd, "\n", 1) < 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
366 log_error(LOG_ARGS, "Could not write std mail");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
367 myfree(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
368 if (line)
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
369 myfree(line);
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
370 myfree(retstr);
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
371 retstr = NULL;
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
372 goto freeandreturn;
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
373 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
374
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
375 if (line) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
376 str = concatstr(2, line, "\n");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
377 myfree(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
378 } else {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
379 str = mygetline(infd);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
380 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
381 while(str) {
652
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
382 utfline = unistr_escaped_to_utf8(str);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
383 myfree(str);
652
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
384
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
385 tmp = utfline;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
386 while (*tmp && (*tmp == ' ' || *tmp == '\t')) {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
387 tmp++;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
388 }
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
389 if (strncmp(tmp,"$originalmail",13) == 0) {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
390 *tmp = '\0';
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
391 tmp += 13;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
392 str = tmp;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
393 while (*tmp >= '0' && *tmp <= '9')
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
394 tmp++;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
395 if (*tmp == '$') {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
396 *tmp = '\0';
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
397 len = 100;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
398 if (str != tmp)
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
399 len = atol(str);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
400 if (mailname &&
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
401 ((mailfd = open(mailname, O_RDONLY)) > 0)){
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
402 str = NULL;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
403 i = 0;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
404 while (i < len &&
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
405 (str = mygetline(mailfd))) {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
406 tmp = str;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
407 str = concatstr(2,utfline,str);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
408 myfree(tmp);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
409 if(writen(outfd,str,strlen(str)) < 0) {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
410 myfree(str);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
411 myfree(utfline);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
412 log_error(LOG_ARGS, "Could not write std mail");
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
413 myfree(retstr);
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
414 retstr = NULL;
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
415 goto freeandreturn;
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
416 }
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
417 myfree(str);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
418 i++;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
419 }
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
420 close(mailfd);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
421 } else {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
422 log_error(LOG_ARGS, "Could not substitute $originalmail%d$ (mailname == %s)",len,mailname);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
423 }
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
424 } else {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
425 log_error(LOG_ARGS, "Bad $originalmailNNN$ substitution");
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
426 }
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
427 myfree(utfline);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
428 } else {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
429 str = substitute(utfline, listaddr, listdelim,
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
430 tokencount, moredata);
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
431 myfree(utfline);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
432 if(writen(outfd, str, strlen(str)) < 0) {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
433 myfree(str);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
434 log_error(LOG_ARGS, "Could not write std mail");
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
435 myfree(retstr);
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
436 retstr = NULL;
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
437 goto freeandreturn;
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
438 }
278
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
439 myfree(str);
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
440 }
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
441
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
442 str = mygetline(infd);
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
443 }
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
444
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
445 fsync(outfd);
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
446 close(outfd);
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
447
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
448 freeandreturn:
641
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
449 myfree(listaddr);
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
450 myfree(listdelim);
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
451 myfree(listfqdn);
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
452
745
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
453 for (i=tokencount-6; i<tokencount; i++) {
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
454 myfree(moredata[2*i]);
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
455 myfree(moredata[2*i+1]);
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
456 }
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
457 myfree(moredata);
5edfa9eef6c7 Add $random0$ through $random5$ substitutions
Ben Schmidt
parents: 742
diff changeset
458
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
459 return retstr;
245
00eadc106b34 changed to use the new memory wrappers
mortenp
parents: 225
diff changeset
460 }