ftp.nice.ch/pub/next/connectivity/infosystems/Archie.2.18.s.tar.gz#/Archie/ArchieDaemon.subproj/archied.c

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

/* A TCP based archie server */
#include "archied.h"

static int active_socket;
void quit()
{
	close(active_socket);
	exit(0);
}

void main(int argc, char *argv[])
{
int rtn_val;
int server_socket, request_socket, req_addr_len, request_pid;
struct sockaddr_in request_addr, server_addr;
void perform_query(int request_socket);

	signal(SIGINT, quit);

	/* Open a TCP socket */
	server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if( server_socket < 0 )
	{
		perror("Failed to open TCP socket for archied");
		exit(1);
	}
	active_socket = server_socket;

	/* Bind our port number to the socket */
	bzero(&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(SERV_PORT);
	rtn_val = bind(server_socket, (struct sockaddr *) &server_addr,
		sizeof(server_addr));
	if( rtn_val < 0 )
	{
		perror("Failed to bind port number for adrchied");
		exit(2);
	}

	/* Indicate we are ready to service requests on this port */
	listen(server_socket, 5);

	/* The server loop */
	while( 1 )
	{
		/* Accept a connection request */
		req_addr_len = sizeof(request_addr);
		request_socket = accept(server_socket, (struct sockaddr *) &request_addr,
			&req_addr_len);
D(fprintf(stderr, "Accepted connection...\n"));
		if( request_socket < 0 )
		{
			perror("archied: accept() error");
			exit(3);
		}

		/* Fork a process to service the request */
		request_pid = fork();
		if( request_pid < 0 )
		{
			perror("archied: failed to fork() request process");
			exit(4);
		}

		/* Child process performs the request */
		if( request_pid == 0 )
		{
			close(server_socket);
			perform_query(request_socket);
			exit(0);
		}

		/* Server closes the request socket */
		close(request_socket);
	} /* End server loop */

}

void perform_query(int request_socket)
{
VLINK vlink;
QueryRequest query;

D(fprintf(stderr, "\tPeforming query...\n"));
	/* Read the query request from the socket */
	read_request(&query, request_socket);

	/* Do the query */
	vlink = archie_query(query.host, query.qstring, query.max_hits, 0,
		query.query, AQ_INVDATECMP, query.flags);
D(fprintf(stderr, "\tCompleted query..."));

	/* Write the query response to the socket */
	archive_vlink(vlink, request_socket);
D(fprintf(stderr, "Done with request\n"));
} /* End perform_query() */

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