|
|
1.1 root 1: /*
2: * This file implements server functions for the XNS courier library
3: */
4:
5: /*
6: $Log: server.c,v $
7: * Revision 2.0 85/11/21 07:22:19 jqj
8: * 4.3BSD standard release
9: *
10: * Revision 1.3 85/03/11 16:37:39 jqj
11: * *** empty log message ***
12: *
13: * Revision 1.3 85/03/11 16:37:39 jqj
14: * Public alpha-test version, released 11 March 1985
15: *
16: * Revision 1.2 85/01/27 07:37:43 jqj
17: * finished but undebugged version
18: *
19: * Revision 1.1 85/1/4 2:40:00 jqj
20: * Initial revision -- Mogul's tcp-based version
21: */
22: #ifndef lint
23: static char rcsid[] = "$Header: server.c,v 2.0 85/11/21 07:22:19 jqj Exp $";
24: #endif
25:
26: #include <stdio.h>
27: #include <sys/time.h>
28: #include <sys/types.h> /* for ns.h */
29: #include <sys/socket.h>
30: #include <netns/ns.h> /* for XNS addresses and courierconnectin.h */
31: #include <netns/sp.h> /* for spphdr */
32: #include "courier.h"
33: #include "realcourierconnection.h"
34: #include <except.h>
35: #include <ctype.h>
36:
37: #if DEBUG
38: int CourierServerDebuggingFlag = 0;
39: #endif
40:
41: /*
42: * Message stream handle.
43: */
44: CourierConnection *_serverConnection = 0;
45: Unspecified tid; /* transaction ID */
46:
47:
48: /* CALL, transaction id, prognumh, prognuml, version, procedurenum */
49: #define CALLHDRLEN 6
50:
51:
52: Unspecified *
53: ReceiveCallMessage(procp, skipcount, skippedwords)
54: Cardinal *procp;
55: int skipcount;
56: Unspecified *skippedwords;
57: {
58: Cardinal msgtype, version;
59: LongCardinal programnumber;
60: Unspecified *buf, *bp, hdrbuf[CALLHDRLEN];
61: int i;
62:
63: if (skipcount > 1 && _serverConnection->state == wantversion) {
64: skipcount -= 2;
65: _serverConnection->state = calldone;
66: skippedwords += 2;
67: }
68: if (skipcount > CALLHDRLEN) {
69: fprintf(stderr,"ReceiveCallMessage: skipcount=%d, too big\n",
70: skipcount);
71: exit(1);
72: }
73: for (i=0; i < skipcount; i++)
74: hdrbuf[i] = skippedwords[i];
75: buf = ReadMessage(_serverConnection, hdrbuf+skipcount,
76: CALLHDRLEN-skipcount);
77: bp = hdrbuf;
78: bp += internalize_Cardinal(&msgtype, bp);
79: bp += internalize_Unspecified(&tid, bp);
80: bp += internalize_LongCardinal(&programnumber, bp);
81: bp += internalize_Cardinal(&version, bp);
82: bp += internalize_Cardinal(procp, bp);
83: #if DEBUG
84: if (CourierServerDebuggingFlag)
85: fprintf(stderr, "[ReceiveCallMessage %D %d %d]\n",
86: programnumber, version, *procp);
87: #endif
88: return(buf);
89: }
90:
91:
92: SendReturnMessage(nwords, results)
93: Cardinal nwords;
94: Unspecified *results;
95: {
96: #define RETHDRLEN 2
97: Unspecified *bp, buf[RETHDRLEN];
98: static Cardinal msgtype = RETURN;
99:
100: #if DEBUG
101: if (CourierServerDebuggingFlag)
102: fprintf(stderr, "[SendReturnMessage %d]\n", nwords);
103: #endif
104: bp = buf;
105: bp += externalize_Cardinal(&msgtype, bp);
106: bp += externalize_Unspecified(&tid, bp);
107: CourierWrite(_serverConnection, (bp-buf), buf, nwords, results);
108: _serverConnection->bdtstate = wantdata;
109: }
110:
111:
112: static int
113: ServerInit(argc, argv, skippedwords)
114: int argc;
115: char *argv[];
116: Unspecified skippedwords[];
117: {
118: extern char *malloc();
119: int skipcount;
120: #if DEBUG
121: int namelen;
122: #endif
123: int i;
124:
125: _serverConnection = (CourierConnection *)
126: malloc(sizeof(CourierConnection));
127: _serverConnection->bdtstate = wantdata;
128: /* we normally don't bother to set up host, since the server will
129: * never reopen a closed connection
130: */
131: #if DEBUG
132: namelen = sizeof(struct sockaddr_ns);
133: getpeername(_serverConnection->fd, &_serverConnection->host, &namelen);
134: fprintf(stderr,"[ServerInit: argc=%d]\n",argc);
135: for (i=0; i<argc; i++) fprintf(stderr,"\targv[%d]=%s\n", i,argv[i]);
136:
137: #endif
138: skipcount = -1;
139: while (argc-- > 0) {
140: #if DEBUG
141: if (strcmp(argv[0],"-d") == 0)
142: CourierServerDebuggingFlag = 1;
143: else
144: #endif
145: if (isdigit(*argv[0])) {
146: if (skipcount < 0) {
147: _serverConnection->fd = atoi(argv[0]);
148: skipcount++;
149: }
150: else if (skipcount < 8)
151: skippedwords[skipcount++] = atoi(argv[0]);
152: }
153: argv++;
154: }
155: if (skipcount < 0 || skipcount == 1) {
156: fprintf(stderr,"in ServerInit, skipcount=%d\n",skipcount);
157: exit(1);
158: }
159: _serverConnection->state = wantversion;
160: return(skipcount);
161: }
162:
163:
164: main(argc, argv)
165: int argc;
166: char *argv[];
167: {
168: /*
169: * The caller may need to read a packet before getting to the
170: * program/version which it needs for dispatching. Data so read
171: * is passed in the argv list, and used to set skipcount and
172: * skippedwords.
173: */
174: int skipcount; /* actual length of skippedwords */
175: Unspecified skippedwords[8];
176:
177: /* ServerInit() contains server-independent startup code */
178: skipcount = ServerInit(argc, argv, skippedwords);
179:
180: /* Server() may terminate in 2 ways:
181: * (1) normally, with a return(0) and a closed connection,
182: * either from our timeout or from END sent by client.
183: * (2) abnormally, with an exit(1) indicating a protocol
184: * violation. We do not currently close down the
185: * connection in all such cases, but we should.
186: * Note that Server may also exec() a different server if
187: * a remote procedure for a different program arrives.
188: */
189: Server(skipcount, skippedwords);
190: exit(0);
191: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.