Commit c1d1ab07 c1d1ab07c72070d2ca92f729ab2454ad0b06f0ae by Sergey Poznyakoff

Bugfix.

* imap4d/append.c: Add a comment.
* imap4d/imap4d.h (imap4d_child_signal_setup): New proto.
* libmu_sieve/extensions/pipe.c (sieve_action_pipe): Use
mu_stream_copy, rewrite error handling.
* libmu_sieve/extensions/spamd.c (spamd_send_message): se
mu_stream_copy.
(spamd_test): Honor dry-run mode.
* libmu_sieve/extensions/vacation.c (build_mime): Remove
misleading FIXME. Use mu_stream_copy.
* libmu_sieve/extensions/moderator.c (moderator_message_get_part): Use
mu_body_get_streamref.
* examples/header.c (hstream): New global.
(cmd_load, cmd_free, cmd_remove, cmd_insert): Discard hstream.
(cmd_readline): Use hstream. Obtain it using mu_stream_readline.
* libproto/mbox/mbox.c (mbox_envelope_date): Remove trailing
newline from the obtained envelope line.
* mailbox/amd.c (amd_body_stream_seek): Allow for off == size
(imprtant for empty bodies).
1 parent 3ffda3e1
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
28 char *file; 28 char *file;
29 mu_header_t header; 29 mu_header_t header;
30 mu_iterator_t iterator; 30 mu_iterator_t iterator;
31 mu_stream_t hstream;
31 32
32 char *ps[] = { "> ", ". " }; 33 char *ps[] = { "> ", ". " };
33 int interactive; 34 int interactive;
...@@ -124,6 +125,7 @@ cmd_load (int argc, char **argv) ...@@ -124,6 +125,7 @@ cmd_load (int argc, char **argv)
124 { 125 {
125 if (check_args (argv[0], argc, 2, 2)) 126 if (check_args (argv[0], argc, 2, 2))
126 return; 127 return;
128 mu_stream_destroy (&hstream);
127 mu_header_destroy (&header); 129 mu_header_destroy (&header);
128 load_file (argv[1]); 130 load_file (argv[1]);
129 } 131 }
...@@ -134,6 +136,7 @@ cmd_free (int argc, char **argv) ...@@ -134,6 +136,7 @@ cmd_free (int argc, char **argv)
134 if (check_args (argv[0], argc, 1, 1)) 136 if (check_args (argv[0], argc, 1, 1))
135 return; 137 return;
136 mu_iterator_destroy (&iterator); 138 mu_iterator_destroy (&iterator);
139 mu_stream_destroy (&hstream);
137 mu_header_destroy (&header); 140 mu_header_destroy (&header);
138 } 141 }
139 142
...@@ -211,6 +214,7 @@ cmd_remove (int argc, char **argv) ...@@ -211,6 +214,7 @@ cmd_remove (int argc, char **argv)
211 status = mu_header_remove (header, fn, num); 214 status = mu_header_remove (header, fn, num);
212 if (status) 215 if (status)
213 mu_error ("%u: %s: %s", line_num, argv[0], mu_strerror (status)); 216 mu_error ("%u: %s: %s", line_num, argv[0], mu_strerror (status));
217 mu_stream_destroy (&hstream);
214 } 218 }
215 219
216 /* insert header value [ref [num] [before|after] [replace]] */ 220 /* insert header value [ref [num] [before|after] [replace]] */
...@@ -260,6 +264,7 @@ cmd_insert (int argc, char **argv) ...@@ -260,6 +264,7 @@ cmd_insert (int argc, char **argv)
260 } 264 }
261 status = mu_header_insert (header, argv[1], argv[2], 265 status = mu_header_insert (header, argv[1], argv[2],
262 ref, num, flags); 266 ref, num, flags);
267 mu_stream_destroy (&hstream);
263 if (status) 268 if (status)
264 mu_error ("%u: %s: %s", line_num, argv[0], mu_strerror (status)); 269 mu_error ("%u: %s: %s", line_num, argv[0], mu_strerror (status));
265 } 270 }
...@@ -289,6 +294,7 @@ cmd_write (int argc, char **argv) ...@@ -289,6 +294,7 @@ cmd_write (int argc, char **argv)
289 break; 294 break;
290 } 295 }
291 mu_stream_destroy (&str); 296 mu_stream_destroy (&str);
297 mu_stream_destroy (&hstream);
292 } 298 }
293 299
294 void 300 void
...@@ -341,18 +347,19 @@ void ...@@ -341,18 +347,19 @@ void
341 cmd_readline (int argc, char **argv) 347 cmd_readline (int argc, char **argv)
342 { 348 {
343 char *buf; 349 char *buf;
344 size_t size; 350 size_t size = 128;
345 mu_stream_t stream;
346 size_t nbytes; 351 size_t nbytes;
347 352
348 if (check_args (argv[0], argc, 1, 2)) 353 if (check_args (argv[0], argc, 1, 2))
349 return; 354 return;
350 size = atoi (argv[1]); 355 if (argc == 2)
356 size = atoi (argv[1]);
351 buf = malloc (size); 357 buf = malloc (size);
352 if (!buf) 358 if (!buf)
353 abort (); 359 abort ();
354 mu_header_get_stream (header, &stream); 360 if (!hstream)
355 mu_stream_readline (stream, buf, size, &nbytes); 361 mu_header_get_streamref (header, &hstream);
362 mu_stream_readline (hstream, buf, size, &nbytes);
356 printf ("\"%*.*s\"", (int) nbytes, (int) nbytes, buf); 363 printf ("\"%*.*s\"", (int) nbytes, (int) nbytes, buf);
357 free (buf); 364 free (buf);
358 } 365 }
......
...@@ -45,6 +45,7 @@ _append_sender (mu_envelope_t envelope, char *buf, size_t len, size_t *pnwrite) ...@@ -45,6 +45,7 @@ _append_sender (mu_envelope_t envelope, char *buf, size_t len, size_t *pnwrite)
45 return 0; 45 return 0;
46 } 46 }
47 47
48 /* FIXME: Why not use mu_message_size instead? */
48 static int 49 static int
49 _append_size (mu_message_t msg, size_t *psize) 50 _append_size (mu_message_t msg, size_t *psize)
50 { 51 {
......
...@@ -322,6 +322,7 @@ extern char *namespace_checkfullpath (const char *name, const char *pattern, ...@@ -322,6 +322,7 @@ extern char *namespace_checkfullpath (const char *name, const char *pattern,
322 const char *delim, int *pns); 322 const char *delim, int *pns);
323 int imap4d_session_setup (char *username); 323 int imap4d_session_setup (char *username);
324 int imap4d_session_setup0 (void); 324 int imap4d_session_setup0 (void);
325 void imap4d_child_signal_setup (RETSIGTYPE (*handler) (int signo));
325 326
326 /* Capability functions */ 327 /* Capability functions */
327 extern void imap4d_capability_add (const char *str); 328 extern void imap4d_capability_add (const char *str);
......
...@@ -213,7 +213,7 @@ moderator_message_get_part (mu_sieve_machine_t mach, ...@@ -213,7 +213,7 @@ moderator_message_get_part (mu_sieve_machine_t mach,
213 213
214 free (value); 214 free (value);
215 mu_message_get_body (tmp, &body); 215 mu_message_get_body (tmp, &body);
216 mu_body_get_stream (body, &str); 216 mu_body_get_streamref (body, &str);
217 217
218 rc = mu_stream_to_message (str, pmsg); 218 rc = mu_stream_to_message (str, pmsg);
219 if (rc) 219 if (rc)
...@@ -223,6 +223,7 @@ moderator_message_get_part (mu_sieve_machine_t mach, ...@@ -223,6 +223,7 @@ moderator_message_get_part (mu_sieve_machine_t mach,
223 mu_strerror (rc)); 223 mu_strerror (rc));
224 return 1; 224 return 1;
225 } 225 }
226 mu_stream_destroy (&str);
226 } 227 }
227 else if (value) 228 else if (value)
228 { 229 {
......
...@@ -21,9 +21,9 @@ ...@@ -21,9 +21,9 @@
21 The pipe action executes a shell command specified by its 21 The pipe action executes a shell command specified by its
22 argument and pipes the entire message to its standard input. 22 argument and pipes the entire message to its standard input.
23 The envelope of the message is included, if the :envelope tag is given. 23 The envelope of the message is included, if the :envelope tag is given.
24 24
25 Notes/FIXME: 1. it would be nice to implement meta-variables in 25 Notes/FIXME: 1. it would be nice to implement meta-variables in
26 <program call> which would expand to various 26 <program call> which would expand to various
27 items from the message being handled. 27 items from the message being handled.
28 2. :mime tag could be useful too. 28 2. :mime tag could be useful too.
29 */ 29 */
...@@ -41,38 +41,6 @@ ...@@ -41,38 +41,6 @@
41 #include <regex.h> 41 #include <regex.h>
42 #include <mailutils/sieve.h> 42 #include <mailutils/sieve.h>
43 43
44 #define ASSERT(expr, diag, ec) \
45 if (!(expr)) \
46 { \
47 if (ec) \
48 mu_sieve_error (mach, "%lu: %s: %s", \
49 (unsigned long) mu_sieve_get_message_num (mach), \
50 diag, \
51 mu_strerror (ec)); \
52 else \
53 mu_sieve_error (mach, "%lu: %s", \
54 (unsigned long) mu_sieve_get_message_num (mach), \
55 diag); \
56 mu_sieve_abort (mach); \
57 }
58
59 #define ASSERT2(expr, diag, arg, ec) \
60 if (!(expr)) \
61 { \
62 if (ec) \
63 mu_sieve_error (mach, "%lu: `%s': %s: %s", \
64 (unsigned long) mu_sieve_get_message_num (mach), \
65 arg, \
66 diag, \
67 mu_strerror (ec)); \
68 else \
69 mu_sieve_error (mach, "%lu: `%s': %s", \
70 (unsigned long) mu_sieve_get_message_num (mach), \
71 arg, \
72 diag); \
73 mu_sieve_abort (mach); \
74 }
75
76 int 44 int
77 sieve_action_pipe (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags) 45 sieve_action_pipe (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags)
78 { 46 {
...@@ -81,12 +49,25 @@ sieve_action_pipe (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags) ...@@ -81,12 +49,25 @@ sieve_action_pipe (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags)
81 mu_sieve_value_t *val; 49 mu_sieve_value_t *val;
82 char *cmd; 50 char *cmd;
83 mu_stream_t mstr, pstr; 51 mu_stream_t mstr, pstr;
84 char buf[512];
85 size_t n;
86 mu_envelope_t env; 52 mu_envelope_t env;
87 53 const char *error_diag = NULL;
54 const char *error_arg = NULL;
55 #define ONERR(rc, diag, arg) \
56 if (rc) \
57 { \
58 error_diag = diag; \
59 error_arg = arg; \
60 break; \
61 }
62
88 val = mu_sieve_value_get (args, 0); 63 val = mu_sieve_value_get (args, 0);
89 ASSERT (val, _("cannot get command!"), 0); 64 if (!val)
65 {
66 mu_sieve_error (mach, "%lu: %s",
67 (unsigned long) mu_sieve_get_message_num (mach),
68 _("cannot get command!"));
69 mu_sieve_abort (mach);
70 }
90 cmd = val->v.string; 71 cmd = val->v.string;
91 72
92 mu_sieve_log_action (mach, "PIPE", NULL); 73 mu_sieve_log_action (mach, "PIPE", NULL);
...@@ -104,49 +85,64 @@ sieve_action_pipe (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags) ...@@ -104,49 +85,64 @@ sieve_action_pipe (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags)
104 85
105 msg = mu_sieve_get_message (mach); 86 msg = mu_sieve_get_message (mach);
106 mu_message_get_envelope (msg, &env); 87 mu_message_get_envelope (msg, &env);
107
108 rc = mu_message_get_stream (msg, &mstr);
109 ASSERT (rc == 0, _("cannot get message stream"), rc);
110
111 rc = mu_prog_stream_create (&pstr, cmd, MU_STREAM_WRITE);
112 ASSERT2 (rc == 0, _("cannot create command stream"), cmd, rc);
113 88
114 rc = mu_stream_open (pstr); 89 do
115 ASSERT2 (rc == 0, _("cannot open command stream"), cmd, rc);
116
117 if (mu_sieve_tag_lookup (tags, "envelope", &val))
118 { 90 {
119 char *p; 91 rc = mu_message_get_streamref (msg, &mstr);
120 92 ONERR (rc, _("cannot get message stream"), NULL);
121 rc = mu_envelope_aget_sender (env, &p); 93
122 ASSERT (rc == 0, _("cannot get envelope sender"), rc); 94 rc = mu_prog_stream_create (&pstr, cmd, MU_STREAM_WRITE);
123 rc = mu_stream_write (pstr, "From ", 5, NULL); 95 ONERR (rc, _("cannot create command stream"), cmd);
124 ASSERT (rc == 0, _("stream write failed"), rc); 96
125 mu_stream_write (pstr, p, strlen (p), NULL); 97 rc = mu_stream_open (pstr);
126 free (p); 98 ONERR (rc, _("cannot open command stream"), cmd);
127 rc = mu_stream_write (pstr, " ", 1, NULL); 99
128 ASSERT (rc == 0, _("stream write failed"), rc); 100 if (mu_sieve_tag_lookup (tags, "envelope", &val))
129 rc = mu_envelope_aget_date (env, &p); 101 {
130 ASSERT (rc == 0, _("cannot get envelope date"), rc); 102 char *p;
131 rc = mu_stream_write (pstr, p, strlen (p), NULL); 103
132 ASSERT (rc == 0, _("stream write failed"), rc); 104 rc = mu_envelope_aget_sender (env, &p);
133 free (p); 105 ONERR (rc, _("cannot get envelope sender"), NULL);
134 rc = mu_stream_write (pstr, "\n", 1, NULL); 106 rc = mu_stream_write (pstr, "From ", 5, NULL);
135 ASSERT (rc == 0, _("stream write failed"), rc); 107 ONERR (rc, _("stream write failed"), NULL);
108 mu_stream_write (pstr, p, strlen (p), NULL);
109 free (p);
110 rc = mu_stream_write (pstr, " ", 1, NULL);
111 ONERR (rc, _("stream write failed"), NULL);
112 rc = mu_envelope_aget_date (env, &p);
113 ONERR (rc, _("cannot get envelope date"), NULL);
114 rc = mu_stream_write (pstr, p, strlen (p), NULL);
115 ONERR (rc, _("stream write failed"), NULL);
116 free (p);
117 rc = mu_stream_write (pstr, "\n", 1, NULL);
118 ONERR (rc, _("stream write failed"), NULL);
119 }
120
121 rc = mu_stream_copy (pstr, mstr, 0);
122 ONERR (rc, _("command failed"), cmd);
136 } 123 }
137 124 while (0);
138 rc = mu_stream_seek (mstr, 0, SEEK_SET, NULL);
139 while (rc == 0
140 && mu_stream_read (mstr, buf, sizeof buf, &n) == 0
141 && n > 0)
142 rc = mu_stream_write (pstr, buf, n, NULL);
143 125
126 mu_stream_destroy (&mstr);
144 mu_stream_close (pstr); 127 mu_stream_close (pstr);
145 mu_stream_destroy (&pstr); 128 mu_stream_destroy (&pstr);
146 129
130 if (rc)
131 {
132 if (error_arg)
133 mu_sieve_error (mach, "%lu: %s: %s: %s",
134 (unsigned long) mu_sieve_get_message_num (mach),
135 error_diag,
136 error_arg,
137 mu_strerror (rc));
138 else
139 mu_sieve_error (mach, "%lu: %s: %s",
140 (unsigned long) mu_sieve_get_message_num (mach),
141 error_diag,
142 mu_strerror (rc));
143 mu_sieve_abort (mach);
144 }
147 145
148 ASSERT2 (rc == 0, _("command failed"), cmd, rc);
149
150 return 0; 146 return 0;
151 } 147 }
152 148
...@@ -155,9 +151,9 @@ static mu_sieve_tag_def_t pipe_tags[] = { ...@@ -155,9 +151,9 @@ static mu_sieve_tag_def_t pipe_tags[] = {
155 { "envelope", SVT_VOID }, 151 { "envelope", SVT_VOID },
156 { NULL } 152 { NULL }
157 }; 153 };
158 154
159 static mu_sieve_tag_group_t pipe_tag_groups[] = { 155 static mu_sieve_tag_group_t pipe_tag_groups[] = {
160 { pipe_tags, NULL }, 156 { pipe_tags, NULL },
161 { NULL } 157 { NULL }
162 }; 158 };
163 159
...@@ -173,4 +169,3 @@ SIEVE_EXPORT (pipe, init) (mu_sieve_machine_t mach) ...@@ -173,4 +169,3 @@ SIEVE_EXPORT (pipe, init) (mu_sieve_machine_t mach)
173 return mu_sieve_register_action (mach, "pipe", sieve_action_pipe, 169 return mu_sieve_register_action (mach, "pipe", sieve_action_pipe,
174 pipe_args, pipe_tag_groups, 1); 170 pipe_args, pipe_tag_groups, 1);
175 } 171 }
176
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
34 #include <mailutils/sieve.h> 34 #include <mailutils/sieve.h>
35 #include <mailutils/mu_auth.h> 35 #include <mailutils/mu_auth.h>
36 #include <mailutils/nls.h> 36 #include <mailutils/nls.h>
37 #include <mailutils/filter.h>
38 #include <mailutils/stream.h>
37 39
38 #define DEFAULT_SPAMD_PORT 783 40 #define DEFAULT_SPAMD_PORT 783
39 41
...@@ -98,29 +100,28 @@ spamd_send_command (mu_stream_t stream, const char *fmt, ...) ...@@ -98,29 +100,28 @@ spamd_send_command (mu_stream_t stream, const char *fmt, ...)
98 mu_stream_writeline (stream, buf, n); 100 mu_stream_writeline (stream, buf, n);
99 } 101 }
100 102
101 static void 103 static int
102 spamd_send_message (mu_stream_t stream, mu_message_t msg) 104 spamd_send_message (mu_stream_t stream, mu_message_t msg)
103 { 105 {
104 size_t size; 106 int rc;
105 char buf[512]; 107 mu_stream_t mstr, flt;
106 mu_stream_t mstr;
107 108
108 mu_message_get_stream (msg, &mstr); 109 rc = mu_message_get_streamref (msg, &mstr);
109 mu_stream_seek (mstr, 0, SEEK_SET, NULL); 110 if (rc)
110 while (mu_stream_readline (mstr, buf, sizeof (buf), &size) == 0 111 return rc;
111 && size > 0) 112 rc = mu_filter_create (&flt, mstr, "rfc822", MU_FILTER_ENCODE,
113 MU_STREAM_READ|MU_STREAM_SEEK|MU_STREAM_NO_CLOSE);
114 if (rc)
112 { 115 {
113 char *nl = NULL; 116 mu_stream_destroy (&mstr);
114 117 return rc;
115 if (buf[size-1] == '\n')
116 {
117 size--;
118 nl = "\r\n";
119 }
120 mu_stream_write (stream, buf, size, NULL);
121 if (nl)
122 mu_stream_write (stream, nl, 2, NULL);
123 } 118 }
119
120 rc = mu_stream_copy (stream, flt, 0);
121
122 mu_stream_destroy (&mstr);
123 mu_stream_destroy (&flt);
124 return rc;
124 } 125 }
125 126
126 static size_t 127 static size_t
...@@ -284,6 +285,9 @@ spamd_test (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags) ...@@ -284,6 +285,9 @@ spamd_test (mu_sieve_machine_t mach, mu_list_t args, mu_list_t tags)
284 (u_long) mu_sieve_get_message_num (mach)); 285 (u_long) mu_sieve_get_message_num (mach));
285 } 286 }
286 287
288 if (mu_sieve_is_dry_run (mach))
289 return 0;
290
287 if (mu_sieve_tag_lookup (tags, "host", &arg)) 291 if (mu_sieve_tag_lookup (tags, "host", &arg))
288 host = arg->v.string; 292 host = arg->v.string;
289 else 293 else
......
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
42 42
43 /* Build a mime response message from original message MSG. TEXT 43 /* Build a mime response message from original message MSG. TEXT
44 is the message text. 44 is the message text.
45 FIXME: This is for future use, when I add :mime tag
46 */ 45 */
47 static int 46 static int
48 build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime, 47 build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime,
...@@ -50,25 +49,25 @@ build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime, ...@@ -50,25 +49,25 @@ build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime,
50 { 49 {
51 mu_mime_t mime = NULL; 50 mu_mime_t mime = NULL;
52 mu_message_t newmsg; 51 mu_message_t newmsg;
53 mu_stream_t stream, input, save_input = NULL; 52 mu_stream_t stream, input;
54 mu_header_t hdr; 53 mu_header_t hdr;
55 mu_body_t body; 54 mu_body_t body;
56 char buf[512]; 55 const char *header =
57 char *header = "Content-Type: text/plain;charset=" MU_SIEVE_CHARSET "\n" 56 "Content-Type: text/plain;charset=" MU_SIEVE_CHARSET "\n"
58 "Content-Transfer-Encoding: 8bit\n\n"; 57 "Content-Transfer-Encoding: 8bit\n\n";
59 int rc; 58 int rc;
60 size_t n;
61 59
62 mu_mime_create (&mime, NULL, 0); 60 mu_mime_create (&mime, NULL, 0);
63 mu_message_create (&newmsg, NULL); 61 mu_message_create (&newmsg, NULL);
64 mu_message_get_body (newmsg, &body); 62 mu_message_get_body (newmsg, &body);
65 mu_body_get_stream (body, &stream);
66 63
67 if ((rc = mu_memory_stream_create (&input, MU_STREAM_RDWR))) 64 if ((rc = mu_memory_stream_create (&input, MU_STREAM_RDWR)))
68 { 65 {
69 mu_sieve_error (mach, 66 mu_sieve_error (mach,
70 _("cannot create temporary stream: %s"), 67 _("cannot create temporary stream: %s"),
71 mu_strerror (rc)); 68 mu_strerror (rc));
69 mu_mime_destroy (&mime);
70 mu_message_destroy (&newmsg, NULL);
72 return 1; 71 return 1;
73 } 72 }
74 73
...@@ -77,6 +76,9 @@ build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime, ...@@ -77,6 +76,9 @@ build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime,
77 mu_sieve_error (mach, 76 mu_sieve_error (mach,
78 _("cannot open temporary stream: %s"), 77 _("cannot open temporary stream: %s"),
79 mu_strerror (rc)); 78 mu_strerror (rc));
79 mu_mime_destroy (&mime);
80 mu_message_destroy (&newmsg, NULL);
81 mu_stream_destroy (&input);
80 return 1; 82 return 1;
81 } 83 }
82 84
...@@ -91,19 +93,37 @@ build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime, ...@@ -91,19 +93,37 @@ build_mime (mu_sieve_machine_t mach, mu_list_t tags, mu_mime_t *pmime,
91 { 93 {
92 header = "Content-Type: text/plain;charset=" MU_SIEVE_CHARSET "\n" 94 header = "Content-Type: text/plain;charset=" MU_SIEVE_CHARSET "\n"
93 "Content-Transfer-Encoding: base64\n\n"; 95 "Content-Transfer-Encoding: base64\n\n";
94 save_input = input;
95 input = fstr; 96 input = fstr;
96 } 97 }
97 } 98 }
98 99
99 while (rc == 0 100 rc = mu_body_get_streamref (body, &stream);
100 && mu_stream_read (input, buf, sizeof buf, &n) == 0 101 if (rc)
101 && n > 0) 102 {
102 rc = mu_stream_write (stream, buf, n, NULL); 103 mu_sieve_error (mach,
104 _("cannot get input body stream: %s"),
105 mu_strerror (rc));
106 mu_mime_destroy (&mime);
107 mu_message_destroy (&newmsg, NULL);
108 mu_stream_destroy (&input);
109 return 1;
110 }
111
112 mu_stream_seek (input, 0, MU_SEEK_SET, NULL);
113 rc = mu_stream_copy (stream, input, 0);
114 if (rc)
115 {
116 mu_sieve_error (mach,
117 _("stream copy failed: %s"),
118 mu_strerror (rc));
119 mu_mime_destroy (&mime);
120 mu_message_destroy (&newmsg, NULL);
121 mu_stream_destroy (&input);
122 mu_stream_destroy (&stream);
123 return 1;
124 }
103 125
104 mu_stream_destroy (&input); 126 mu_stream_destroy (&input);
105 if (save_input)
106 mu_stream_destroy (&save_input);
107 127
108 mu_header_create (&hdr, header, strlen (header)); 128 mu_header_create (&hdr, header, strlen (header));
109 mu_message_set_header (newmsg, hdr, NULL); 129 mu_message_set_header (newmsg, hdr, NULL);
......
...@@ -382,7 +382,8 @@ mbox_envelope_date (mu_envelope_t envelope, char *buf, size_t len, ...@@ -382,7 +382,8 @@ mbox_envelope_date (mu_envelope_t envelope, char *buf, size_t len,
382 &n); 382 &n);
383 if (status) 383 if (status)
384 return status; 384 return status;
385 385 mu_rtrim_cset (buffer, "\r\n");
386
386 /* Format: "From [sender] [date]" */ 387 /* Format: "From [sender] [date]" */
387 /* strlen ("From ") == 5 */ 388 /* strlen ("From ") == 5 */
388 if (n > 5 && (s = strchr (buffer + 5, ' ')) != NULL) 389 if (n > 5 && (s = strchr (buffer + 5, ' ')) != NULL)
......
...@@ -1710,7 +1710,7 @@ amd_body_stream_seek (mu_stream_t str, mu_off_t off, mu_off_t *presult) ...@@ -1710,7 +1710,7 @@ amd_body_stream_seek (mu_stream_t str, mu_off_t off, mu_off_t *presult)
1710 1710
1711 amd_body_size (amdstr->body, &size); 1711 amd_body_size (amdstr->body, &size);
1712 1712
1713 if (off < 0 || off >= size) 1713 if (off < 0 || off > size)
1714 return ESPIPE; 1714 return ESPIPE;
1715 1715
1716 amdstr->off = off; 1716 amdstr->off = off;
......