DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

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

See our Wiki for more about Rational R1000/400 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T d

⟦18b9fa445⟧ TextFile

    Length: 2578 (0xa12)
    Types: TextFile
    Names: »dtia_server.c«

Derivation

└─⟦8ee07855d⟧ Bits:30000545 8mm tape, Rational 1000, DTIA 2_1_6
    └─ ⟦0c25cb74a⟧ »DATA« 
        └─⟦038380b96⟧ 
└─⟦d0624311f⟧ Bits:30000529 8mm tape, Rational 1000, DTIA 2_1_7
    └─ ⟦f494b5154⟧ »DATA« 
        └─⟦038380b96⟧ 
            └─ ⟦this⟧ »dtia_server.c« 
└─⟦8ee07855d⟧ Bits:30000545 8mm tape, Rational 1000, DTIA 2_1_6
    └─ ⟦0c25cb74a⟧ »DATA« 
        └─⟦0732ea0cf⟧ 
└─⟦d0624311f⟧ Bits:30000529 8mm tape, Rational 1000, DTIA 2_1_7
    └─ ⟦f494b5154⟧ »DATA« 
        └─⟦0732ea0cf⟧ 
            └─ ⟦this⟧ »../../dtia/release_apollo_2.1/dtia_server.c« 
└─⟦8ee07855d⟧ Bits:30000545 8mm tape, Rational 1000, DTIA 2_1_6
    └─ ⟦0c25cb74a⟧ »DATA« 
        └─⟦25fab149a⟧ 
└─⟦d0624311f⟧ Bits:30000529 8mm tape, Rational 1000, DTIA 2_1_7
    └─ ⟦f494b5154⟧ »DATA« 
        └─⟦25fab149a⟧ 
            └─ ⟦this⟧ »../../dtia/release_sun_2.1/dtia_server.c« 
└─⟦8ee07855d⟧ Bits:30000545 8mm tape, Rational 1000, DTIA 2_1_6
    └─ ⟦0c25cb74a⟧ »DATA« 
        └─⟦be254d495⟧ 
└─⟦d0624311f⟧ Bits:30000529 8mm tape, Rational 1000, DTIA 2_1_7
    └─ ⟦f494b5154⟧ »DATA« 
        └─⟦be254d495⟧ 
            └─ ⟦this⟧ »../../dtia/release_aix_2.1/dtia_server.c« 
└─⟦8ee07855d⟧ Bits:30000545 8mm tape, Rational 1000, DTIA 2_1_6
    └─ ⟦0c25cb74a⟧ »DATA« 
        └─⟦c67979795⟧ 
└─⟦d0624311f⟧ Bits:30000529 8mm tape, Rational 1000, DTIA 2_1_7
    └─ ⟦f494b5154⟧ »DATA« 
        └─⟦c67979795⟧ 
            └─ ⟦this⟧ »../../dtia/release_hp_2.1/dtia_server.c« 

TextFile

#ifndef	lint
#ifndef	DEBUG
static char SCCS_id[] = "@(#)dtia_server.c 2.1 90/08/02 19:05:23  Copyright(c) 1990 by Rational.";
#else
static char SCCS_id[] = "@(#)dtia_server.c DEBUG 2.1 90/08/02 19:05:23  Copyright(c) 1990 by Rational.";
#endif
#endif

#include	"dtia_server.h"

void usage(cmd)
char	*cmd; 
{
	fprintf(stderr,"Usage: %s {no arguments}\n",cmd);
}

void stop() {
	look_at_sons();
	if (nb_sons()!=0) {
		return;
	}

	exit (0);
}

void main(argc,argv)
int argc;
char *argv[]; 
{

	int	fd;
	int	pid;
	struct timeval timeout;
	int	port;
	signal(SIGINT,SIG_IGN);
	/* Check Usage */
	if (argc> 1) {
		usage(argv[0]);
		exit(1);
	}

	if (setuid(0)== -1) {
		perror("setreuid");
		exit(2);
	}

	if ((port=get_port())== -1) {
		fprintf(stderr,"A Dtia server is already registered\n");
		exit(3);
	} else {
		if (!ok_port(port)) {
			fprintf(stderr,"Bad port number\n");
			exit(4);
		}
	}

	/* The socket + bind + listen */
	if (init_connections() == -1) {
		perror("connection");
		exit(5);
	}

	init_sons();

	switch	(fork()) {
	case	-1:
		perror("fork");
		exit(7);
	case	0:
		/* let's carry on quietly on background	*/
		close(0);
		close(1);
		close(2);
		/* The son carries on in bk */
		break;
	default:
		/* The father returns	*/
		printf("Dtia server started\n");
		fflush(stdout);
		exit(0);
	}

	signal(SIGINT,stop);

	/* main loop:		 				*/
	/* - wait for a connection during timeout max and look 	*/
	/*	for stopped sons (if any son running)		*/
	/* - wait indefinitevely for a connection if no son	*/
	timeout.tv_sec = timeout.tv_usec = 10;

	while (1) {
		int	error;
		char	*host_name,*user_name;
		do {
			look_at_sons();
		} while (wait_for_connection(&timeout)==0);

		/* Accept one connection */
		if ((fd = get_connection ())== -1)  {
			/* should never happen; if so ???	*/
			exit(8);
		}

		error=check_identity(fd,fd,&host_name,&user_name);
		if ((error!=E_OK) && (error!=E_BAD_USER)) {
			/* some connection error or something	*/
			close(fd);
			continue;
		}

		if (error==E_OK) {
			/* regular case: let's fork a son for 	*/
			/* handling the connection		*/
			signal(SIGINT,SIG_IGN);
			/* the son does not have to execute the	*/
			/* stop procedure (for the father only)	*/
			switch ((pid=fork())) {
			case -1:
				break;
			case 0:
				/* The son handles the connection */
				_exit(talk_connection (fd,fd)) ;
			default:
				add_son(pid,fd);
				/* The father must take SIGINT	*/
				/* correctly into account now	*/
				/* that the son is running	*/
				signal(SIGINT,stop);
			}
		} else {
			/* Bad user_name or password			*/
		}
	}
}