DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T m

⟦922d7e99b⟧ TextFile

    Length: 3073 (0xc01)
    Types: TextFile
    Names: »main.c«

Derivation

└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
    └─⟦cfd40dc56⟧ »EurOpenD3/news/nntp/nntp.1.5.8.tar.Z« 
        └─⟦2ec98eca6⟧ 
            └─⟦this⟧ »server/main.c« 
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
    └─⟦5cced586a⟧ »EurOpenD3/news/nntp/nntp.1.5.7.tar.Z« 
        └─⟦7340f105e⟧ 
            └─⟦this⟧ »./server/main.c« 

TextFile

#ifndef lint
static char	*sccsid = "@(#)main.c	1.12	(Berkeley) 8/27/89";
#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>

main()
{

#ifdef ALONE	/* If no inetd */

	int			sockt, client, length;
	struct sockaddr_in	from;
	extern int 		reaper();

	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
	openlog("nntpd", LOG_PID, SYSLOG);		/* fd 3 */
#endif
#endif


#ifdef FASTFORK
	num_groups = read_groups();	/* Read active file now (fd 4) */
					/* and then do it every */
	set_timer();			/* so often later */
#endif

#ifndef EXCELAN
	sockt = get_socket();		/* should be fd 4 or 5 */
#ifdef USG
	(void) signal(SIGCLD, SIG_IGN);
#else
	(void) signal(SIGCHLD, reaper);
#endif

	if (listen(sockt, SOMAXCONN) < 0) {
#ifdef SYSLOG
		syslog(LOG_ERR, "main: listen: %m");
#endif
		exit(1);
	}
#endif
	for (;;) {
#ifdef LOAD
		register int 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
		bzero((char *)&from,sizeof(from));
#endif
		client = accept(sockt, &from);
#else
		length = sizeof (from);
		client = accept(sockt, &from, &length);
#endif EXCELAN
		if (client < 0) {
#ifdef SYSLOG
#ifdef EXCELAN
			if (errno != EINTR && errno != 60 )
#else
			if (errno != EINTR)
#endif
				syslog(LOG_ERR, "accept: %m\n");
#endif
#ifdef EXCELAN
			close(sockt);
			sleep(1);
#endif
			continue;
		}

#ifdef LOAD
		if (( load = getla()) > LOAD ) {
			sprintf( oline, "%d loadav at %d, try later\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;
		}
#endif LOAD

		switch (fork()) {
		case	-1:
#ifdef SYSLOG
				syslog(LOG_ERR, "fork: %m\n");
#endif
#ifdef EXCELAN
				(void) close(sockt);
#endif
				(void) close(client);
				break;

		case	0:
#ifdef EXCELAN
				if (fork())
					exit(0);
#ifdef USG
				(void * )memcpy(&current_peer,&from,
					 sizeof(from));
#else
				bcopy(&from,&current_peer,sizeof(from));
#endif
				make_stdio(sockt);
#else
				(void) close(sockt);
				make_stdio(client);
#endif
#ifdef USG
				(void) signal(SIGCLD,SIG_DFL);
#endif
				serve();
				break;

		default:
#ifdef EXCELAN
				(void) close(sockt);
#else
				(void) close(client);
#endif
				break;
		}
	}

#else		/* We have inetd */

	serve();

#endif
}