Mercurial > hg > xemacs-beta
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) |