On the client side:

	package data in call packet

	rpc = rpc_remoteCall(rpc);

	unpackage return information (including u.u_error and u.u_eosys)

	if (rpc->interrupted)
	{
		rpc_freePacket(rpc);
		longjmp(&u.u_qsave);
	}

	rpc_freePacket(rpc);
	return;

In each unpackager:

*	u.u_error = 0;
*	u.u_eosys = JUSTRETURN;
	if (setjmp(&u.u_qsave))
		interrupted = 1;
	else
	{
		do real work

		interrupted = 0;
	}

	fill in return packet information
	returnPacket->interrupted = interrupted;
*	returnPacket->eosys = u.u_eosys;
*	returnPacket->error = u.u_error;
*	clear all pending signal bits
	return(returnPacket);

(lines with asterisk can be factored out into rpc_service.c)

In psignal() on the client side:

	add signal to pending signal list

	if (process is sleeping on rpc call)
	{
		queue a signal to be sent by the daemon, ...
		return;
	}

rpc_sendsig() called by the daemon:

	send signal packet to server, retrying until the server crashes
	or until we receive an acknowledgement.
	(optionally, stop retrying when the return packet is received).

On the server side when a signal is received:

	send acknowledgement of signal.

	if (duplicate signal packet)
		drop signal packet.

	if (packet is no longer being worked on)
		drop signal packet.

	do a psignal() to the server.
