home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / networking / uucp / amigauucpsrc / dnews / edit.c < prev    next >
C/C++ Source or Header  |  1994-06-29  |  5KB  |  265 lines

  1.  
  2. /*
  3.  *  EDIT (reply, followup)
  4.  */
  5.  
  6. #include "defs.h"
  7. #include <sys/stat.h>
  8.  
  9. Prototype void ReplyArticle(short, NGroup *);
  10. Prototype void FollowUpArticle(short, NGroup *);
  11. Prototype void PostArticle(NGroup *);
  12.  
  13. Local int EditFile(char *);
  14. Local void IncludeSignature(char *, FILE *);
  15. Local void IncludeText(FILE *, FILE *);
  16.  
  17. void
  18. ReplyArticle(key, grp)
  19. short key;
  20. NGroup *grp;
  21. {
  22.     char *fn = TmpFileName("T:DNews");
  23.     char *nf = FileForArticle(grp, grp->CurNo);
  24.     char *field;
  25.     char *user = GetUserName();
  26.     FILE *fi = ((nf) ? fopen(nf, "r") : NULL);
  27.     FILE *fo;
  28.  
  29.     if (fi == NULL) {
  30.     if (nf)
  31.         printf("Unable to open %s\n", nf);
  32.     return;
  33.     }
  34.     fo = fopen(fn, "w");
  35.     if (fo == NULL) {
  36.     printf("Unable to create %s\n", fn);
  37.     if (fi)
  38.         fclose(fi);
  39.     return;
  40.     }
  41.  
  42.     /*
  43.      *    Get Return Address: Reply-To:
  44.      *                From:
  45.      */
  46.  
  47.     if ((field = FindField(fi, "Reply-To:")) == NULL)
  48.     field = FindField(fi, "From:");
  49.  
  50.     if (field) {
  51.     fprintf(fo, "To: %s\n", field);
  52.     free(field);
  53.     } else {
  54.     fprintf(fo, "To: \n");
  55.     }
  56.  
  57.     if (field = FindField(fi, "Subject:")) {
  58.     char *base = field;
  59.     while (*field == ' ' || *field == 9)
  60.         ++field;
  61.     if (strnicmp(field, "re:", 3) == 0)
  62.         field += 3;
  63.     fprintf(fo, "Subject: Re: %s\n", field);
  64.     free(base);
  65.     } else {
  66.     fprintf(fo, "Subject: \n");
  67.     }
  68.  
  69.     if (field = FindField(fi, "Message-ID:")) {
  70.     fprintf(fo, "References: %s\n", field);
  71.     free(field);
  72.     }
  73.  
  74.     fprintf(fo, "\n");
  75.     if (isupper(key))
  76.     IncludeText(fi, fo);
  77.     fprintf(fo, "\n");
  78.     IncludeSignature(user, fo);
  79.     fclose(fo);
  80.  
  81.     if (EditFile(fn)) {
  82.     sprintf(TmpBuf, "%s < %s -f %s", GetConfigProgram(SENDMAIL), fn, user);
  83.     system(TmpBuf);
  84.     }
  85.     if (fi)
  86.     fclose(fi);
  87.     remove(fn);
  88. }
  89.  
  90. void
  91. FollowUpArticle(key, grp)
  92. short key;
  93. NGroup *grp;
  94. {
  95.     char *fn = TmpFileName("T:DNews");
  96.     char *nf = FileForArticle(grp, grp->CurNo);
  97.     char *field;
  98.     char *user = GetUserName();
  99.     FILE *fi = ((nf) ? fopen(nf, "r") : NULL);
  100.     FILE *fo;
  101.  
  102.     if (fi == NULL) {
  103.     if (nf)
  104.         printf("Unable to open %s\n", nf);
  105.     return;
  106.     }
  107.     fo = fopen(fn, "w");
  108.     if (fo == NULL) {
  109.     printf("Unable to create %s\n", fn);
  110.     if (fi)
  111.         fclose(fi);
  112.     return;
  113.     }
  114.  
  115.     if (field = FindField(fi, "Newsgroups:")) {
  116.     fprintf(fo, "Newsgroups: %s\n", field);
  117.     free(field);
  118.     } else {
  119.     fprintf(fo, "Newsgroups: %s\n", grp->Name);
  120.     }
  121.  
  122.     if (field = FindField(fi, "Subject:")) {
  123.     char *base = field;
  124.     while (*field == ' ' || *field == 9)
  125.         ++field;
  126.     if (strnicmp(field, "re:", 3) == 0)
  127.         field += 3;
  128.     fprintf(fo, "Subject: Re: %s\n", field);
  129.     free(base);
  130.     } else {
  131.     fprintf(fo, "Subject: \n");
  132.     }
  133.     if (field = FindField(fi, "Distribution:")) {
  134.     fprintf(fo, "Distribution: %s\n", field);
  135.     free(field);
  136.     } else {
  137.     fprintf(fo, "Distribution: world\n");
  138.     }
  139.  
  140.     fprintf(fo, "\n");
  141.     if (isupper(key)) {
  142.     fprintf(fo, "In article ");
  143.     if (field = FindField(fi, "Message-ID:")) {
  144.         fprintf(fo, "%s ", field);
  145.         free(field);
  146.     } else {
  147.         fprintf(fo, "? ");
  148.     }
  149.  
  150.     if (field = FindField(fi, "From:")) {
  151.         fprintf(fo, "%s", field);
  152.         free(field);
  153.     } else {
  154.         fprintf(fo, "?");
  155.     }
  156.     fprintf(fo, " writes:\n");
  157.  
  158.     IncludeText(fi, fo);
  159.     }
  160.     fprintf(fo, "\n");
  161.     IncludeSignature(user, fo);
  162.     fclose(fo);
  163.  
  164.     if (EditFile(fn)) {
  165.     PostNews(fi, fn);
  166.     } else {
  167.     remove(fn);
  168.     }
  169.     if (fi)
  170.     fclose(fi);
  171. }
  172.  
  173. void
  174. PostArticle(grp)
  175. NGroup *grp;
  176. {
  177.     char *fn = TmpFileName("T:DNews");
  178.     char *nf = (grp) ? FileForArticle(grp, grp->CurNo) : NULL;
  179.     char *field;
  180.     char *user = GetUserName();
  181.     FILE *fi = NULL;
  182.     FILE *fo;
  183.  
  184.     if (nf)
  185.     fi = fopen(nf, "r");
  186.  
  187.     fo = fopen(fn, "w");
  188.     if (fo == NULL) {
  189.     printf("Unable to create %s\n", fn);
  190.     fclose(fi);
  191.     return;
  192.     }
  193.  
  194.     fprintf(fo, "Newsgroups: %s\n", (grp) ? grp->Name : "");
  195.     fprintf(fo, "Subject: \n");
  196.     fprintf(fo, "Distribution: world\n");
  197.     fprintf(fo, "\n");
  198.     IncludeSignature(user, fo);
  199.     fclose(fo);
  200.  
  201.     if (EditFile(fn)) {
  202.     PostNews(NULL, fn);
  203.     } else {
  204.     remove(fn);
  205.     }
  206.     fclose(fi);
  207. }
  208.  
  209. static int
  210. EditFile(fn)
  211. char *fn;
  212. {
  213.     struct stat s1, s2;
  214.     int r = 0;
  215.  
  216.     if (stat(fn, &s1) == 0) {
  217.     sprintf(TmpBuf, "%s %s", GetConfig(NEWSEDITOR, GetConfig(EDITOR, "dme")), fn);
  218.     system(TmpBuf);
  219.     r = 1;
  220.     if (stat(fn, &s2) == 0) {
  221.         if (s1.st_mtime == s2.st_mtime)
  222.         r = 0;
  223.     }
  224.     if (r == 1)
  225.         r = getyn("Send It Off?");
  226.     }
  227.     return(r);
  228. }
  229.  
  230.  
  231. static void
  232. IncludeSignature(user, fo)
  233. char *user;
  234. FILE *fo;
  235. {
  236.     FILE *fi;
  237.  
  238.     sprintf(TmpBuf, "%s.signature", user);
  239.     fi = openlib(TmpBuf);
  240.     if (fi == NULL)
  241.     fi = openlib(".signature");
  242.     if (fi) {
  243.     fputs("--\n", fo);
  244.     while (fgets(TmpBuf, sizeof(TmpBuf), fi))
  245.         fputs(TmpBuf, fo);
  246.     fclose(fi);
  247.     } else {
  248.     puts("Warning, no .signature file!");
  249.     }
  250. }
  251.  
  252. static void
  253. IncludeText(fi, fo)
  254. FILE *fi;
  255. FILE *fo;
  256. {
  257.     if (fi) {
  258.     rewind(fi);
  259.     while (fgets(TmpBuf, sizeof(TmpBuf), fi) && TmpBuf[0] != '\n');
  260.     while (fgets(TmpBuf, sizeof(TmpBuf), fi))
  261.         fprintf(fo, ">%s", TmpBuf);
  262.     }
  263. }
  264.  
  265.