1: #ifndef lint 2: static char sccsid[] = "@(#)server.c 4.2 (Berkeley) 7/7/83"; 3: #endif 4: 5: #include <stdio.h> 6: #include <sys/time.h> 7: #include "courier.h" 8: 9: #if DEBUG 10: int CourierServerDebuggingFlag = 0; 11: #endif 12: 13: /* 14: * Message stream handle. 15: */ 16: static int Connection = -1; 17: 18: /* 19: * Information about user-specified I/O dispatch function. 20: */ 21: static void (*selectfunc)() = 0; 22: static int readmask, writemask, exceptmask, blockflag; 23: static struct timeval timeout; 24: 25: Unspecified * 26: ReceiveCallMessage(procp) 27: Cardinal *procp; 28: { 29: Cardinal proc, n, nwords; 30: Unspecified *bp; 31: 32: if (ServerRead(&proc, 1) == 0) 33: exit(0); /* clean EOF */ 34: if (ServerRead(&nwords, 1) == 0) 35: goto eof; 36: UnpackCardinal(procp, &proc); 37: UnpackCardinal(&n, &nwords); 38: #if DEBUG 39: if (CourierServerDebuggingFlag) 40: fprintf(stderr, "[ReceiveCallMessage %d %d]\n", *procp, n); 41: #endif 42: bp = Allocate(n); 43: if (ServerRead(bp, n) == 0) 44: goto eof; 45: return (bp); 46: eof: 47: exit(1); 48: } 49: 50: SendReturnMessage(n, results) 51: Cardinal n; 52: Unspecified *results; 53: { 54: Cardinal nwords; 55: 56: #if DEBUG 57: if (CourierServerDebuggingFlag) 58: fprintf(stderr, "[SendReturnMessage %d]\n", n); 59: #endif 60: PackCardinal(&n, &nwords, 1); 61: ServerWrite(&nwords, 1); 62: ServerWrite(results, n); 63: } 64: 65: NoSuchProcedureValue(prog_name, proc) 66: String prog_name; 67: Cardinal proc; 68: { 69: fprintf(stderr, "Courier program %s: no such procedure value %d\n", 70: prog_name, proc); 71: } 72: 73: static 74: ServerRead(addr, nwords) 75: char *addr; 76: int nwords; 77: { 78: register int nbytes, n; 79: register char *p; 80: int rbits, wbits, ebits; 81: 82: for (p = addr, nbytes = 2*nwords; nbytes > 0; nbytes -= n, p += n) { 83: while (selectfunc != 0) { 84: rbits = (1 << Connection) | readmask; 85: wbits = writemask; 86: ebits = exceptmask; 87: if (blockflag) 88: select(32, &rbits, &wbits, &ebits, 0); 89: else 90: select(32, &rbits, &wbits, &ebits, &timeout); 91: if (rbits & (1 << Connection)) 92: break; 93: rbits &= ~(1 << Connection); 94: (*selectfunc)(rbits, wbits, ebits); 95: } 96: n = read(Connection, p, nbytes); 97: if (n <= 0) 98: return (0); 99: } 100: return (1); 101: } 102: 103: static 104: ServerWrite(addr, nwords) 105: char *addr; 106: int nwords; 107: { 108: int rbits, wbits, ebits; 109: 110: for (;;) { 111: rbits = readmask; 112: wbits = (1 << Connection) | writemask; 113: ebits = exceptmask; 114: if (blockflag) 115: select(32, &rbits, &wbits, &ebits, 0); 116: else 117: select(32, &rbits, &wbits, &ebits, &timeout); 118: if (wbits & (1 << Connection)) 119: break; 120: wbits &= ~(1 << Connection); 121: (*selectfunc)(rbits, wbits, ebits); 122: } 123: write(Connection, addr, 2*nwords); 124: return (1); 125: } 126: 127: CourierSelect(func, in, out, except, timelimit) 128: void (*func)(); 129: int in, out, except; 130: struct timeval *timelimit; 131: { 132: if ((selectfunc = func) != 0) { 133: readmask = in; 134: writemask = out; 135: exceptmask = except; 136: if (!(blockflag = (timelimit == 0))) 137: timeout = *timelimit; 138: } 139: } 140: 141: ServerInit() 142: { 143: write(1, "\0", 1); 144: Connection = 20; 145: while (dup2(0, Connection) < 0) 146: Connection--; 147: close(0); close(1); 148: } 149: 150: main() 151: { 152: Server(); 153: }