Commit d7938606 d793860694309d3d382528a0b45a15a218d93a57 by Sergey Poznyakoff

Create temporary mailbox instead of the temporary message, to avoid problems whe…

…n running sieve fileinto.
1 parent a66fd8a2
...@@ -100,15 +100,14 @@ extern int exit_code; ...@@ -100,15 +100,14 @@ extern int exit_code;
100 extern void setgroupquota __P((char *str)); 100 extern void setgroupquota __P((char *str));
101 extern int check_quota __P((char *name, size_t size, size_t *rest)); 101 extern int check_quota __P((char *name, size_t size, size_t *rest));
102 102
103 int mda __P((message_t msg, char *username)); 103 int mda __P((mailbox_t mbx, char *username));
104 int switch_user_id __P((struct mu_auth_data *auth, int user)); 104 int switch_user_id __P((struct mu_auth_data *auth, int user));
105 void mailer_err __P((char *fmt, ...)); 105 void mailer_err __P((char *fmt, ...));
106 106
107 #ifdef WITH_GUILE 107 #ifdef WITH_GUILE
108 struct mda_data 108 struct mda_data
109 { 109 {
110 message_t msg; 110 mailbox_t mbox;
111 char *tempfile;
112 char *progfile; 111 char *progfile;
113 char *progfile_pattern; 112 char *progfile_pattern;
114 char **argv; 113 char **argv;
......
...@@ -34,12 +34,12 @@ mu_debug_t mudebug; ...@@ -34,12 +34,12 @@ mu_debug_t mudebug;
34 #define MAXFD 64 34 #define MAXFD 64
35 #define EX_QUOTA() (ex_quota_tempfail ? EX_TEMPFAIL : EX_UNAVAILABLE) 35 #define EX_QUOTA() (ex_quota_tempfail ? EX_TEMPFAIL : EX_UNAVAILABLE)
36 36
37 void close_fds (); 37 void close_fds __P((void));
38 int make_tmp __P((const char *from, message_t *msg, char **tempfile)); 38 int make_tmp __P((const char *from, mailbox_t *mbx));
39 void deliver (message_t msg, char *name); 39 void deliver __P((mailbox_t msg, char *name));
40 void guess_retval (int ec); 40 void guess_retval __P((int ec));
41 void mailer_err (char *fmt, ...); 41 void mailer_err __P((char *fmt, ...));
42 void notify_biff (mailbox_t mbox, char *name, size_t size); 42 void notify_biff __P((mailbox_t mbox, char *name, size_t size));
43 43
44 const char *argp_program_version = "mail.local (" PACKAGE_STRING ")"; 44 const char *argp_program_version = "mail.local (" PACKAGE_STRING ")";
45 static char doc[] = 45 static char doc[] =
...@@ -265,8 +265,7 @@ _sieve_parse_error (void *user_name, const char *filename, int lineno, ...@@ -265,8 +265,7 @@ _sieve_parse_error (void *user_name, const char *filename, int lineno,
265 int 265 int
266 main (int argc, char *argv[]) 266 main (int argc, char *argv[])
267 { 267 {
268 char *tempfile = NULL; 268 mailbox_t mbox = NULL;
269 message_t message = NULL;
270 int arg_index; 269 int arg_index;
271 270
272 /* Preparative work: close inherited fds, force a reasonable umask 271 /* Preparative work: close inherited fds, force a reasonable umask
...@@ -326,7 +325,7 @@ main (int argc, char *argv[]) ...@@ -326,7 +325,7 @@ main (int argc, char *argv[])
326 list_append (bookie, smtp_record); 325 list_append (bookie, smtp_record);
327 } 326 }
328 327
329 if (make_tmp (from, &message, &tempfile)) 328 if (make_tmp (from, &mbox))
330 exit (exit_code); 329 exit (exit_code);
331 330
332 if (multiple_delivery) 331 if (multiple_delivery)
...@@ -338,29 +337,27 @@ main (int argc, char *argv[]) ...@@ -338,29 +337,27 @@ main (int argc, char *argv[])
338 struct mda_data mda_data; 337 struct mda_data mda_data;
339 338
340 memset (&mda_data, 0, sizeof mda_data); 339 memset (&mda_data, 0, sizeof mda_data);
341 mda_data.msg = message; 340 mda_data.mbox = mbox;
342 mda_data.argv = argv; 341 mda_data.argv = argv;
343 mda_data.progfile_pattern = progfile_pattern; 342 mda_data.progfile_pattern = progfile_pattern;
344 mda_data.tempfile = tempfile;
345 return prog_mda (&mda_data); 343 return prog_mda (&mda_data);
346 } 344 }
347 #endif 345 #endif
348 346
349 unlink (tempfile);
350 for (; *argv; argv++) 347 for (; *argv; argv++)
351 mda (message, *argv); 348 mda (mbox, *argv);
352 return exit_code; 349 return exit_code;
353 } 350 }
354 351
355 int 352 int
356 sieve_test (struct mu_auth_data *auth, message_t msg) 353 sieve_test (struct mu_auth_data *auth, mailbox_t mbx)
357 { 354 {
358 int rc = 1; 355 int rc = 1;
359 char *progfile; 356 char *progfile;
360 357
361 if (!sieve_pattern) 358 if (!sieve_pattern)
362 return 1; 359 return 1;
363 360
364 progfile = mu_expand_path_pattern (sieve_pattern, auth->name); 361 progfile = mu_expand_path_pattern (sieve_pattern, auth->name);
365 if (access (progfile, R_OK)) 362 if (access (progfile, R_OK))
366 { 363 {
...@@ -388,7 +385,9 @@ sieve_test (struct mu_auth_data *auth, message_t msg) ...@@ -388,7 +385,9 @@ sieve_test (struct mu_auth_data *auth, message_t msg)
388 if (rc == 0) 385 if (rc == 0)
389 { 386 {
390 attribute_t attr; 387 attribute_t attr;
391 388 message_t msg = NULL;
389
390 mailbox_get_message (mbx, 1, &msg);
392 message_get_attribute (msg, &attr); 391 message_get_attribute (msg, &attr);
393 attribute_unset_deleted (attr); 392 attribute_unset_deleted (attr);
394 if (switch_user_id (auth, 1) == 0) 393 if (switch_user_id (auth, 1) == 0)
...@@ -411,9 +410,9 @@ sieve_test (struct mu_auth_data *auth, message_t msg) ...@@ -411,9 +410,9 @@ sieve_test (struct mu_auth_data *auth, message_t msg)
411 } 410 }
412 411
413 int 412 int
414 mda (message_t msg, char *username) 413 mda (mailbox_t mbx, char *username)
415 { 414 {
416 deliver (msg, username); 415 deliver (mbx, username);
417 416
418 if (multiple_delivery) 417 if (multiple_delivery)
419 exit_code = EX_OK; 418 exit_code = EX_OK;
...@@ -478,7 +477,7 @@ tmp_write (stream_t stream, off_t *poffset, char *buf, size_t len) ...@@ -478,7 +477,7 @@ tmp_write (stream_t stream, off_t *poffset, char *buf, size_t len)
478 } 477 }
479 478
480 int 479 int
481 make_tmp (const char *from, message_t *msg, char **tempfile) 480 make_tmp (const char *from, mailbox_t *mbox)
482 { 481 {
483 stream_t stream; 482 stream_t stream;
484 char *buf = NULL; 483 char *buf = NULL;
...@@ -487,9 +486,10 @@ make_tmp (const char *from, message_t *msg, char **tempfile) ...@@ -487,9 +486,10 @@ make_tmp (const char *from, message_t *msg, char **tempfile)
487 size_t line; 486 size_t line;
488 int status; 487 int status;
489 static char *newline = "\n"; 488 static char *newline = "\n";
489 char *tempfile;
490 490
491 *tempfile = mu_tempname (NULL); 491 tempfile = mu_tempname (NULL);
492 if ((status = file_stream_create (&stream, *tempfile, MU_STREAM_RDWR))) 492 if ((status = file_stream_create (&stream, tempfile, MU_STREAM_RDWR)))
493 { 493 {
494 mailer_err ("unable to open temporary file: %s", mu_errstring (status)); 494 mailer_err ("unable to open temporary file: %s", mu_errstring (status));
495 exit (exit_code); 495 exit (exit_code);
...@@ -557,7 +557,9 @@ make_tmp (const char *from, message_t *msg, char **tempfile) ...@@ -557,7 +557,9 @@ make_tmp (const char *from, message_t *msg, char **tempfile)
557 557
558 status = tmp_write (stream, &offset, newline, 1); 558 status = tmp_write (stream, &offset, newline, 1);
559 free (buf); 559 free (buf);
560 560 unlink (tempfile);
561 free (tempfile);
562
561 if (status) 563 if (status)
562 { 564 {
563 errno = status; 565 errno = status;
...@@ -566,9 +568,17 @@ make_tmp (const char *from, message_t *msg, char **tempfile) ...@@ -566,9 +568,17 @@ make_tmp (const char *from, message_t *msg, char **tempfile)
566 return status; 568 return status;
567 } 569 }
568 570
569 if ((status = message_create (msg, NULL)) == 0) 571 stream_flush (stream);
570 status = message_set_stream (*msg, stream, NULL); 572 if ((status = mailbox_create (mbox, "/dev/null"))
571 573 || (status = mailbox_open (*mbox, MU_STREAM_READ))
574 || (status = mailbox_set_stream (*mbox, stream)))
575 {
576 mailer_err ("temporary file open error: %s", mu_errstring (status));
577 stream_destroy (&stream, stream_get_owner (stream));
578 return status;
579 }
580
581 status = mailbox_messages_count (*mbox, &n);
572 if (status) 582 if (status)
573 { 583 {
574 errno = status; 584 errno = status;
...@@ -577,12 +587,12 @@ make_tmp (const char *from, message_t *msg, char **tempfile) ...@@ -577,12 +587,12 @@ make_tmp (const char *from, message_t *msg, char **tempfile)
577 stream_destroy (&stream, stream_get_owner (stream)); 587 stream_destroy (&stream, stream_get_owner (stream));
578 return status; 588 return status;
579 } 589 }
580 590
581 return status; 591 return status;
582 } 592 }
583 593
584 void 594 void
585 deliver (message_t msg, char *name) 595 deliver (mailbox_t imbx, char *name)
586 { 596 {
587 mailbox_t mbox; 597 mailbox_t mbox;
588 char *path; 598 char *path;
...@@ -602,14 +612,14 @@ deliver (message_t msg, char *name) ...@@ -602,14 +612,14 @@ deliver (message_t msg, char *name)
602 return; 612 return;
603 } 613 }
604 614
605 if (!sieve_test (auth, msg)) 615 if (!sieve_test (auth, imbx))
606 { 616 {
607 exit_code = EX_OK; 617 exit_code = EX_OK;
608 mu_auth_data_free (auth); 618 mu_auth_data_free (auth);
609 return; 619 return;
610 } 620 }
611 621
612 if ((status = message_get_stream (msg, &istream)) != 0) 622 if ((status = mailbox_get_stream (imbx, &istream)) != 0)
613 { 623 {
614 mailer_err ("can't get input message stream: %s", mu_errstring (status)); 624 mailer_err ("can't get input message stream: %s", mu_errstring (status));
615 mu_auth_data_free (auth); 625 mu_auth_data_free (auth);
......
...@@ -39,19 +39,8 @@ prog_mda (struct mda_data *data) ...@@ -39,19 +39,8 @@ prog_mda (struct mda_data *data)
39 x_argv[0] = "mail.local"; 39 x_argv[0] = "mail.local";
40 x_argv[1] = NULL; 40 x_argv[1] = NULL;
41 41
42 message_get_stream (data->msg, &stream);
43 stream_flush (stream);
44 if (mailbox_create (&mbox, data->tempfile)
45 || mailbox_open (mbox, MU_STREAM_RDWR) != 0)
46 {
47 mailer_err ("can't open temporary storage");
48 return EX_UNAVAILABLE;
49 }
50
51 unlink (data->tempfile);
52
53 param.debug_guile = debug_guile; 42 param.debug_guile = debug_guile;
54 param.mbox = mbox; 43 param.mbox = data->mbox;
55 param.user_name = NULL; 44 param.user_name = NULL;
56 param.init = mda_init; 45 param.init = mda_init;
57 param.catch_body = mda_catch_body; 46 param.catch_body = mda_catch_body;
...@@ -117,7 +106,7 @@ mda_catch_body (void *data, mailbox_t mbox) ...@@ -117,7 +106,7 @@ mda_catch_body (void *data, mailbox_t mbox)
117 return SCM_BOOL_F; 106 return SCM_BOOL_F;
118 107
119 mda_switch_to_user (NULL); 108 mda_switch_to_user (NULL);
120 mda (md->msg, md->argv[0]); 109 mda (md->mbox, md->argv[0]);
121 return SCM_BOOL_F; 110 return SCM_BOOL_F;
122 } 111 }
123 112
......