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

  1. /*
  2.  *            S M T P D . C
  3.  *
  4.  *    Server process that is designed to be called by INETD,
  5.  *    the Internet Daemon of Daemons.  It calls SMTPSRVR
  6.  *    with the proper arguments.
  7.  *
  8.  *        R E V I S I O N   H I S T O R Y
  9.  */
  10.  
  11. #include "util.h"
  12. #include <signal.h>
  13. #include <sys/socket.h>
  14. #include <netinet/in.h>
  15. #include <netdb.h>
  16.  
  17. #include "ns.h"
  18.  
  19. extern    int errno;
  20. extern    char *inet_ntoa();
  21.  
  22. struct sockaddr_in addr;
  23.  
  24. int    facist = 0;        /* If set, tell smtpsrvr to dump unknowns */
  25. char    *Smtpserver = 0;    /* Actual smtp server process, full path */
  26. char    *Channel = 0;        /* Logical channel mail will arrive on */
  27. char    obuf[BUFSIZ];        /* Logging will be line buffered */
  28.  
  29. main (argc, argv)
  30. int    argc;
  31. char    **argv;
  32. {
  33.     register int    skt;
  34.     register struct hostent *hp;
  35.     char    thishost[32];
  36.     char    workarea[32];
  37.     char *rmthost;
  38.     struct sockaddr_in rmtaddr;
  39.     int    len_rmtaddr = sizeof rmtaddr;
  40.     int    status;
  41.     int    on = 1;
  42.  
  43. #ifdef NAMESERVER
  44.     /* don't lose connection because NS takes too long */
  45.     ns_settimeo(NS_NETTIME);
  46. #endif
  47.     setbuf( stdout, obuf );
  48.     gethostname( thishost, sizeof(thishost));    /* current hostname */
  49.  
  50.     /* Parse args; args will override configuration file... */
  51.     arginit( argc, argv );
  52.  
  53.     if (getpeername (0, (struct sockaddr *)&rmtaddr, &len_rmtaddr) < 0)
  54.         bomb( "getpeername failed (errno %d)",errno);
  55.  
  56.     (void) setsockopt (0, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof on);
  57.  
  58.     hp = gethostbyaddr ( &rmtaddr.sin_addr,
  59.         sizeof(rmtaddr.sin_addr), AF_INET );
  60.     if ((hp == NULL) || !isstr(hp->h_name)) {
  61.         strcpy(workarea, inet_ntoa(rmtaddr.sin_addr));
  62.         rmthost = workarea;
  63.     } else
  64.         rmthost = hp->h_name;
  65.  
  66.  
  67.     execl (Smtpserver, facist ? "rsmtpsrvr" : "smtpsrvr",
  68.         rmthost, thishost, Channel, (char *)0);
  69.     bomb( "server exec error (%d)", errno);
  70. }
  71.  
  72. extern int optind;
  73.  
  74. arginit(argc, argv)
  75. int    argc;
  76. char    **argv;
  77. {
  78.     register    int    ch;
  79.  
  80.     while ((ch = getopt(argc, argv, "f")) != EOF) {
  81.         switch (ch) {
  82.         case 'f':
  83.             facist++;
  84.             break;
  85.  
  86.         default:
  87.             bomb("Usage: %s [-f] smtpserver channels", argv[0]);
  88.             break;
  89.         }
  90.     }
  91.  
  92.     if (optind == argc)
  93.         bomb("Usage: %s [-f] smtpserver channels", argv[0]);
  94.  
  95.     if (access(argv[optind], 01) < 0)        /* execute privs? */
  96.         bomb("Cannot access server program '%s'", argv[optind]);
  97.     Smtpserver = argv[optind];
  98.     Channel = argv[++optind];
  99. }
  100.  
  101. /* VARARGS */
  102. bomb( fmt, a, b, c, d )
  103. char *fmt;
  104. {
  105.     fputs( "451 ", stdout );
  106.     fprintf( stdout, fmt, a, b, c, d );
  107.     fputs( "\r\n", stdout );
  108.     fflush( stdout );
  109.     exit (99);
  110. }
  111.