#include <signal.h>
#include <errno.h>
int Interrupt=0;
int Hot=0;
struct resource {
	char *name;
	struct resource *next;
} *Resources=0;
extern int ConnectToServer();
extern struct resource *NewResource(char *);
extern void FreeResources();
void handle() {
	Hot=0; /* Because FreeResources() isn't reentrant */
	FreeResources();
	sigset(SIGINT, SIG_DFL);
	kill(getpid(), SIGINT);
}
void remember(int signo) {
	if(Hot) {
		handle();
	}
	else {
		Interrupt=1;
	}
}
void poll() {
	while(Interrupt) {
		Interrupt=0;
		handle();
	}
}
ssize_t my_write(int fildes, char *buf, ssize_t nbyte) {
	ssize_t result;
	Hot=1;
	poll();
	result=write(fildes, buf, nbyte);
	/* What if SIGINT is received right here? */
	Hot=0;
	return result;
}
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(SIGINT, remember);
	server=ConnectToServer();
	AllocateResource(server,"bob");
	AllocateResource(server,"mary");
	FreeResources();
	return(0);
}

