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.