#include <signal.h>
#include <errno.h>
int Interrupt=0;
int Wake=0;
struct resource {
	char *name;
	struct resource *next;
} *Resources=0;
extern int ConnectToServer();
extern struct resource *NewResource(char *);
extern void FreeResources();
void remember(int signo) {
	alarm(1);
	Interrupt=1;
}
void wake() {
	alarm(1);
	Wake=1;
}
void handle() {
	FreeResources();
	sigset(SIGINT, SIG_DFL);
	kill(getpid(), SIGINT);
}
void poll() {
	while(Wake || Interrupt) {
		Wake=0;
		alarm(0);
		if(Interrupt) {
			/* Wake needed in case SIGINT right here */
			Interrupt=0;
			handle();
		}
	}
}
ssize_t my_write(int fildes, char *buf, ssize_t nbyte) {
	poll();
	/* What if SIGINT is received right here? */
	return write(fildes, buf, nbyte);
}
void AllocateResource(int server, char *name) {
	int done=0;
	do {
		char buf[1000];
		sprintf(buf, "Create %s for me, please\n", name);
		if(my_write(server, name, strlen(name))==-1) {
			if(errno!=EINTR) {
				FreeResources();
				sigset(SIGINT, SIG_DFL);
				poll();
				exit(2);
			}
		}
		else {
			Resources=NewResource(name);
			done=1;
		}
	} while(!done);
}
int main() {
	int server;
	sigset(SIGALRM, wake);
	/* From original main(): */
	sigset(SIGINT, remember);
	server=ConnectToServer();
	AllocateResource(server,"bob");
	AllocateResource(server,"mary");
	FreeResources();
	return(0);
}

