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 c

⟦a7be6f297⟧ TextFile

    Length: 4072 (0xfe8)
    Types: TextFile
    Names: »cubestat.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Cubes/cubestat.c« 

TextFile

/*	vi:set sw=4 ts=4: */
#ifndef	lint
static char	sccsid[] = "@(#)cubestat.c 5.1 (G.M. Paris) 89/01/22";
#endif	lint

/*
**
**	cubes 5.1  Copyright 1989 Gregory M. Paris
**		Permission granted to redistribute on a no charge basis.
**		All other rights are reserved.
**
*/

#include	<stdio.h>
#include	<sys/types.h>
#include	<sys/time.h>
#include	<sys/socket.h>
#include	<netinet/in.h>
#include	<netdb.h>
#include	<sysexits.h>
#include	"cubes.h"

#define	EX_CUBES_INPROGRESS	0	/* success */
#define	EX_CUBES_IDLE		1	/* fail, sort of */

extern int			optind;
extern int			opterr;
extern char		   *optarg;
extern char		   *getenv();
struct hostent	   *gethostbyname();
struct servent	   *getservbyname();

main(ac, av)
char   *av[];
{
	int						c;
	char				   *cubehost	= 0;		/* server hostname */
	register int			qsock;
	struct sockaddr_in		server;
	struct servent		   *ps;
	struct hostent		   *ph;
	struct timeval			timo;
	fd_set					rdy;
	char					query;
	char					status[STATLEN];
	boolean					waitforbeg	= False;
	boolean					waitforend	= False;

	opterr = 0;
	while((c = getopt(ac, av, "beh:")) >= 0) {
		switch(c) {
		case 'b':
			waitforbeg = (waitforbeg == True) ? False : True;
			break;
		case 'e':
			waitforend = (waitforend == True) ? False : True;
			break;
		case 'h':
			cubehost = optarg;
			break;
		default:
			fprintf(stderr, "usage -- cubestat [-{be}] [-h host]\n");
			exit(EX_USAGE);
		}
	}

	if(waitforbeg == True && waitforend == True) {
		fprintf(stderr, "cubestat: can't wait for both begin and end\n");
		exit(EX_USAGE);
	}

	if(waitforbeg == True || waitforend == True) {
		static char	fake[] = "lock -";
		int			n;

		for(c = 0;c < ac;++c)
			for(n = 0;av[c][n] != '\0';++n)
				av[c][n] = (c > 0 || n >= sizeof fake - 1) ? ' ' : fake[n];
	}

	/*
	**	If cubehost hasn't been set, check the CUBEHOST environment variable.
	**	If cubehost is null or not set, use this host.
	*/
	if(cubehost == 0)
		cubehost = getenv("CUBEHOST");
	if(cubehost == 0 || *cubehost == '\0') {
		static char		thishost[256];

		(void) gethostname(thishost, sizeof thishost);
		cubehost = thishost;
	}
	if((ph = gethostbyname(cubehost)) == 0) {
		fprintf(stderr, "cubestat: unknown host `%s'\n", cubehost);
		exit(EX_NOHOST);
	}

	/*
	**	Look up the cubestat service.
	*/
	if((ps = getservbyname("cubestat", "udp")) == 0) {
		fprintf(stderr, "cubestat: no cubestat/udp service listed\n");
		exit(EX_UNAVAILABLE);
	}

	/*
	**	Get a datagram socket then point it at the server.
	*/
	if((qsock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		perror("cubestat: socket");
		exit(EX_OSERR);
	}
	bzero((char *)&server, sizeof server);
	server.sin_family = AF_INET;
	server.sin_port = ps->s_port;
	bcopy(ph->h_addr, (char *)&server.sin_addr, ph->h_length);
	if(connect(qsock, &server, sizeof server) < 0) {
		perror("cubestat: connect");
		exit(EX_OSERR);
	}

	/*
	**	For now, we only know how to ask for a roster.
	**	Set up for a few tries.  We'll wait a reasonable time before retrying.
	*/
	query = Q_ROSTER;
	timo.tv_sec = 2 * READTIMO;
	timo.tv_usec = 0;
	for(c = 0;c < 3 || waitforbeg == True || waitforend == True;++c) {
		if(send(qsock, &query, sizeof query, 0) < 0) {
			perror("cubestat: send");
			exit(EX_IOERR);
		}

		FD_ZERO(&rdy);
		FD_SET(qsock, &rdy);
		if(select(qsock+1, &rdy, NOSEL, NOSEL, &timo) > 0) {
			if(recv(qsock, status, STATLEN, 0) > 0) {
				switch(status[0]) {
				case S_IDLE:
					if(waitforbeg == False) {
						fputs(&status[1], stdout);
						exit(EX_CUBES_IDLE);
					}
					if(c % 20 == 0)
						fputs(&status[1], stdout);
					sleep(3);
					break;
				case S_ROSTER:
					fputs(&status[1], stdout);
					if(waitforend == False)
						exit(EX_CUBES_INPROGRESS);
					sleep(1);
					break;
				case S_UNRECOG:
					fprintf(stderr,
						"cubestat: unrecognized query \\%o\n", query);
					exit(EX_PROTOCOL);
				default:
					fprintf(stderr,
						"cubestat: unrecognized response \\%o\n", status[0]);
					exit(EX_PROTOCOL);
				}
			}
		}
	}

	fprintf(stderr, "cubestat: no response from server on %s\n", cubehost);
	exit(EX_UNAVAILABLE);
}