ftp.nice.ch/pub/next/unix/admin/msend.1.0.N.bs.tar.gz#/msend/msendd.c

This is msendd.c in view mode; [Download] [Up]

/* msendd.c:
 *
 * daemon required to allow msend to operate.  works with inetd also.
 *
 * (c) Copyright 1988, 1989, 1990 Jim Frost.  All Rights Reserved.  Please see
 * the accompanying file "Copyright" for more information.
 *
 * special thanks to Barry Shein (bzs@bu-it.bu.edu) for the skeleton
 * that this was built from.
 */

#include "Copyright"
#include "config.h"
#include "msend.h"

#ifdef ROUTE
short doroute = 1;
#endif

#ifdef DBROADCAST
short dobroadcast = 1;
#endif

#ifdef SECURE_PORT
short notsecure = 1;
#endif

static void fireman()	/* catches falling babies */
{ WAIT_STATUS wstatus;

  while(wait3(&wstatus,WNOHANG,NULL) > 0);
}

static void sigint()
{ error("SIGINT interrupt received");
  die(0);
}

static void sigterm()
{ error("SIGTERM interrupt received");
  die(0);
}


main(argc,argv)
     int argc;
     char *argv[];
{ 
  char c;
  int s,t;
  int i;
  struct sockaddr_in isa;
  extern int errno;


  while ((c = getopt(argc, argv, "rb")) != (char) -1) {
    switch(c) {
    case 'r':
#ifdef ROUTE
      doroute = 0;
#endif
      break;
    case 'b':
#ifdef DBROADCAST
      dobroadcast = 0;
#endif
      break;
    }
  }

#ifndef ALONE
  /* inetd(8), don't leave home without it */
#ifdef SECURE_PORT
  i = sizeof(isa);
  s = 0; /* stdin */
  if (getpeername(s,(struct sockaddr *)&isa,&i) >= 0){
    if ((ntohs(isa.sin_port) < IPPORT_RESERVED)
	&& (ntohs(isa.sin_port) > IPPORT_RESERVED/2))
      notsecure = 0;
  }
#endif
  domessage(0);
  exit(0);

#else
  /* disassociate ourselves from any terminal
   */

  for (i= 0; i < getdtablesize(); i++)
    close(i);
  if ((i= open("/dev/tty", O_RDWR)) >= 0) {
    if (ioctl(i, TIOCNOTTY, NULL) < 0)
      error("Can't disassociate from tty\n");
    close(i);
  }

  /* normal daemon.  set up for listening and then go into an infinite
   * loop for connections
   */

  error("msendd started");           /* remember when it all started */
  if ((s= establish(portnum())) < 0) { /* bind to a socket */
    if (errno == EADDRINUSE) {
      printf("msendd: cannot allocate port (daemon already active?)\n");
    }
    else
      perror("msendd: establish");
    die(1);
  }

  /* an ioctl should go here after openning /dev/tty but i can't remember
   * which ioctl
   */

  switch (fork()) {
  case -1: /* oh well */
    error("can't fork, sorry\n");
  case 0:
    break;
  default:
    exit(0);
  }

  /* after establishing ourselves, become DAEMONUID
   */

  if (getuid() == ROOTUID)
    seteuid(DAEMONUID);

  i = sizeof(isa);                   /* find it's "name" */
  getsockname(s,&isa,&i);
  signal(SIGHUP,SIG_IGN);
  signal(SIGSTOP,SIG_IGN);           /* bad things happened w/o this */
  signal(SIGTSTP,SIG_IGN);           /* seems to get this sometimes */
  signal(SIGINT,sigint);
  signal(SIGTERM,sigterm);
  signal(SIGCHLD,fireman);           /* set up to catch dead children */
  listen(s,BACKLOG);                 /* set maximum backlog */

  for(;;) {
    i = sizeof isa ;
    if((t = accept(s,&isa,&i)) < 0) {
      if(errno != EINTR)             /* we'll get an EINTR when child dies */
	error("accept error");
      continue;	                     /* try again */
    }

    if (fork() == 0) {
      close(s);                      /* i have no need for you */
      setpgrp(0, getpid());          /* parent doesn't want signals! */
#ifdef SECURE_PORT
      if (getpeername(t,(struct sockaddr *)&isa,&i) >= 0){
	if ((ntohs(isa.sin_port) < IPPORT_RESERVED)
	    && (ntohs(isa.sin_port) > IPPORT_RESERVED/2))
	  notsecure = 0;
      }
#endif
      domessage(t);                  /* process the message(s) */
      exit(0);                       /* domessage does this too */
    }

    /* fork errors disconnect immediately, tough luck on the user
     */

    else
      close(t);
  }
#endif
}


These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.