home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / uip / snd / s_do.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-06-02  |  5.2 KB  |  212 lines

  1. /*
  2. **         D O _ *
  3. **
  4. **
  5. **    R E V I S I O N  H I S T O R Y
  6. **
  7. **    03/31/83  GWH    Split the SEND program into component parts
  8. **            This module contains do_text, do_hdr,
  9. **            next_address, and snd_abort.
  10. **
  11. **    05/31/83  GWH    Added code for the updating of a copyfile.
  12. */
  13. #include "./s.h"
  14. #include "./s_externs.h"
  15.  
  16. int     sentfd;
  17.  
  18. do_text (isbcc)
  19.     int isbcc;                    /* true, if bcc copy                  */
  20. {
  21.     extern char *cnvtdate ();
  22.     struct header *hp;
  23.     struct rp_bufstruct thereply;
  24.     int     retval;
  25.     int     i;
  26.     int     len;
  27.     char    date[32];
  28.     if( cflag > 0){
  29.         if ((sentfd = open (copyfile, 1)) >= 0)
  30.         lseek (sentfd, 0l, 2);    /* set up to save a copy           */
  31.         else
  32.         sentfd = creat (copyfile, sentprotect);
  33.         if (sentfd >= 0)              /* terminate saved copy            */
  34.         write (sentfd, delim1, strlen (delim1));
  35.     }
  36.     cnvtdate (TIMREG, date);      /* arpanet style date/time            */
  37.     do_hdr (datename, date);
  38.     do_hdr (fromname, signature);
  39.  
  40.     if (to[0] == '\0')
  41.     do_hdr (toname, "list: ;"); /* no To: addresses, so fake it       */
  42.     else
  43.     do_hdr ((isbcc) ? BCtoname : toname, to);
  44.  
  45.     if (cc[0] != '\0')
  46.     do_hdr ((isbcc) ? BCccname : ccname, cc);
  47.  
  48.     if (subject[0] != '\0')
  49.     do_hdr (subjname, subject);
  50.  
  51.     if (isbcc && to[0] != '\0')   /* put empty Bcc: field in bcc copies */
  52.     do_hdr (bccname, "(Private)");
  53.                   /* when there also are To addresses   */
  54.     for (hp = headers; hp != NULL; hp = hp->hnext)
  55.     if (isstr(hp->hdata))
  56.         do_hdr (hp->hname, hp->hdata);
  57.  
  58.     mm_wtxt ("\n", 1);           /* blank line separate headers & body */
  59.     if( cflag > 0 ) {
  60.         if (sentfd >= 0)
  61.         write (sentfd, "\n", 1);
  62.     }
  63.  
  64.     dropen (DRBEGIN);
  65.  
  66.     while ((i = read (drffd, bigbuf, BBSIZE - 1)) > 0)
  67.     {                             /* copy the body                      */
  68.     if (rp_isbad (retval = mm_wtxt (bigbuf, i)))
  69.         snd_abort ("Problem with writing text buffer [%s].\n", rp_valstr (retval));
  70.     if( cflag > 0 ){
  71.         if (sentfd >= 0)      /* save the body                  */
  72.             write (sentfd, bigbuf, i);
  73.     }
  74.     }
  75.  
  76.     if(cflag > 0 ){
  77.         if (sentfd >= 0)              /* terminate saved copy           */
  78.         {
  79.         if (bigbuf[i - 1] != '\n')
  80.             write (sentfd, "\n", 1);
  81.                      /* make sure it ends with newline  */
  82.         write (sentfd, delim2, strlen (delim2));
  83.         close (sentfd);
  84.         }
  85.     }
  86.  
  87.     if (rp_isbad (retval = mm_wtend ()))
  88.     snd_abort ("Problem with ending write of text buffer [%s].\n", rp_valstr (retval));
  89.     if (rp_isbad (retval = mm_rrply (&thereply, &len)))
  90.     snd_abort ("Problem reading reply to text write [%s].\n", rp_valstr (retval));
  91.     switch (rp_gval (thereply.rp_val))
  92.     {                             /* how did MMDF like it?              */
  93.     case RP_OK: 
  94.     case RP_MOK: 
  95.         break;          /* Text ok */
  96.  
  97.     case RP_NO: 
  98.         snd_abort ("Error in text transmission : General purpose no. RP_NO.\n");
  99.         break;
  100.  
  101.     case RP_NDEL: 
  102.         snd_abort ("Error in text transmission : Could not deliver. RP_NDEL.\n");
  103.         break;
  104.  
  105.     case RP_AGN: 
  106.         snd_abort ("Error in text transmission : Not now, maybe later. RP_AGN.\n");
  107.         break;
  108.  
  109.     case RP_NOOP: 
  110.         snd_abort ("Error in text transmission : Nothing done, this time.\n");
  111.         break;
  112.  
  113.     default: 
  114.         snd_abort (" Unexpected text response:  [%s] %s\n",
  115.             rp_valstr (thereply.rp_val), thereply.rp_line);
  116.     }
  117.     return (RP_OK);
  118. }
  119.  
  120. do_hdr (name, data)               /* send out a header field            */
  121.     char name[],                  /* name of field                      */
  122.     *data;                    /* value-part of field                */
  123. {
  124.     int retval;
  125.     register int ind;
  126.     register int thesize;
  127.     register char *curptr;
  128.  
  129.     for (curptr = data, ind = 0; ind >= 0; curptr += ind + 1)
  130.     {
  131.     if ((ind = strindex ("\n", curptr)) >= 0)
  132.         curptr[ind] = '\0';   /* format lines properly              */
  133.  
  134.     sprintf (bigbuf, hdrfmt, (curptr == data) ? name : "", curptr);
  135.                   /* begin with blank on added lines    */
  136.     if (rp_isbad (retval = mm_wtxt (bigbuf, (thesize = strlen (bigbuf)))))
  137.         snd_abort ("Problem with writing header buffer [%s].\n", rp_valstr (retval));
  138.  
  139.     if(cflag > 0 ){
  140.         if (sentfd >= 0)          /* save the message?                  */
  141.             write (sentfd, bigbuf, thesize);
  142.     }
  143.  
  144.     if (ind >= 0)
  145.         curptr[ind] = '\n';   /* put it back                        */
  146.     }
  147. }
  148.  
  149.  
  150. next_address (addr)
  151. char    *addr;
  152. {
  153.     int     i = -1;               /* return -1 = end; 0 = empty         */
  154.  
  155.     for (;;)
  156.     switch (*adrptr)
  157.     {
  158.         default: 
  159.         addr[++i] = *adrptr++;
  160.         continue;
  161.  
  162.         case '"':
  163.         for (addr[++i] = *adrptr++; !isnull (*adrptr); )
  164.         {
  165.             addr[++i] = *adrptr;
  166.             if (*adrptr++ == '"')
  167.             break;
  168.         }
  169.         continue;
  170.  
  171.         case '(':
  172.         for (addr[++i] = *adrptr++; !isnull (*adrptr); )
  173.         {
  174.             addr[++i] = *adrptr;
  175.             if (*adrptr++ == ')')
  176.             break;
  177.         }
  178.         continue;
  179.  
  180.         case '<':
  181.         for (addr[++i] = *adrptr++; !isnull (*adrptr); )
  182.         {
  183.             addr[++i] = *adrptr;
  184.             if (*adrptr++ == '>')
  185.             break;
  186.         }
  187.         continue;
  188.  
  189.         case '\n':
  190.         case ',': 
  191.         addr[++i] = '\0';
  192.         adrptr++;
  193.         return (i);
  194.  
  195.         case '\0': 
  196.         if (i >= 0)
  197.             addr[++i] = '\0';
  198.         return (i);
  199.     }
  200. }
  201.  
  202. /* VARARGS1 */
  203.  
  204. snd_abort (fmt, b, c, d, e, f)
  205. char   fmt[], b[], c[], d[], e[], f[];
  206. {
  207.     printf ("\n\t");
  208.     printf (fmt, b, c, d, e, f);
  209.     fflush (stdout);
  210.     longjmp (savej, 1);
  211. }
  212.