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

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

/* domessage.c:
 *
 * this handles each incoming message
 *
 * (c) Copyright 1988, 1989, 1990 Jim Frost.  All Rights Reserved.  Please see
 * the accompanying file "Copyright" for more information.
 */

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

extern char *sys_errlist[];
extern int  errno;
extern short doroute, dobroadcast;

/* in case we somehow get caught in an inconsistent state, we
 * kill ourselves after an arbitrary time.
 */

static void suicide()
{ error("child killed after lifetime expired");
  die(1);
}

/* handle the incoming message
 */

void domessage(s)
int s;
{ struct simsg   si;
  struct rimsg   ri;
  extern int     errno;
  char   localhost[MAXHOSTNAME+1];
  char   tmphost[MAXHOSTNAME+1];
  struct hostent *hp;

  for (;;) {

    /* anything we say can and will be used against us in the court of
     * law, so it's a good idea to keep our mouth shut except with the
     * right people.  In other words, nobody but root and the owner
     * should be able to see message files.
     */

    umask(006);

    /* this is our guarantee that we won't have processes sitting in
     * funny states for very long.  unfortunately it can also cause
     * valid connections to die if the user ignores them for long
     * enough, but we reset the timer every time there's a packet.
     */

    alarm(LIFETIME);
    signal(SIGALRM,suicide);

    gethostname(tmphost,MAXHOSTNAME);
    if ((hp = gethostbyname(tmphost)) == NULL);
    (void) strncpy(localhost,hp->h_name,MAXHOSTNAME);
    

    /* hello?  what do you want? */

    recvmessage(s,&si);

    /* look to see if we are supposed to route this to somewhere.  if so,
     * then do it.
     */

    if (striphost(si.taddr,si.tohost) != NULL) {
#ifdef ROUTE
      if(doroute)
	sendmessage(&si,&ri,si.mode); /* route the message and get reply */

      /* routing is disabled so return an error message
       */
      else {
#endif
	ri.h.errno= RE_NOROUTE;
	sprintf(ri.msg,"%s: Message routing is disabled at this host",localhost);
#ifdef ROUTE
      }
#endif
    }
    else if (si.mode & SM_VERSION) {
      ri.h.errno= RE_OK;
      sprintf(ri.msg,"%s: msendd version %s patchlevel %s  %s",
	      localhost,VERSION,PATCHLEVEL,Copyright);
    }
    else if (si.msg[0] == '\0') { /* null messages are ignored */
      ri.h.errno= RE_OK;
      ri.msg[0]= '\0';
    }

    else if (si.mode & SM_BROADCAST) {

#ifdef DBROADCAST
      /* broadcast to everyone in utmp
       */

      if (dobroadcast) {
	broadcast(&si);
	ri.h.errno= RE_OK;
	ri.msg[0]= '\0';
      } else {
#endif
	ri.h.errno= RE_NOBROAD;
	sprintf(ri.msg,"%s: Broadcasting is disabled at this host",localhost);
#ifdef DBROADCAST
      }
#endif

    }
    else {

      /* write to a single user or tty
       */

      switch (writeuser(&si)) {
      case RE_OK :
	ri.h.errno= RE_OK;
	ri.msg[0]= '\0';
	break;
      case RE_NOMSGS :
	ri.h.errno= RE_NOMSGS;
	sprintf(ri.msg,"%s@%s: User's messages are off, try mail instead",
		si.taddr,localhost);
	break;
      case RE_NOTTHERE :
	ri.h.errno= RE_NOTTHERE;
	sprintf(ri.msg,"%s@%s: User not found",si.taddr,localhost);
	break;
      case RE_NOUSER :
	ri.h.errno= RE_NOUSER;
	sprintf(ri.msg,"%s@%s: No such user",si.taddr,localhost);
	break;
      case RE_SYSERR :
	ri.h.errno= RE_SYSERR;
	strcpy(ri.msg,sys_errlist[errno]);
	break;
	default :
	  error("internal error (this cannot happen!)");
	blderr(&ri,RE_INTERR,"Internal error in receiving daemon\n");
      }
    }
    sendreply(s,&ri,si.mode);
    if ((si.mode & SM_CLOSE) || (ri.h.errno != RE_OK))
      exit(0);
  }
}

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