OpenVMS Source-Code Demos

SELECT_DEMO.C

//================================================================================
// title    : select_demo.c
// author 1 : Compaq Computer Corporation
// source   : http://h71000.www7.hp.com/portability/portingguidelines.html
// notes    : on OpenVMS and VMS, you may not use select() to monitor i/o channels
//            to non-network destinations like stdin, stdout, and stderr.
// author 2 : Neil Rieck
// when     : 2012-03-28
//          : renamed some variables; added extra comments; inserted a few lines
//          : Note: this code demos "bad select 38" as seen in "OpenSSL s_client"
//================================================================================
//
//	import the usual stuff
//
#include <socket.h>						//
#include <stdio.h>						//
#include <stdlib.h>						//
#include <time.h>						//
#include <types.h>						//
#include <unistd.h>						// unix std i/o
#include <errno.h>						// need this for errno (see below)

int  main(void)							//
{
	fd_set		readfds;				// "read" - file descriptor strings
	struct timeval	tv;					//
	int		width;					//
	int		retval;					//
	int		i;					//

	printf("program: select_demo.c\n");			//
	//
	//	"only" watch stdin (fd 0) to see when input is available
	//
	FD_ZERO(&readfds);					// zap all bits in this variable
	FD_SET(0, &readfds);					// set bit associated with stdin
//	FD_SET(1, &readfds);					// set bit associated with stdout
//	FD_SET(2, &readfds);					// set bit associated with stderr
//	FD_SET(3, &readfds);					// set bit associated with network channel x
//	FD_SET(4, &readfds);					// set bit associated with network channel y
	FD_SET(5, &readfds);					// set bit associated with network channel z
	FD_CLR(5, &readfds);					// clear bit associated with network channel z
	//
	//	let's see what is set
	//
	for (i=0;i<31;i++) {
	    if (FD_ISSET(i, &readfds)) {			//
		printf("-i-bit: %d is set\n",i);		//
		width = i + 1;					// width = highest bit plus one
	    }							//
	}							//
	//
	//	We will wait for a maximum of five seconds.
	//
	tv.tv_sec = 5;						// 5 second
	tv.tv_usec = 0;						// 0 microseconds
	//
	width = 1;						// highest bit value plus "one"
	retval = select(width, &readfds, NULL, NULL, &tv);	// the tv parameter is optional
	//
	//	Don't rely on the value of tv now!
	//
	if (retval == -1) {
		printf("-e-just detected error %d\n",errno);	// will throw error 38
	        perror("select()");
		return(2);					// VMS-e
	}
	else if (retval) {
		printf("Data is available now.\n");
		/* FD_ISSET(0, &readfds) will be true. */
	} else {
	        printf("No data within five seconds.\n");
	}
	return(1);						// VMS-s
}