|
|
1.1 root 1: /*
2: * This file implements client functions for the XNS courier library
3: */
4:
5: /*
6: $Log: client.c,v $
7: * Revision 2.0 85/11/21 07:22:04 jqj
8: * 4.3BSD standard release
9: *
10: * Revision 1.3 85/03/11 16:36:46 jqj
11: * *** empty log message ***
12: *
13: * Revision 1.3 85/03/11 16:36:46 jqj
14: * Public alpha-test version, released 11 March 1985
15: *
16: * Revision 1.2 85/01/27 07:37:10 jqj
17: * finished but undebugged version
18: *
19: * Revision 1.1 84/12/30 10:14:30 jqj
20: * Initial revision -- Mogul's tcp-based version
21: */
22:
23: #ifndef lint
24: static char rcsid[] = "$Header: client.c,v 2.0 85/11/21 07:22:04 jqj Exp $";
25: #endif
26:
27: #include <stdio.h>
28: #include <sys/types.h> /* for xn.h, and socket.h */
29: #include <sys/socket.h>
30: #include <netns/ns.h> /* for XNS addresses and courierconnection.h */
31: #include <netns/sp.h> /* for XNS addresses and courierconnection.h */
32: #include "courier.h"
33: #include "realcourierconnection.h"
34: #include <except.h>
35:
36: #if DEBUG
37: int CourierClientDebuggingFlag = 0;
38: #endif
39:
40:
41:
42: CourierConnection *
43: CourierOpen( addr )
44: struct ns_addr *addr;
45: {
46: extern char *malloc();
47: CourierConnection *conn;
48:
49: conn = (CourierConnection*) malloc(sizeof(CourierConnection));
50: conn->host.sns_family = AF_NS;
51: conn->host.sns_addr = *addr;
52: /* unknown socket? */
53: if (conn->host.sns_addr.x_port == 0)
54: conn->host.sns_addr.x_port = htons(IDPPORT_COURIER);
55: #if DEBUG
56: if (CourierClientDebuggingFlag)
57: fprintf(stderr,
58: "[CourierOpen: connect to %x#%x.%x.%x.%x.%x.%x#%x]\n",
59: ns_netof(conn->host.sns_addr),
60: conn->host.sns_addr.x_host.c_host[0],
61: conn->host.sns_addr.x_host.c_host[1],
62: conn->host.sns_addr.x_host.c_host[2],
63: conn->host.sns_addr.x_host.c_host[3],
64: conn->host.sns_addr.x_host.c_host[4],
65: conn->host.sns_addr.x_host.c_host[5],
66: ntohs(conn->host.sns_addr.x_port));
67: #endif
68: if ((conn->fd = openSPPConnection(&conn->host)) >= 0) {
69: conn->abortseen = FALSE;
70: conn->bdtstate = wantdata;
71: conn->state = wantversion;
72: conn->sphdrOpts.sp_dt = 0;
73: conn->sphdrOpts.sp_cc = 0;
74: return(conn);
75: }
76: else {
77: free((char*)conn);
78: return(NULL);
79: }
80: }
81:
82:
83: SendCallMessage(f, program, version, procedure, nwords, arguments)
84: CourierConnection *f; /* socket descriptor */
85: LongCardinal program; /* Courier program number */
86: Cardinal version, /* Courier program version */
87: procedure, /* Courier procedure number */
88: nwords; /* number of words in argument buffer */
89: Unspecified *arguments; /* prepacked argument buffer */
90: {
91: static Cardinal ourCVersion = COURIERVERSION;
92: static Cardinal msgtype = 0;
93: static Unspecified tid = 0;
94: #define HDRLEN 8
95: Unspecified *_bp, hdrbuf[HDRLEN];
96:
97: #if DEBUG
98: if (CourierClientDebuggingFlag)
99: fprintf(stderr, "[SendCallMessage program %D procedure %d, arglen %d]\n",
100: program, procedure, nwords);
101: #endif
102: _bp = hdrbuf;
103: if (f->state == wantversion) {
104: /* exchange version numbers */
105: _bp += externalize_Cardinal(&ourCVersion, _bp);
106: _bp += externalize_Cardinal(&ourCVersion, _bp);
107: }
108: _bp += externalize_Cardinal(&msgtype, _bp); /* call message type */
109: _bp += externalize_Unspecified(&tid, _bp); /* transaction id */
110: _bp += externalize_LongCardinal(&program, _bp);
111: _bp += externalize_Cardinal(&version, _bp);
112: _bp += externalize_Cardinal(&procedure, _bp);
113: (void) CheckEND(f);
114: CourierWrite(f, (_bp-hdrbuf), hdrbuf, nwords, arguments);
115: if (f->state == calldone)
116: f->state = inprogress;
117: }
118:
119:
120: Unspecified *
121: ReceiveReturnMessage(f, abortedFlag)
122: CourierConnection *f; /* socket descriptor */
123: Boolean *abortedFlag; /* TRUE iff abort received */
124: /* returns a pointer to a block of data to be freed after unpacking
125: * procResults or [errorValue, errorArgs]
126: */
127: {
128: #define RETHDRLEN 2
129: Unspecified *bp, *buf, hdrbuf[RETHDRLEN];
130: Cardinal msgtype, tid;
131: rejectionDetails *rdetails;
132: extern char *malloc();
133:
134: buf = ReadMessage(f, hdrbuf, RETHDRLEN);
135: bp = hdrbuf;
136: f->state = calldone;
137: bp += internalize_Cardinal(&msgtype, bp);
138: bp += internalize_Unspecified(&tid, bp);
139: #if DEBUG
140: if (CourierClientDebuggingFlag)
141: fprintf(stderr, "[ReceiveReturnMessage type %d]\n", msgtype);
142: #endif
143: switch (msgtype) {
144: case RETURN:
145: *abortedFlag = FALSE;
146: break;
147: case REJECT:
148: bp = buf;
149: rdetails = (rejectionDetails*)malloc(sizeof(rejectionDetails));
150: bp += internalize_enumeration(&(rdetails->designator), bp);
151: if (rdetails->designator == noSuchVersionNumber) {
152: bp += internalize_Cardinal( &(rdetails->noSuchVersionNumber_case.lowest), bp);
153: bp += internalize_Cardinal( &(rdetails->noSuchVersionNumber_case.highest), bp);
154: }
155: Deallocate(buf);
156: raise(REJECT_ERROR, (char*) rdetails);
157: /*NOTREACHED*/
158: case ABORT:
159: *abortedFlag = TRUE;
160: break;
161: }
162: return(buf);
163: }
164:
165:
166: MaybeCallBDTHandler(f, BDTproc)
167: /* called by RPC stub from Foo_client.c */
168: CourierConnection *f; /* socket descriptor */
169: int (*BDTproc)();
170: {
171: /* can't look ahead here, since server may be expecting us to send
172: * lots of data before he does anything
173: */
174: f->abortseen = FALSE;
175: /* ### setup interrupt handler for URGENT messages */
176: if (BDTproc != NULL)
177: (*BDTproc)(f);
178: /* ### clear interrupt handler */
179: f->bdtstate = wantdata;
180: }
181:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.