home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / sendmail / sendmail.cf / src / pathsend / pathsend.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-01-13  |  3.5 KB  |  179 lines

  1. /*
  2.  * pathsend dest-host user
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <ctype.h>
  7.  
  8. typedef struct {
  9.     char *dptr;
  10.     int dsize;
  11. } datum;
  12.  
  13. /* From sendmail sysexits.c */
  14. #define    ERR_USAGE    64
  15. #define    ERR_DATAERR    65
  16. #define    ERR_NOHOST    68
  17. #define    ERR_UNAVAILABLE    69
  18. #define    ERR_SOFTWARE    70
  19. #define    ERR_OSERR    71
  20. #define    ERR_OSFILE    72
  21.  
  22. extern datum fetch();
  23.  
  24. #define PATHALIASES    "/usr/lib/pathaliases"
  25. #define SENDMAIL    "/usr/lib/sendmail"
  26.  
  27. #define MAXRECIPIENTS    100+3
  28.  
  29. char *sendmail = SENDMAIL;
  30.  
  31. extern int errno;
  32.  
  33. main(argc, argv)
  34. char *argv[];
  35. {
  36.     datum key, content;
  37.     int i, pid, verbose = 0, debug = 0, index, saveindex;
  38.     register char *bp;
  39.     char *user, *from = ((char *) NULL), *mkstring(), *findhost();
  40.     char dest[2048], buf[2048];
  41.     char *sendargv[MAXRECIPIENTS];
  42.  
  43.     for (argc--, argv++; argc && **argv == '-'; argc -= i, argv += i) {
  44.     i = 1;
  45.     while (*++*argv) {
  46.         switch (**argv) {
  47.         case 'd':
  48.             debug++;
  49.             break;
  50.         case 'f':
  51.             if (argc <= i)
  52.             done(ERR_USAGE, 0, "Not enough args for '-f'");
  53.             from = argv[i++];
  54.             break;
  55.         case 'm':
  56.             if (argc <= i)
  57.             done(ERR_USAGE, 0, "Not enough args for '-m'");
  58.             sendmail = argv[i++];
  59.             break;
  60.         case 'v':
  61.             verbose++;
  62.             break;
  63.         default:
  64.             fprintf(stderr,"Unknown switch '-%c'\n",**argv);
  65.             done(ERR_USAGE, 0,
  66.         "Usage: pathsend [-dv] [-m mailer] [host!...!user]");
  67.         }
  68.     }
  69.     }
  70.  
  71.     if (dbminit(PATHALIASES) < 0)
  72.     done(ERR_SOFTWARE, errno, "pathsend: can't dbminit %s",PATHALIASES);
  73.  
  74.     index = 0;
  75.     sendargv[index++] = "pathsendmail";
  76.  
  77.     if (verbose)
  78.     sendargv[index++] = "-v";
  79.     
  80.     if (from) {
  81.     sendargv[index++] = "-f";
  82.     sendargv[index++] = from;
  83.     }
  84.  
  85.     saveindex = index;
  86.     for (; argc > 0; argv++, argc--) {
  87.  
  88.     /* Default pathalias address is original address */
  89.     strcpy(buf,*argv);
  90.  
  91.     /* Try and pathalias each host in left-to-right order,
  92.      * until a pathalias-able host is found
  93.      */
  94.     for (user = *argv; user = findhost(user,dest);) {
  95.  
  96.         key.dptr = dest;
  97.         key.dsize = strlen(dest) + 1;
  98.         content = fetch(key);
  99.  
  100.         if (content.dptr != 0) {
  101.         sprintf(buf, content.dptr, user);
  102.         break;
  103.         }
  104.     }
  105.  
  106.     /* Make sure there is no recursive pathaliasing */
  107.     strcat(buf,";nopath");
  108.  
  109.     sendargv[index++] = mkstring(buf);
  110.     }
  111.  
  112.     if (index != saveindex) {
  113.     sendargv[index] = (char *)NULL;
  114.     if (debug) {
  115.         printf("sending to < ");
  116.         for (i = saveindex; i < index; i++)
  117.         printf("%s ",sendargv[i]);
  118.         printf(">\n");
  119.     } else {
  120.         switch (pid = fork()) {
  121.         case -1:
  122.             done(ERR_OSERR, errno, "pathsend: can't fork");
  123.         case 0:
  124.             execv(sendmail,sendargv);
  125.             done(ERR_OSFILE, errno,
  126.             "pathsend: can't execl %s", SENDMAIL);
  127.         default:
  128.             while (wait((int *) NULL) != pid);
  129.             break;
  130.         }
  131.     }
  132.     }
  133.  
  134.     done(0);
  135. }
  136.  
  137. extern int sys_nerr;
  138. extern char *sys_errlist[];
  139.  
  140. done(status,err,str,a,b,c,d,e,f)
  141. int status, err;
  142. char *str;
  143. {
  144.     if (status) {
  145.     fprintf(stderr,str,a,b,c,d,e,f);
  146.     if (err && err < sys_nerr)
  147.         fprintf(stderr, ": %s", sys_errlist[err]);
  148.     else
  149.         fprintf(stderr, ": unknown error %d", err);
  150.     fprintf(stderr, "\n");
  151.     }
  152.     exit(status);
  153. }
  154.  
  155. char *
  156. mkstring(string)
  157. char *string;
  158. {
  159.     char *str, *malloc();
  160.  
  161.     if ((str = malloc(strlen(string)+1)) == (char *)NULL)
  162.     done(ERR_SOFTWARE, errno, "can't malloc for destination");
  163.     strcpy(str,string);
  164.     return(str);
  165. }
  166.  
  167. char *
  168. findhost(user,dest)
  169. char *user,*dest;
  170. {
  171.     char *newuser,*index();
  172.  
  173.     if ((newuser = index(user,'!')) == NULL)
  174.     return((char *) NULL);
  175.  
  176.     sscanf(user,"%[^!]!",dest);
  177.     return(++newuser);
  178. }
  179.