annotate src/prepstdreply.c @ 742:b00eb39643c1

Changes to how $originalmail$ works - No longer buffer the whole mail in memory, but copy a line at a time - Allow a line-count - Change to the indent/whitespace behaviour; to essentially get current behaviour, a space must be prepended to the lines currently containing $originalmail$ in the listtexts The interface to substitute() and substitute_one() has changed. They no longer take the original mail filename, and cannot be used to do $originalmail$ substitution. This was never used except by prepstdreply() which now incorporates that substitution itself.
author Ben Schmidt
date Mon, 20 Sep 2010 02:05:31 +1000
parents b72bcb7e08a2
children 5edfa9eef6c7
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;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
197 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
198
652
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
199 if ((infd = open_listtext(listdir, filename)) < 0) {
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
200 return NULL;
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
201 }
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
202
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
203 listaddr = getlistaddr(listdir);
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
204 listdelim = getlistdelim(listdir);
641
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
205 listfqdn = genlistfqdn(listaddr);
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
206
278
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
207 do {
281
97634188c50c standard replies did not work before
mmj
parents: 278
diff changeset
208 tmp = random_str();
278
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
209 myfree(retstr);
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
210 retstr = concatstr(3, listdir, "/queue/", tmp);
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
211 myfree(tmp);
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
212
281
97634188c50c standard replies did not work before
mmj
parents: 278
diff changeset
213 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
214
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
215 } while ((outfd < 0) && (errno == EEXIST));
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
216
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
217 if(outfd < 0) {
281
97634188c50c standard replies did not work before
mmj
parents: 278
diff changeset
218 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
219 myfree(listaddr);
520
734ce7aa42bb 1.2.9-RC1 with recipdelim patch
mmj
parents: 518
diff changeset
220 myfree(listdelim);
641
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
221 myfree(listfqdn);
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
222 return NULL;
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
223 }
359
ca217febcfbd Rerwrite the way listtexts are handled and move Subject: out into the file
mmj
parents: 281
diff changeset
224
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
225 tmp = substitute(from, listaddr, listdelim,
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
226 tokencount, data);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
227 headers[0] = concatstr(2, "From: ", tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
228 myfree(tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
229 tmp = substitute(to, listaddr, listdelim,
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
230 tokencount, data);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
231 headers[1] = concatstr(2, "To: ", tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
232 myfree(tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
233 headers[2] = genmsgid(listfqdn);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
234 chomp(headers[2]);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
235 headers[3] = gendatestr();
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
236 chomp(headers[3]);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
237 headers[4] = mystrdup("Subject: mlmmj administrivia");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
238 headers[5] = mystrdup("MIME-Version: 1.0");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
239 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
240 headers[7] = mystrdup("Content-Transfer-Encoding: 8bit");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
241
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
242 if(replyto) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
243 tmp = substitute(replyto, listaddr, listdelim,
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
244 tokencount, data);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
245 headers[8] = concatstr(2, "Reply-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 }
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
248
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
249 for(;;) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
250 line = mygetline(infd);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
251 if (!line) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
252 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
253 filename);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
254 break;
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 (*line == '\n') {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
257 /* end of headers */
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
258 myfree(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
259 line = NULL;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
260 break;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
261 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
262 chomp(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
263 if (*line == ' ' || *line == '\t') {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
264 /* line beginning with linear whitespace is a
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
265 continuation of previous header line */
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
266 utfsub = unistr_escaped_to_utf8(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
267 str = substitute(utfsub, listaddr, listdelim,
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
268 tokencount, data);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
269 myfree(utfsub);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
270 len = strlen(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
271 str[len] = '\n';
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
272 if(writen(outfd, str, len+1) < 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
273 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
274 myfree(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
275 myfree(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
276 myfree(listaddr);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
277 myfree(listdelim);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
278 myfree(listfqdn);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
279 return NULL;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
280 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
281 myfree(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
282 } else {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
283 tmp = line;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
284 len = 0;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
285 while (*tmp && *tmp != ':') {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
286 tmp++;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
287 len++;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
288 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
289 if (!*tmp) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
290 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
291 "header in '%s' listtext",
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
292 filename);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
293 break;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
294 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
295 tmp++;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
296 len++;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
297 /* remove the standard header if one matches */
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
298 for (i=0; headers[i] != NULL; i++) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
299 if (strncasecmp(line, headers[i], len) == 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
300 myfree(headers[i]);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
301 while (headers[i] != NULL) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
302 headers[i] = headers[i+1];
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
303 i++;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
304 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
305 break;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
306 }
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 utfsub = unistr_escaped_to_utf8(tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
309 *tmp = '\0';
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
310 utfsub2 = substitute(utfsub, listaddr, listdelim,
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
311 tokencount, data);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
312 myfree(utfsub);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
313 if (strncasecmp(line, "Subject:", len) == 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
314 tmp = unistr_utf8_to_header(utfsub2);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
315 myfree(utfsub2);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
316 str = concatstr(2, line, tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
317 myfree(tmp);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
318 } else {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
319 str = concatstr(2, line, utfsub2);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
320 myfree(utfsub2);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
321 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
322 len = strlen(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
323 str[len] = '\n';
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
324 if(writen(outfd, str, len+1) < 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
325 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
326 myfree(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
327 myfree(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
328 myfree(listaddr);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
329 myfree(listdelim);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
330 myfree(listfqdn);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
331 return NULL;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
332 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
333 myfree(str);
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 myfree(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
336 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
337
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
338 for (i=0; headers[i] != NULL; i++) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
339 len = strlen(headers[i]);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
340 headers[i][len] = '\n';
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
341 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
342 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
343 if (line)
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
344 myfree(line);
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 myfree(listaddr);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
347 myfree(listdelim);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
348 myfree(listfqdn);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
349 return NULL;
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
350 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
351 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
352
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
353 /* end the headers */
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
354 if(writen(outfd, "\n", 1) < 0) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
355 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
356 myfree(str);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
357 if (line)
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
358 myfree(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
359 myfree(listaddr);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
360 myfree(listdelim);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
361 myfree(listfqdn);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
362 return NULL;
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
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
365 if (line) {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
366 str = concatstr(2, line, "\n");
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
367 myfree(line);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
368 } else {
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
369 str = mygetline(infd);
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
370 }
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
371 while(str) {
652
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
372 utfline = unistr_escaped_to_utf8(str);
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
373 myfree(str);
652
00a1c5697fa6 Added unicode support to listtexts
mortenp
parents: 646
diff changeset
374
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
375 tmp = utfline;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
376 while (*tmp && (*tmp == ' ' || *tmp == '\t')) {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
377 tmp++;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
378 }
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
379 if (strncmp(tmp,"$originalmail",13) == 0) {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
380 *tmp = '\0';
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
381 tmp += 13;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
382 str = tmp;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
383 while (*tmp >= '0' && *tmp <= '9')
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
384 tmp++;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
385 if (*tmp == '$') {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
386 *tmp = '\0';
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
387 len = 100;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
388 if (str != tmp)
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
389 len = atol(str);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
390 if (mailname &&
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
391 ((mailfd = open(mailname, O_RDONLY)) > 0)){
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
392 str = NULL;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
393 i = 0;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
394 while (i < len &&
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
395 (str = mygetline(mailfd))) {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
396 tmp = str;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
397 str = concatstr(2,utfline,str);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
398 myfree(tmp);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
399 if(writen(outfd,str,strlen(str)) < 0) {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
400 myfree(str);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
401 myfree(utfline);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
402 myfree(listaddr);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
403 myfree(listdelim);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
404 myfree(listfqdn);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
405 log_error(LOG_ARGS, "Could not write std mail");
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
406 return NULL;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
407 }
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
408 myfree(str);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
409 i++;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
410 }
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
411 close(mailfd);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
412 } else {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
413 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
414 }
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
415 } else {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
416 log_error(LOG_ARGS, "Bad $originalmailNNN$ substitution");
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
417 }
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
418 myfree(utfline);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
419 } else {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
420 str = substitute(utfline, listaddr, listdelim,
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
421 tokencount, data);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
422 myfree(utfline);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
423 if(writen(outfd, str, strlen(str)) < 0) {
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
424 myfree(str);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
425 myfree(listaddr);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
426 myfree(listdelim);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
427 myfree(listfqdn);
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
428 log_error(LOG_ARGS, "Could not write std mail");
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
429 return NULL;
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
430 }
278
45501498e5a8 Another EEXIST check and some myfree's added
mmj
parents: 264
diff changeset
431 myfree(str);
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
432 }
742
b00eb39643c1 Changes to how $originalmail$ works
Ben Schmidt
parents: 741
diff changeset
433
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
434 str = mygetline(infd);
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
435 }
741
b72bcb7e08a2 Arbitrary headers in listtexts, fix default Content-Transfer-Encoding: header,
Ben Schmidt
parents: 716
diff changeset
436
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
437 fsync(outfd);
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
438 close(outfd);
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
439
641
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
440 myfree(listaddr);
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
441 myfree(listdelim);
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
442 myfree(listfqdn);
436eea81bc20 Changed Message-ID headers to include FQDN (Ansgar Burchardt)
mortenp
parents: 610
diff changeset
443
189
cb46caab2621 New function to prepare a standard mail in an easy way, and make send_help
mmj
parents:
diff changeset
444 return retstr;
245
00eadc106b34 changed to use the new memory wrappers
mortenp
parents: 225
diff changeset
445 }