4.1cBSD/usr/src/new/courier/lib/SCCS/s.server.c

h50375
s 00001/00001/00151
d D 1.3 83/02/27 22:49:53 cooper 3 2
c added debugging info in ReceiveCallMessage
e
s 00004/00003/00148
d D 1.2 83/02/27 21:36:58 cooper 2 1
c fixed bug in readmsg
e
s 00151/00000/00000
d D 1.1 83/02/23 13:58:07 cooper 1 0
c date and time created 83/02/23 13:58:07 by cooper
e
u
U
t
T
I 1
/*
 * %M% %I% %G%
 */
#include <courier.h>
#include <time.h>

#if DEBUG
int CourierDebuggingFlag = 0;
#endif

/*
 * Message stream handle.
 */
static int msgs = -1;

/*
 * Information about user-specified I/O dispatch function.
 */
static void (*selectfunc)() = 0;
static int readmask, writemask, exceptmask, blockflag;
static struct timeval timeout;

Unspecified *
ReceiveCallMessage(procp)
	Cardinal *procp;
{
	Cardinal proc, n, nwords;
	Unspecified *bp;

	if (readmsg(&proc, 1) == 0)
		exit(0);				/* clean EOF */
	if (readmsg(&nwords, 1) == 0)
		goto eof;
	UnpackCardinal(procp, &proc);
	UnpackCardinal(&n, &nwords);
#if DEBUG
	if (CourierDebuggingFlag)
D 3
		fprintf(stderr, "[ReceiveCallMessage %d]\n", n);
E 3
I 3
		fprintf(stderr, "[ReceiveCallMessage %d %d]\n", *procp, n);
E 3
#endif
	bp = Allocate(n);
	if (readmsg(bp, n) == 0)
		goto eof;
	return (bp);
eof:
	exit(1);
}

SendReturnMessage(n, results)
	Cardinal n;
	Unspecified *results;
{
	Cardinal nwords;

#if DEBUG
	if (CourierDebuggingFlag)
		fprintf(stderr, "[SendReturnMessage %d]\n", n);
#endif
	PackCardinal(&n, &nwords, 1);
	writemsg(&nwords, 1);
	writemsg(results, n);
}

NoSuchProcedureValue(prog_name, proc)
	String prog_name;
	Cardinal proc;
{
	fprintf(stderr, "Courier program %s: no such procedure value %d\n",
		prog_name, proc);
}

D 2
static readmsg(addr, nwords)
E 2
I 2
static
readmsg(addr, nwords)
E 2
	char *addr;
	int nwords;
{
	register int nbytes, n;
	register char *p;
	int rbits, wbits, ebits;

D 2
	nbytes = 2 * nwords;
E 2
	for (p = addr, nbytes = 2*nwords; nbytes > 0; nbytes -= n, p += n) {
		while (selectfunc != 0) {
			rbits = (1 << msgs) | readmask;
			wbits = writemask;
			ebits = exceptmask;
			if (blockflag)
				select(32, &rbits, &wbits, &ebits, 0);
			else
				select(32, &rbits, &wbits, &ebits, &timeout);
			if (rbits & (1 << msgs))
				break;
			rbits &= ~(1 << msgs);
			(*selectfunc)(rbits, wbits, ebits);
		}
		n = read(msgs, p, nbytes);
		if (n <= 0)
			return (0);
	}
	return (1);
}

D 2
static writemsg(addr, nwords)
E 2
I 2
static
writemsg(addr, nwords)
E 2
	char *addr;
	int nwords;
{
	register int n;
	int rbits, wbits, ebits;

	for (;;) {
		rbits = readmask;
		wbits = (1 << msgs) | writemask;
		ebits = exceptmask;
		if (blockflag)
			select(32, &rbits, &wbits, &ebits, 0);
		else
			select(32, &rbits, &wbits, &ebits, &timeout);
		if (wbits & (1 << msgs))
			break;
		wbits &= ~(1 << msgs);
		(*selectfunc)(rbits, wbits, ebits);
	}
	write(msgs, addr, 2*nwords);
	return (1);
}

CourierSelect(func, in, out, except, timelimit)
	void (*func)();
	int in, out, except;
	struct timeval *timelimit;
{
	if ((selectfunc = func) != 0) {
		readmask = in;
		writemask = out;
		exceptmask = except;
		if (!(blockflag = (timelimit == 0)))
			timeout = *timelimit;
	}
}

ServerInit()
{
	write(1, "\0", 1);
	msgs = 20;
	while (dup2(0, msgs) < 0)
		--msgs;
	close(0); close(1);
}

main()
{
	Server();
}
E 1