home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / src / prog / qu2pr_send.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-02-28  |  4.6 KB  |  217 lines

  1. /*
  2.  *    MULTI-CHANNEL MEMO DISTRIBUTION FACILITY  (MMDF)
  3.  *
  4.  *    Department of Electrical Engineering
  5.  *    University of Delaware
  6.  *    Newark, Delaware  19711
  7.  *
  8.  *
  9.  *    Program Channel: Take message and feed a request to a program
  10.  *
  11.  *
  12.  *    Q U 2 P R _ S E N D . C
  13.  *    ========================
  14.  *
  15.  *    ?
  16.  *
  17.  *    J.B.D.Pardoe
  18.  *    University of Cambridge Computer Laboratory
  19.  *    October 1985
  20.  *    
  21.  *    based on the UUCP channel by Doug Kingston (US Army Ballistics 
  22.  *    Research Lab, Aberdeen, Maryland: <dpk@brl>)
  23.  *
  24.  */
  25.  
  26. #include "util.h"
  27. #include "mmdf.h"
  28. #include "ch.h"
  29. #include <signal.h>
  30. #include "ap.h"
  31. #include "phs.h"
  32.  
  33. extern    char    *strdup();
  34. extern    char    *ap_p2s();
  35. extern    char    *multcat();
  36.  
  37. extern struct ll_struct   *logptr;
  38. extern char *qu_msgfile;          /* name of file containing msg text   */
  39. extern Chan      *chan;  /* Who we are */
  40.  
  41. static qu2pr_each();
  42.  
  43. int pipebroken; /* set if SIGPIPE occurs */
  44.  
  45. LOCVAR struct rp_construct
  46.     rp_aend =
  47. {
  48.     RP_OK, 'p', 'r', 'o', 'g', ' ', 'e', 'n', 'd', ' ', 'o', 'f', ' ', 'a',
  49.     'd', 'd', 'r', ' ', 'l', 'i', 's', 't', '\0'
  50. },
  51.     rp_mok =
  52. {
  53.     RP_MOK, 'm', 'o', 'k', '\0'
  54. },
  55.     rp_noop =
  56. {
  57.     RP_NOOP, 's', 'u', 'b', '-', 'l', 'i', 's', ' ', 'n', 'o', 't', ' ',
  58.     's', 'p', 'e', 'c', 'i', 'a', 'l', '\0'
  59. },
  60.     rp_err =
  61. {
  62.     RP_NO, 'u', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', '\0'
  63. },
  64.     rp_pipe =
  65. {
  66.     RP_NET, 'p', 'r', 'o', 'g', 'r', 'a', 'm', ' ', 'f', 'a', 'i', 'l', 'e', 'd', '\0'
  67. },
  68.     rp_bhost =
  69. {
  70.     RP_USER, 'b', 'a', 'd', ' ', 'h', 'o', 's', 't', ' ', 'n', 'a',
  71.     'm', 'e', '\0'
  72. };
  73.  
  74.  
  75. /* 
  76.  * qu2pr_send : overall management for batch of msgs
  77.  * ==========
  78.  */
  79. qu2pr_send ()
  80. {
  81.     short rp;
  82.     char  info[LINESIZE], sender[ADDRSIZE];
  83.  
  84. #ifdef DEBUG
  85.     ll_log (logptr, LLOGBTR, "qu2pr_send ()");
  86. #endif
  87.  
  88.     if (rp_isbad (rp = qu_pkinit ()))
  89.     return (rp);
  90.  
  91.     /*
  92.      *  AP_SAME == NO header munging.  We need to read the header
  93.      *  ourselves and the munging just gets in the way.
  94.      */
  95.     while (rp_gval ((rp = qu_rinit (info, sender, chan->ch_apout))) != RP_DONE)
  96.     {                             /* get initial info for new message   */
  97.     if (rp_gval (rp) == RP_FIO)          /* Can't open message file */
  98.         continue;
  99.     else if (rp_gval (rp) != RP_OK)      /* Some other error */
  100.         break;
  101.     phs_note (chan, PHS_WRSTRT);
  102.  
  103.     if (rp_isbad (rp = qu2pr_each (sender))) return (rp);
  104.     qu_rend ();
  105.     }
  106.     qu_rend ();
  107.  
  108.     if (rp_gval (rp) != RP_DONE)
  109.     {
  110.     ll_log (logptr, LLOGTMP, "not DONE (%s)", rp_valstr (rp));
  111.     return (RP_RPLY);         /* catch protocol errors              */
  112.     }
  113.  
  114.     qu_pkend ();
  115.     phs_note (chan, PHS_WREND);
  116.  
  117.     return (rp);
  118. }
  119.  
  120. /* */
  121. /*
  122.  * qu2pr_each : execute command for one address
  123.  * ==========
  124.  */
  125.  
  126. static qu2pr_each (sender)
  127.     char *sender;
  128. {
  129.     RP_Buf    rply;
  130.     short     rp;
  131.     char      host [ADDRSIZE];
  132.     char      adr  [ADDRSIZE];
  133.     extern sigtype brpipe ();
  134.     sigtype   (*oldsig) ();
  135.  
  136. #ifdef DEBUG
  137.     ll_log (logptr, LLOGBTR, "qu2pr_each()");
  138. #endif
  139.  
  140.     for (;;) /* ..all addresses */
  141.     {                        
  142.     rp = qu_radr (host, adr);
  143.     if (rp_isbad (rp)) return (rp);
  144.  
  145.     if (rp_gval (rp) == RP_HOK) {
  146.         qu_wrply ((RP_Buf *) &rp_noop, sizeof rp_noop);
  147.         continue;
  148.     } else if (rp_gval (rp) == RP_DONE) {
  149.         qu_wrply ((RP_Buf *) &rp_aend, sizeof rp_aend);
  150.         return (RP_OK); /* end of address list */
  151.     }
  152.  
  153.     pipebroken = 0;
  154.     oldsig = signal (SIGPIPE, brpipe);
  155.  
  156.     rply.rp_val = pr_wtadr (host, adr, sender);
  157.     switch (rply.rp_val) {
  158.         case RP_AOK:
  159.         case RP_OK:
  160. #ifdef DEBUG
  161.         ll_log (logptr, LLOGFTR, "Calling txtcpy()\n");
  162. #endif
  163.         rply.rp_val = pr_txtcpy();
  164.         break;
  165.  
  166.         case RP_USER:
  167.         ll_log (logptr, LLOGFAT, "host (%s) not in table", host);
  168.         blt(&rp_bhost, (char *) &rply, sizeof rp_bhost);
  169.         break;
  170.  
  171.         case RP_AGN:
  172.         blt(&rp_pipe, (char *) &rply, sizeof rp_pipe);
  173.         break;
  174.  
  175.         default:
  176.         ll_log (logptr,LLOGFAT,"unknown error (0%o)", rply.rp_val);
  177.         blt(&rp_err, (char *) &rply, sizeof rp_err);
  178.         rply.rp_val = RP_NO;
  179.     }
  180.     if (rply.rp_val != RP_MOK) {
  181.         qu_wrply (&rply, sizeof(rply.rp_val) + strlen(rply.rp_line));
  182.     } else {
  183.         rply.rp_val = pr_wttend ();
  184.         switch (rply.rp_val) {
  185.         case RP_AOK:
  186.         case RP_OK:
  187.         case RP_MOK:
  188.             qu_wrply (&rp_mok, sizeof rp_mok);    
  189.             break;
  190.  
  191.         case RP_USER:
  192.             ll_log (logptr, LLOGFAT, "host (%s) not in table", host);
  193.             qu_wrply (&rp_bhost, sizeof rp_bhost);
  194.             break;
  195.  
  196.         case RP_LIO:
  197.             ll_log (logptr,LLOGTMP,"prx pipe broke");
  198.             qu_wrply (&rp_pipe, sizeof rp_pipe);
  199.             break;
  200.  
  201.         default:
  202.             ll_log (logptr,LLOGFAT,"unknown error on close (0%o)", rply.rp_val);
  203.             qu_wrply (&rp_err, sizeof rp_err);
  204.         }
  205.     }
  206.     signal (SIGPIPE, oldsig);
  207.     }
  208. }
  209.  
  210.  
  211. sigtype
  212. brpipe ()
  213. {
  214.     pipebroken = 1;
  215.     signal (SIGPIPE, SIG_IGN);
  216. }
  217.