comparison lib-src/movemail.c @ 173:8eaf7971accc r20-3b13

Import from CVS: tag r20-3b13
author cvs
date Mon, 13 Aug 2007 09:49:09 +0200
parents 0132846995bd
children 2d532a89d707
comparison
equal deleted inserted replaced
172:a38aed19690b 173:8eaf7971accc
127 #undef open 127 #undef open
128 #undef read 128 #undef read
129 #undef write 129 #undef write
130 #undef close 130 #undef close
131 131
132 #ifndef errno 132 static void fatal (char *, char*);
133 extern int errno; 133 static void error (char *, char *, char *);
134 #endif 134 static void pfatal_with_name (char *);
135 char *strerror (); 135 static void pfatal_and_delete (char *);
136 136 static char *concat (char *, char *, char *);
137 void fatal (char *, char*); 137 static long *xmalloc (unsigned int);
138 void error (); 138 static int popmail (char *, char *, char *);
139 void pfatal_with_name (); 139 #ifdef MAIL_USE_POP
140 void pfatal_and_delete (); 140 static int pop_retr (popserver server, int msgno, int (*action)(), int arg);
141 char *concat (); 141 #endif
142 long *xmalloc (); 142 static int mbx_write (char *, FILE *);
143 int popmail (); 143 static int mbx_delimit_begin (FILE *);
144 int pop_retr (); 144 static int mbx_delimit_end (FILE *);
145 int mbx_write ();
146 int mbx_delimit_begin ();
147 int mbx_delimit_end ();
148 145
149 /* Nonzero means this is name of a lock file to delete on fatal error. */ 146 /* Nonzero means this is name of a lock file to delete on fatal error. */
150 char *delete_lockname; 147 char *delete_lockname;
151 148
152 int 149 int
153 main (argc, argv) 150 main (int argc, char *argv[])
154 int argc;
155 char **argv;
156 { 151 {
157 char *inname, *outname; 152 char *inname, *outname;
158 int indesc, outdesc; 153 int indesc, outdesc;
159 int nread; 154 int nread;
160 int status; 155 int status;
191 pfatal_with_name (outname); 186 pfatal_with_name (outname);
192 187
193 /* Also check that outname's directory is writable to the real uid. */ 188 /* Also check that outname's directory is writable to the real uid. */
194 { 189 {
195 char *buf = (char *) xmalloc (strlen (outname) + 1); 190 char *buf = (char *) xmalloc (strlen (outname) + 1);
196 char *p; 191 char *cp;
197 strcpy (buf, outname); 192 strcpy (buf, outname);
198 p = buf + strlen (buf); 193 cp = buf + strlen (buf);
199 while (p > buf && !IS_DIRECTORY_SEP (p[-1])) 194 while (cp > buf && !IS_DIRECTORY_SEP (cp[-1]))
200 *--p = 0; 195 *--cp = 0;
201 if (p == buf) 196 if (cp == buf)
202 *p++ = '.'; 197 *cp++ = '.';
203 if (access (buf, W_OK) != 0) 198 if (access (buf, W_OK) != 0)
204 pfatal_with_name (buf); 199 pfatal_with_name (buf);
205 free (buf); 200 free (buf);
206 } 201 }
207 202
409 return 0; 404 return 0;
410 } 405 }
411 406
412 /* Print error message and exit. */ 407 /* Print error message and exit. */
413 408
414 void 409 static void
415 fatal (s1, s2) 410 fatal (char *s1, char *s2)
416 char *s1, *s2;
417 { 411 {
418 if (delete_lockname) 412 if (delete_lockname)
419 unlink (delete_lockname); 413 unlink (delete_lockname);
420 error (s1, s2); 414 error (s1, s2, NULL);
421 exit (1); 415 exit (1);
422 } 416 }
423 417
424 /* Print error message. `s1' is printf control string, `s2' is arg for it. */ 418 /* Print error message. `s1' is printf control string, `s2' is arg for it. */
425 419
426 void 420 static void
427 error (s1, s2, s3) 421 error (char *s1, char *s2, char *s3)
428 char *s1, *s2, *s3;
429 { 422 {
430 fprintf (stderr, "movemail: "); 423 fprintf (stderr, "movemail: ");
431 fprintf (stderr, s1, s2, s3); 424 fprintf (stderr, s1, s2, s3);
432 fprintf (stderr, "\n"); 425 fprintf (stderr, "\n");
433 } 426 }
434 427
435 void 428 static void
436 pfatal_with_name (name) 429 pfatal_with_name (char *name)
437 char *name;
438 { 430 {
439 char *s = concat ("", strerror (errno), " for %s"); 431 char *s = concat ("", strerror (errno), " for %s");
440 fatal (s, name); 432 fatal (s, name);
441 } 433 }
442 434
443 void 435 static void
444 pfatal_and_delete (name) 436 pfatal_and_delete (char *name)
445 char *name;
446 { 437 {
447 char *s = concat ("", strerror (errno), " for %s"); 438 char *s = concat ("", strerror (errno), " for %s");
448 unlink (name); 439 unlink (name);
449 fatal (s, name); 440 fatal (s, name);
450 } 441 }
451 442
452 /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3. */ 443 /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3. */
453 444
454 char * 445 static char *
455 concat (s1, s2, s3) 446 concat (char *s1, char *s2, char *s3)
456 char *s1, *s2, *s3;
457 { 447 {
458 int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3); 448 int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
459 char *result = (char *) xmalloc (len1 + len2 + len3 + 1); 449 char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
460 450
461 strcpy (result, s1); 451 strcpy (result, s1);
466 return result; 456 return result;
467 } 457 }
468 458
469 /* Like malloc but get fatal error if memory is exhausted. */ 459 /* Like malloc but get fatal error if memory is exhausted. */
470 460
471 long * 461 static long *
472 xmalloc (size) 462 xmalloc (unsigned int size)
473 unsigned size;
474 { 463 {
475 long *result = (long *) malloc (size); 464 long *result = (long *) malloc (size);
476 if (!result) 465 if (!result)
477 fatal ("virtual memory exhausted", 0); 466 fatal ("virtual memory exhausted", 0);
478 return result; 467 return result;
502 FILE *sfo; 491 FILE *sfo;
503 char ibuffer[BUFSIZ]; 492 char ibuffer[BUFSIZ];
504 char obuffer[BUFSIZ]; 493 char obuffer[BUFSIZ];
505 char Errmsg[80]; 494 char Errmsg[80];
506 495
507 popmail (user, outfile, password) 496 static int
508 char *user; 497 popmail (char *user, char *outfile, char *password)
509 char *outfile;
510 char *password;
511 { 498 {
512 int nmsgs, nbytes; 499 int nmsgs, nbytes;
513 register int i; 500 register int i;
514 int mbfi; 501 int mbfi;
515 FILE *mbf; 502 FILE *mbf;
519 extern char *strerror (); 506 extern char *strerror ();
520 507
521 server = pop_open (0, user, password, POP_NO_GETPASS); 508 server = pop_open (0, user, password, POP_NO_GETPASS);
522 if (! server) 509 if (! server)
523 { 510 {
524 error (pop_error); 511 error (pop_error, NULL, NULL);
525 return (1); 512 return (1);
526 } 513 }
527 514
528 if (pop_stat (server, &nmsgs, &nbytes)) 515 if (pop_stat (server, &nmsgs, &nbytes))
529 { 516 {
530 error (pop_error); 517 error (pop_error, NULL, NULL);
531 return (1); 518 return (1);
532 } 519 }
533 520
534 if (!nmsgs) 521 if (!nmsgs)
535 { 522 {
547 fchown (mbfi, getuid (), -1); 534 fchown (mbfi, getuid (), -1);
548 535
549 if ((mbf = fdopen (mbfi, "wb")) == NULL) 536 if ((mbf = fdopen (mbfi, "wb")) == NULL)
550 { 537 {
551 pop_close (server); 538 pop_close (server);
552 error ("Error in fdopen: %s", strerror (errno)); 539 error ("Error in fdopen: %s", strerror (errno), NULL);
553 close (mbfi); 540 close (mbfi);
554 unlink (outfile); 541 unlink (outfile);
555 return (1); 542 return (1);
556 } 543 }
557 544
558 for (i = 1; i <= nmsgs; i++) 545 for (i = 1; i <= nmsgs; i++)
559 { 546 {
560 mbx_delimit_begin (mbf); 547 mbx_delimit_begin (mbf);
561 if (pop_retr (server, i, mbx_write, mbf) != OK) 548 if (pop_retr (server, i, mbx_write, mbf) != OK)
562 { 549 {
563 error (Errmsg); 550 error (Errmsg, NULL, NULL);
564 close (mbfi); 551 close (mbfi);
565 return (1); 552 return (1);
566 } 553 }
567 mbx_delimit_end (mbf); 554 mbx_delimit_end (mbf);
568 fflush (mbf); 555 fflush (mbf);
569 if (ferror (mbf)) 556 if (ferror (mbf))
570 { 557 {
571 error ("Error in fflush: %s", strerror (errno)); 558 error ("Error in fflush: %s", strerror (errno), NULL);
572 pop_close (server); 559 pop_close (server);
573 close (mbfi); 560 close (mbfi);
574 return (1); 561 return (1);
575 } 562 }
576 } 563 }
582 * not made in previous versions of movemail. */ 569 * not made in previous versions of movemail. */
583 570
584 #ifdef BSD 571 #ifdef BSD
585 if (fsync (mbfi) < 0) 572 if (fsync (mbfi) < 0)
586 { 573 {
587 error ("Error in fsync: %s", strerror (errno)); 574 error ("Error in fsync: %s", strerror (errno), NULL);
588 return (1); 575 return (1);
589 } 576 }
590 #endif 577 #endif
591 578
592 if (close (mbfi) == -1) 579 if (close (mbfi) == -1)
593 { 580 {
594 error ("Error in close: %s", strerror (errno)); 581 error ("Error in close: %s", strerror (errno), NULL);
595 return (1); 582 return (1);
596 } 583 }
597 584
598 for (i = 1; i <= nmsgs; i++) 585 for (i = 1; i <= nmsgs; i++)
599 { 586 {
600 if (pop_delete (server, i)) 587 if (pop_delete (server, i))
601 { 588 {
602 error (pop_error); 589 error (pop_error, NULL, NULL);
603 pop_close (server); 590 pop_close (server);
604 return (1); 591 return (1);
605 } 592 }
606 } 593 }
607 594
608 if (pop_quit (server)) 595 if (pop_quit (server))
609 { 596 {
610 error (pop_error); 597 error (pop_error, NULL, NULL);
611 return (1); 598 return (1);
612 } 599 }
613 600
614 return (0); 601 return (0);
615 } 602 }
616 603
617 pop_retr (server, msgno, action, arg) 604 static int
618 popserver server; 605 pop_retr (popserver server, int msgno, int (*action)(), int arg)
619 int (*action)();
620 { 606 {
621 extern char *strerror (); 607 extern char *strerror ();
622 char *line; 608 char *line;
623 int ret; 609 int ret;
624 610
657 && (a[1] == 'r') \ 643 && (a[1] == 'r') \
658 && (a[2] == 'o') \ 644 && (a[2] == 'o') \
659 && (a[3] == 'm') \ 645 && (a[3] == 'm') \
660 && (a[4] == ' ')) 646 && (a[4] == ' '))
661 647
662 int 648 static int
663 mbx_write (line, mbf) 649 mbx_write (char *line, FILE *mbf)
664 char *line;
665 FILE *mbf;
666 { 650 {
667 if (IS_FROM_LINE (line)) 651 if (IS_FROM_LINE (line))
668 { 652 {
669 if (fputc ('>', mbf) == EOF) 653 if (fputc ('>', mbf) == EOF)
670 return (NOTOK); 654 return (NOTOK);
674 if (fputc (0x0a, mbf) == EOF) 658 if (fputc (0x0a, mbf) == EOF)
675 return (NOTOK); 659 return (NOTOK);
676 return (OK); 660 return (OK);
677 } 661 }
678 662
679 int 663 static int
680 mbx_delimit_begin (mbf) 664 mbx_delimit_begin (FILE *mbf)
681 FILE *mbf;
682 { 665 {
683 if (fputs ("\f\n0, unseen,,\n", mbf) == EOF) 666 if (fputs ("\f\n0, unseen,,\n", mbf) == EOF)
684 return (NOTOK); 667 return (NOTOK);
685 return (OK); 668 return (OK);
686 } 669 }
687 670
688 mbx_delimit_end (mbf) 671 static int
689 FILE *mbf; 672 mbx_delimit_end (FILE *mbf)
690 { 673 {
691 if (putc ('\037', mbf) == EOF) 674 if (putc ('\037', mbf) == EOF)
692 return (NOTOK); 675 return (NOTOK);
693 return (OK); 676 return (OK);
694 } 677 }
695 678
696 #endif /* MAIL_USE_POP */ 679 #endif /* MAIL_USE_POP */
697 680
698 #ifndef HAVE_STRERROR 681 #ifndef HAVE_STRERROR
699 char * 682 static char *
700 strerror (errnum) 683 strerror (int errnum)
701 int errnum;
702 { 684 {
703 extern char *sys_errlist[]; 685 extern char *sys_errlist[];
704 extern int sys_nerr; 686 extern int sys_nerr;
705 687
706 if (errnum >= 0 && errnum < sys_nerr) 688 if (errnum >= 0 && errnum < sys_nerr)