home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / sendmail / uk-sendmail2.1 / Support / muucp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-11  |  2.7 KB  |  155 lines

  1. /*
  2.  *  MUUCP  --  Send mail over uucp, using the UUCP Transmission Format
  3.  *
  4.  *    This simply prepends a unix from line of the appropriate form to the
  5.  *    message which is then passed on the uux.    -Jim Crammond    12/88.
  6.  *
  7.  *    usage:  muucp [-r] [-gA] -f<from_addr> -H<uucpname> host user1 user2...
  8.  */
  9. #include <stdio.h>
  10. #include <sysexits.h>
  11. #include <sys/types.h>
  12.  
  13. char    uuxcmd[1024] = "/usr/bin/uux -";
  14.  
  15. char    *perc_to_uucp();
  16. char    *tidy_addr();
  17. char    *index();
  18. char    *rindex();
  19. FILE    *popen();
  20.  
  21. main(argc, argv)
  22. int    argc;
  23. char    *argv[];
  24. {
  25.     FILE    *out;
  26.     char    lbuf[BUFSIZ];
  27.     char    *From = NULL;
  28.     char    *sysname = NULL;
  29.     int    i;
  30.     time_t    now;
  31.  
  32.     while (argc > 1 && argv[1][0] == '-')
  33.     {    switch(argv[1][1])
  34.         {
  35.         case 'f':
  36.             From = &argv[1][2];
  37.             break;
  38.         case 'H':
  39.             sysname = &argv[1][2];
  40.             break;
  41.         case 'r':
  42.         case 'g':
  43.         case 'O':
  44.         case 'x':
  45.             strcat(uuxcmd, " ");
  46.             strcat(uuxcmd, argv[1]);
  47.             break;
  48.         default:
  49.             fprintf(stderr, "unknown flag %s\n", argv[1]);
  50.                 break;
  51.         }
  52.         argc--;
  53.         argv++;
  54.     }
  55.  
  56.     if (argc < 3 || From == NULL || sysname == NULL)
  57.     {    fprintf(stderr, "usage: muucp -f<From> -H<sysname> host users...\n");
  58.         exit(EX_USAGE);
  59.     }
  60.  
  61.     /*  add host!rmail (users) to cmd line  */
  62.     strcat(uuxcmd, " ");
  63.     strcat(uuxcmd, argv[1]);
  64.     strcat(uuxcmd, "!rmail '(");
  65.     argc--;
  66.     argv++;
  67.  
  68.     while (--argc > 1)
  69.     {    strcat(uuxcmd, argv[1]);
  70.         strcat(uuxcmd, " ");
  71.         argv++;
  72.     }
  73.  
  74.     strcat(uuxcmd, argv[1]);
  75.     strcat(uuxcmd, ")'");
  76.  
  77.     /*  open pipe to uux  */
  78.     out = popen(uuxcmd, "w");
  79.  
  80.     /*  generate the UUCP From line  */
  81.     From = perc_to_uucp(From);
  82.     From = tidy_addr(From);
  83.     time(&now);
  84.     fprintf(out, "From %s %.24s remote from %s\n", From, ctime(&now), sysname);
  85.  
  86.     /*  pass stdin (mail message) to uux  */
  87.     while (fgets(lbuf, sizeof lbuf, stdin))
  88.         fputs(lbuf, out);
  89.  
  90.     /*  close pipe  */
  91.     i = pclose(out);
  92.     if ((i & 0377) != 0)
  93.     {    fprintf(stderr, "pclose: status 0%o\n", i);
  94.         exit(EX_OSERR);
  95.     }
  96.  
  97.     exit((i >> 8) & 0377);
  98. }
  99.  
  100.  
  101. /*
  102. **  PERC_TO_UUCP  --  converts an address in Percent style into uucp style
  103. **
  104. **    e.g.  user%c.bitnet%b.arpa@a.uucp -> a.uucp!b.arpa!c.bitnet!user
  105. */    
  106. char    *
  107. perc_to_uucp(addr)
  108. char    *addr;
  109. {
  110.     static    char    buf[512];
  111.     char    *bp = buf;
  112.     char    *p;
  113.  
  114.     while ((p = rindex(addr,'@')) != NULL || (p = rindex(addr,'%')) != NULL)
  115.     {
  116.         *p++ = '\0';
  117.         while (*p)
  118.             *bp++ = *p++;
  119.  
  120.         *bp++ = '!';
  121.     }
  122.  
  123.     strcpy(bp, addr);
  124.  
  125.     return(buf);
  126. }
  127.  
  128. /*
  129. **  TIDY_ADDR  --  strips duplicate domain names from start of address
  130. **
  131. **    e.g.  cs.hw.AC.UK!cs.hw.AC.UK!jim -> cs.hw.AC.UK!jim
  132. */    
  133. char    *
  134. tidy_addr(addr)
  135. char    *addr;
  136. {
  137.     register char    *p, *q;
  138.  
  139.     p = addr;
  140.     while ((q = index(p, '!')) != NULL)
  141.     {    ++q;
  142.         while (*p != '!' && *p == *q)
  143.         {    p++;
  144.             q++;
  145.         }
  146.         if (*p != '!' && *q != '!')
  147.             break;
  148.  
  149.         addr = ++p;
  150.     }
  151.  
  152.  
  153.     return(addr);
  154. }
  155.