This is main.c in view mode; [Download] [Up]
#ifndef lint static char *sccsid = "@(#)$Header: main.c,v 1.18 91/01/12 10:54:01 sob Exp $"; #endif /* * Network News Transfer Protocol server * * Phil Lapsley * University of California, Berkeley * (Internet: phil@berkeley.edu; UUCP: ...!ucbvax!phil) * Stan Barber * Baylor College of Medicine * (Internet: sob@tmc.edu; UUCP: ...!bcm!sob) */ #include "common.h" #include <sys/socket.h> #include <netinet/in.h> #ifndef EXCELAN #include <netdb.h> #else struct sockaddr_in current_peer = { AF_INET, IPPORT_NNTP }; #endif #include <signal.h> /* XXX Should be #ifdef VARARGS */ #if defined(sun) || defined(hpux) #include <varargs.h> #endif #ifdef SETPROCTITLE char **Argv = NULL; /* pointer to argument vector */ char *LastArgv = NULL; /* end of argv */ #endif /* SETPROCTITLE */ main(argc,argv,envp) char **argv, **envp; { #ifdef ALONE /* If no inetd */ int sockt, client, length; struct sockaddr_in from; extern int reaper(); #ifdef LOAD register int load; #endif /* LOAD */ disassoc(); /* fd 0-2 should be open and point to / now. */ /* Let's close all the other FD's just to be sure */ for(sockt = 3; sockt < 40; sockt++) (void) close(sockt); #ifdef SYSLOG #ifdef BSD_42 openlog("nntpd", LOG_PID); /* fd 3 */ #else /* !BSD_42 */ openlog("nntpd", LOG_PID, SYSLOG); /* fd 3 */ #endif /* BSD_42 */ #endif /* SYSLOG */ #ifdef FASTFORK num_groups = read_groups(); /* Read active file now (fd 4) */ /* and then do it every */ set_timer(); /* so often later */ #endif /* FASTFORK */ #ifndef EXCELAN sockt = get_socket(); /* should be fd 4 or 5 */ #ifdef USG (void) signal(SIGCLD, SIG_IGN); #else /* !USG */ (void) signal(SIGCHLD, reaper); #endif /* USG */ #ifdef DEBUG (void) signal(SIGUSR1, debugup); (void) signal(SIGUSR2, debugdown); #endif if (listen(sockt, SOMAXCONN) < 0) { #ifdef SYSLOG syslog(LOG_ERR, "main: listen: %m"); #endif /* SYSLOG */ exit(1); } #endif /* EXCELAN */ #ifdef SETPROCTITLE /* * Save start and extent of argv for setproctitle. */ Argv = argv; #ifdef SDD LastArgv = argv[argc - 1] + strlen(argv[argc - 1]); #else /*SDD*/ while (*envp) envp++; LastArgv = envp[-1] + strlen(envp[-1]); #endif /*SDD*/ #endif /* SETPROCTITLE */ #if defined(LOAD) && defined(SETPROCTITLE) /* If LOAD and SETPROCTITLE, display load before first accept() */ load = getla(); setproctitle("%sing connections: loadav %d", load > LOAD ? "reject" : "accept", load); #endif /* LOAD && SETPROCTITLE */ for (;;) { #ifdef LOAD char oline[NNTP_STRLEN]; #endif /* LOAD */ #ifdef EXCELAN int status; sockt = 3; sockt = get_socket(); if (sockt < 0) continue; #ifdef USG (void) signal(SIGCLD, SIG_IGN); memset((char *)&from,'\0',sizeof(from)); #else /* !USG */ bzero((char *)&from,sizeof(from)); #endif /* USG */ client = accept(sockt, &from); #else /* !EXCELAN */ length = sizeof (from); client = accept(sockt, &from, &length); #endif /* EXCELAN */ if (client < 0) { #ifdef SYSLOG #ifdef EXCELAN if (errno != EINTR && errno != 60 ) #else /* !EXCELAN */ if (errno != EINTR) #endif /* EXCELAN */ syslog(LOG_ERR, "accept: %m\n"); #endif /* SYSLOG */ #ifdef EXCELAN close(sockt); sleep(1); #endif /* EXCELAN */ continue; } #ifdef LOAD if (( load = getla()) > LOAD ) { #ifdef SETPROCTITLE setproctitle("rejecting connections: loadav %d", load); #endif /* SETPROCTITLE */ sprintf( oline, "%d loadav at %d, try later\r\n", ERR_GOODBYE, load ); write( client, oline, strlen( oline )); #ifdef SYSLOG syslog( LOG_INFO, "loadav at %d, sleeping", load ); #endif /* SYSLOG */ close( client ); sleep( 5 ); continue; } else { #ifdef SETPROCTITLE setproctitle("accepting connections: loadav %d", load); #endif /* SETPROCTITLE */ } #endif /* LOAD */ switch (fork()) { case -1: #ifdef SYSLOG syslog(LOG_ERR, "fork: %m\n"); #endif /* SYSLOG */ #ifdef EXCELAN (void) close(sockt); #endif /* EXCELAN */ (void) close(client); break; case 0: #ifdef EXCELAN if (fork()) exit(0); #ifdef USG (void * )memcpy(¤t_peer,&from, sizeof(from)); #else /* !USG */ bcopy(&from,¤t_peer,sizeof(from)); #endif /* USG */ make_stdio(sockt); #else /* !EXCELAN */ (void) close(sockt); make_stdio(client); #endif /* EXCELAN */ #ifdef USG (void) signal(SIGCLD,SIG_DFL); #endif /* USG */ serve(); break; default: #ifdef EXCELAN (void) close(sockt); #else /* !EXCELAN */ (void) close(client); #endif /* EXCELAN */ break; } } #else /* !ALONE */ /* We have inetd */ #ifdef LOAD { register int load; if (( load = getla()) > LOAD ) { printf("%d loadav at %d, try later\r\n", ERR_GOODBYE, load ); #ifdef SYSLOG #ifdef BSD_42 openlog("nntpd", LOG_PID); #else /* !BSD_42 */ openlog("nntpd", LOG_PID, SYSLOG); #endif /* BSD_42 */ syslog( LOG_INFO, "loadav at %d, exiting", load ); #endif /* SYSLOG */ (void) fflush(stdout); exit(1); } } #endif /* LOAD */ #ifdef SETPROCTITLE /* * Save start and extent of argv for setproctitle. */ Argv = argv; #ifdef SDD LastArgv = argv[argc - 1] + strlen(argv[argc - 1]); #else /*SDD*/ while (*envp) envp++; LastArgv = envp[-1] + strlen(envp[-1]); #endif /*SDD*/ #endif /* SETPROCTITLE */ #ifdef USG (void) signal(SIGCLD,SIG_DFL); #endif /* USG */ serve(); #endif /* ALONE */ } /* * clobber argv so ps will show what we're doing. * stolen from sendmail */ #ifdef SETPROCTITLE #if defined(sun) || defined(hpux) /*VARARGS*/ void setproctitle(va_alist) va_dcl { register char *p, *fmt; register int i; char buf[BUFSIZ]; va_list ap; va_start(ap); fmt = va_arg(ap, char *); (void) vsprintf(buf, fmt, ap); /* make ps print "(nntpd)" */ p = Argv[0]; *p++ = '-'; i = strlen(buf); if (i > LastArgv - p - 2) { i = LastArgv - p - 2; buf[i] = '\0'; } strcpy(p, buf); p += i; while (p < LastArgv) *p++ = ' '; va_end(ap); } #else /*VARARGS1*/ void setproctitle(fmt, a, b, c) char *fmt; { register char *p; register int i; char buf[BUFSIZ]; (void) sprintf(buf, fmt, a, b, c); /* make ps print "(nntpd)" */ p = Argv[0]; *p++ = '-'; i = strlen(buf); if (i > LastArgv - p - 2) { i = LastArgv - p - 2; buf[i] = '\0'; } (void) strcpy(p, buf); p += i; while (p < LastArgv) *p++ = ' '; } #endif /* hpux */ #endif /* SETPROCTITLE */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.