home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / b / bmh02src.zip / MAILER.C < prev    next >
C/C++ Source or Header  |  1992-08-17  |  4KB  |  175 lines

  1. /*
  2.    mailer.c : Copyright Paul Healy, EI9GL, 1992.
  3.  
  4.    920802 : Created.
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <dir.h>
  9. #include <process.h>
  10. #include <ctype.h>
  11. #include "rc.h"
  12. #include "send.h"
  13. #include "misc.h"
  14. #include "header.h"
  15. #include "mailer.h"
  16. #include "pager.h"
  17. #include "nntp.h"
  18.  
  19. /*
  20.  * eg, set TMP=g:\   where g: is a ram disk
  21.  */
  22. FILE *
  23. tempfile(char *prog, char *filename, char *mode)
  24. {  
  25.    char *tmp = getrc(tmpdir);
  26.    FILE *fp = NULL;
  27.  
  28.    if (tmp == NULL)
  29.       if ( (tmp = getenv("BMHTMP")) == NULL)
  30.          tmp = getenv("TMP");
  31.  
  32.    if (tmp == NULL)
  33.       sprintf(filename, "%.6sXXXXXX", prog);
  34.    else 
  35.       sprintf(filename, "%s%.6sXXXXXX", tmp, prog);
  36.  
  37.    if ((mktemp(filename) == NULL) || ( (fp = fopen(filename, mode)) == NULL) )
  38.       fprintf(stderr, "%s: can't make temporary file %s\n", prog, filename);
  39. #ifdef DEBUG
  40.    printf("tempfile: made %s\n", filename);
  41. #endif
  42.    return fp;
  43. }
  44.  
  45. int
  46. call_ed(char *prog, char *filename)
  47. {
  48.    char *ed = getrc(editor);
  49.  
  50.    if ( ed == NULL) {
  51.       fprintf(stderr, "%s: no editor defined\n", prog);
  52.       return -1;
  53.       }
  54.    if (spawnlp(P_WAIT, ed, ed, filename, NULL) != 0) {
  55.       fprintf(stderr, "%s: error calling editor '%s %s'\n", prog, ed, filename);
  56.       perror(prog);
  57.       return -1;
  58.       }
  59.  
  60.    return 0;
  61. }
  62.  
  63. static int
  64. what_now(char *filename)
  65. {
  66.    char s[4];
  67.  
  68.    while (1) {
  69.       printf("What now? ");
  70.       if (fgets(s, sizeof(s), stdin) == NULL)
  71.          return -1;
  72.       switch (tolower(*s)) {
  73.          case 'e':
  74.             call_ed("whatnow", filename);
  75.             break;
  76.          case 'l':
  77.             page_file(filename);
  78.             putchar('\r');
  79.             break;
  80.          case 'p':
  81.          case 's':
  82.          case '.':   /* bm/mail ness */
  83.             return 0;
  84.          case 'q':
  85.             return -1;
  86.          case '?':
  87.             printf(" edit message\n");
  88.             printf(" list message\n");
  89.             printf(" post message\n");
  90.             printf(" quit\n");
  91.             printf(" ? - print this message\n");
  92.             break;
  93.          default:
  94.             printf("Type ? for help\n");
  95.             break;
  96.          }
  97.       }
  98. }
  99.  
  100. int
  101. dowhatnow(char *prog, char *filename, int callagent)
  102. {
  103.    if (what_now(filename) == 0) {
  104.       char *arg[MAXHDR];
  105.       FILE *fp = fopen(filename, "r");
  106.  
  107.       if (fp == NULL) {
  108.          fprintf(stderr, "%s: error opening %s\n", prog, filename);
  109.          return -1;
  110.          }
  111.       if (looseparseheaderfile(fp, arg) == -1) {
  112.          fclose(fp);
  113.          return -1;
  114.          }
  115.  
  116.       switch (callagent) {
  117.          case AG_BOUNCE:
  118.             bouncemsg(fp, arg[TO]);
  119.             break;
  120.          case AG_SMTP:
  121.             dosmtpsend(fp, arg[TO], arg[CC], arg[SUBJECT]);
  122.             break;
  123.          case AG_NNTP:
  124.             post(fp, arg[NEWSGROUP], arg[SUBJECT]);
  125.             break;
  126.          default:
  127.             break;
  128.          }
  129.       freeheader(arg);
  130.       fclose(fp);
  131.       } /* if */
  132.  
  133.    return unlink(filename);
  134. }
  135.  
  136. void
  137. dosignature(FILE *fp)
  138. {
  139.    FILE *sigfp;
  140.    int ch;
  141.  
  142.    if (getrc(signature) == NULL)
  143.       return ;
  144.  
  145.    if ( (sigfp = fopen(getrc(signature), "r")) == NULL) {
  146.       fprintf(stderr, "bmh: can't open signature file %s\n", getrc(signature));
  147.       return ;
  148.       }
  149.    
  150.    while ((ch = fgetc(sigfp)) != EOF)
  151.       if (fputc(ch, fp) == EOF) {
  152.          fprintf(stderr, "bmh: error adding signature file to message\n");
  153.          break;
  154.          }
  155.    fclose(sigfp);
  156. }
  157.  
  158. int
  159. dupfile(FILE *in, FILE *out)
  160. {
  161.    char buf[2048];
  162.    int r;
  163.  
  164.    while ( (r = fread(buf, sizeof(char), sizeof(buf), in)) > 0 ) {
  165.       if ( fwrite(buf, sizeof(char), r, out) != r) {
  166.          fprintf(stderr, "bmh: error writing file\n");
  167.          return -1;
  168.          }
  169.       if (r != sizeof(buf))
  170.          return 0;
  171.       }
  172.  
  173.    return 0;
  174. }
  175.