# 2.11BSD#431 - /usr/src/usr.sbin/sendmail.MX/aux/bbn_daemon.c

##### Functions

    getrequests       X
    makeconnection    X
    myhostname        X

##### Macros

    SMTPSOCK          X

       1: # include <errno.h>
       2: # include "sendmail.h"
       3:
       4: #ifndef DAEMON
       5: SCCSID(@(#)bbn_daemon.c	3.36+		12/13/82	(w/o daemon mode));
       6: #else
       7: SCCSID(@(#)bbn_daemon.c	3.36+		12/13/82	(w/ daemon mode));
       8:
       9: /*
      10: **  DAEMON.C -- routines to use when running as a daemon.
      11: **
      12: **	BB&N Version.  Hack attack!!  This version is not supported,
      13: **	and probably has some bugs......
      14: **
      15: **	Basic semantics are:
      16: **
      17: **	getrequests()
      18: **		Opens a port and initiates a connection.
      19: **		Returns in a child.  Must set InChannel and
      20: **		OutChannel appropriately.
      21: **	makeconnection(host, port, outfile, infile)
      22: **		Make a connection to the named host on the given
      23: **		port.  Set *outfile and *infile to the files
      24: **		appropriate for communication.  Returns zero on
      25: **		success, else an exit status describing the
      26: **		error.
      27: **
      28: **	The semantics of both of these should be clean.
      29: */
      30:
      31: #include "netlib.h"
      32: #include "con.h"
      33: #include <wait.h>
      34:
      35: #define SMTPSOCK    25
      36: /*
      37: **  GETREQUESTS -- open mail IPC port and get requests.
      38: **
      39: **	Parameters:
      40: **		none.
      41: **
      42: **	Returns:
      43: **		none.
      44: **
      45: **	Side Effects:
      46: **		Waits until some interesting activity occurs.  When
      47: **		it does, a child is created to process it, and the
      48: **		parent waits for completion.  Return from this
      49: **		routine is always in the child.
      50: */
      51:
      52: getrequests()
      53: {
      54:     int t;
      55:     int iretval;
      56:     union wait status;
      57:     struct con openparams;
      58:
      59:     /*
      60: 	**  Set up the address for the mailer.
      61: 	*/
      62:
      63:     bzero (&openparams, sizeof openparams); /* clear out the structure */
      64:
      65:
      66:     openparams.c_mode = CONTCP;
      67:     openparams.c_lport = SMTPSOCK;
      68:     openparams.c_rbufs = 2;     /* 2k receive buffer */
      69:
      70:     /*
      71: 	**  Try to actually open the connection.
      72: 	*/
      73:
      74: # ifdef DEBUG
      75:     if (tTd(15, 1))
      76:         printf("getrequests\n");
      77: # endif DEBUG
      78:
      79:     for (;;)
      80:     {
      81:         /* wait for a connection */
      82:         register int pid;
      83:
      84:         do
      85:         {
      86:             errno = 0;
      87:             t = open("/dev/net/net", &openparams);
      88:         } while (t < 0 && errno == EINTR);
      89:         if (t < 0)
      90:         {
      91:             syserr("getrequests: open");
      92:             sleep(500);
      93:             continue;
      94:         }
      95:
      96:
      97:         /* set 'eol' mode in connection */
      98:
      99:         ioctl (t, NETSETE, 0);
     100:
     101:         /*
     102: 		**  Create a subprocess to process the mail.
     103: 		*/
     104:
     105: # ifdef DEBUG
     106:         if (tTd(15, 2))
     107:             printf("getrequests: forking (fd = %d)\n", t);
     108: # endif DEBUG
     109:
     110:         pid = fork();
     111:         if (pid < 0)
     112:         {
     113:             syserr("daemon: cannot fork");
     114:             sleep(10);
     115:             (void) close(t);
     116:             continue;
     117:         }
     118:
     119:         if (pid == 0)
     120:         {
     121:             /*
     122: 			**  CHILD -- return to caller.
     123: 			**	Verify calling user id if possible here.
     124: 			*/
     125:
     126:             InChannel = fdopen(t, "r");
     127:             OutChannel = fdopen(t, "w");
     128: # ifdef DEBUG
     129:             if (tTd(15, 2))
     130:                 printf("getreq: returning\n");
     131: # endif DEBUG
     132: # ifdef LOG
     133:             if (LogLevel > 11)
     134:                 syslog(LOG_DEBUG, "connected, pid=%d", getpid());
     135: # endif LOG
     136:             return;
     137:         }
     138:
     139:         /*
     140: 		**  PARENT -- wait for child to terminate.
     141: 		**	Perhaps we should allow concurrent processing?
     142: 		*/
     143:
     144: # ifdef DEBUG
     145:         if (tTd(15, 2))
     146:         {
     147:             sleep(2);
     148:             printf("getreq: parent waiting\n");
     149:         }
     150: # endif DEBUG
     151:
     152:         /* close the port so that others will hang (for a while) */
     153:         if ((iretval = close(t)) < 0)
     154:             syserr("getreq:  cannot close port 25:  %d", iretval) ;
     155:
     156:
     157:         /* pick up old zombies; implement load limiting */
     158:         while (wait3(&status, WNOHANG, 0) > 0)
     159:             continue;
     160:     }
     161: }
     162: /*
     163: **  MAKECONNECTION -- make a connection to an SMTP socket on another machine.
     164: **
     165: **	Parameters:
     166: **		host -- the name of the host.
     167: **		port -- the port number to connect to.
     168: **		outfile -- a pointer to a place to put the outfile
     169: **			descriptor.
     170: **		infile -- ditto for infile.
     171: **
     172: **	Returns:
     173: **		An exit code telling whether the connection could be
     174: **			made and if not why not.
     175: **
     176: **	Side Effects:
     177: **		none.
     178: */
     179:
     180: makeconnection(host, port, outfile, infile)
     181:     char *host;
     182:     u_short port;
     183:     FILE **outfile;
     184:     FILE **infile;
     185: {
     186:     register int s;
     187:     struct con openparams;
     188:
     189:     bzero (&openparams, sizeof openparams); /* clear structure's memory */
     190:
     191:     openparams.c_mode = CONACT | CONTCP;
     192:     openparams.c_timeo = 60;
     193:
     194:     /*
     195: 	**  Set up the address for the mailer.
     196: 	**	Accept "[a.b.c.d]" syntax for host name.
     197: 	*/
     198:
     199:     if (host[0] == '[')
     200:     {
     201:         long hid = 0;
     202:         int i, j;
     203:         register char *p = host;
     204:
     205:         for (i = 3; i >= 0 && *p != ']' && *p != '\0'; i--)
     206:         {
     207:             j = 0;
     208:             while (isdigit(*++p))
     209:                 j = j * 10 + (*p - '0');
     210:             if (*p != (i == 0 ? ']' : '.') || j > 255 || j < 0)
     211:                 break;
     212:             hid |= j << ((3 - i) * 8);
     213:         }
     214:         if (i >= 0 || *p != ']' || *++p != '\0')
     215:         {
     216:             usrerr("Invalid numeric domain spec \"%s\"", host);
     217:             return (EX_NOHOST);
     218:         }
     219:         openparams.c_fcon._na_l = hid;
     220:     }
     221:     else
     222:     {
     223:
     224:         openparams.c_fcon = gethost(host);
     225:         if (isbadhost(openparams.c_fcon))
     226:             return (EX_NOHOST);
     227:     }
     228:
     229:     /*
     230: 	**  Determine the port number.
     231: 	*/
     232:
     233:     if (port == 0)
     234:         openparams.c_fport = SMTPSOCK;
     235:     else
     236:         openparams.c_fport = port;
     237:
     238:     /*
     239: 	**  Try to actually open the connection.
     240: 	*/
     241:
     242: # ifdef DEBUG
     243:     if (tTd(16, 1))
     244:         printf("makeconnection(%s=%X)\n", host, openparams.c_fcon._na_l);
     245: # endif DEBUG
     246:
     247:     s = open("/dev/net/net", &openparams);
     248:
     249: # ifdef DEBUG
     250:     if (tTd(16, 1))
     251:         printf("makeconnection: %d\n", s);
     252: # endif DEBUG
     253:
     254:     if (s < 0)
     255:         return (EX_TEMPFAIL);
     256:
     257:     /* connection ok, put it into canonical form */
     258:     *outfile = fdopen(s, "w");
     259:     *infile = fdopen(s, "r");
     260:
     261:     return (0);
     262: }
     263:
     264: # endif DAEMON
     265: /*
     266: **  MYHOSTNAME -- return the name of this host.
     267: **
     268: **	This is a hideous hack....  It should be fixed to really work
     269: **	under the BB&N code.  However, since Brendan's configuration
     270: **	tables don't use this feature it won't matter.
     271: **
     272: **	Parameters:
     273: **		hostbuf -- a place to return the name of this host.
     274: **		size -- the size of hostbuf.
     275: **
     276: **	Returns:
     277: **		A list of aliases for this host.
     278: **		NULL if it cannot be found.
     279: **
     280: **	Side Effects:
     281: **		none.
     282: */
     283:
     284: char **
     285: myhostname(hostbuf, size)
     286:     char hostbuf[];
     287:     int size;
     288: {
     289:     register FILE *f;
     290:
     291:     hostbuf[0] = '\0';
     292:     f = fopen("/usr/include/whoami", "r");
     293:     if (f != NULL)
     294:     {
     295:         (void) fgets(hostbuf, size, f);
     296:         fixcrlf(hostbuf, TRUE);
     297:         (void) fclose(f);
     298:     }
     299:     return (NULL);
     300: }

#### Defined functions

getrequests defined in line 52; never used
makeconnection defined in line 180; never used
myhostname defined in line 284; never used

#### Defined macros

SMTPSOCK defined in line 35; used 2 times

- in line 67, 234

Last modified: 1983-07-13 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1416 |