|
|
1.1 root 1: /* ryresponder.c - generic idempotent responder */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/imisc/RCS/ryresponder.c,v 7.1 90/07/09 14:38:54 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/imisc/RCS/ryresponder.c,v 7.1 90/07/09 14:38:54 mrose Exp $
9: *
10: *
11: * $Log: ryresponder.c,v $
12: * Revision 7.1 90/07/09 14:38:54 mrose
13: * sync
14: *
15: * Revision 7.0 89/11/23 21:57:44 mrose
16: * Release 6.0
17: *
18: */
19:
20: /*
21: * NOTICE
22: *
23: * Acquisition, use, and distribution of this module and related
24: * materials are subject to the restrictions of a license agreement.
25: * Consult the Preface in the User's Manual for the full terms of
26: * this agreement.
27: *
28: */
29:
30:
31: #include <stdio.h>
32: #include <setjmp.h>
33: #include <varargs.h>
34: #include "ryresponder.h"
35: #include "tsap.h" /* for listening */
36: #include "tailor.h"
37:
38: /* DATA */
39:
40: int debug = 0;
41:
42: static LLog _pgm_log = {
43: "responder.log", NULLCP, NULLCP,
44: LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE, LLOG_FATAL, -1,
45: LLOGCLS | LLOGCRT | LLOGZER, NOTOK
46: };
47: LLog *pgm_log = &_pgm_log;
48:
49: static char *myname = "ryresponder";
50:
51:
52: static jmp_buf toplevel;
53:
54:
55: static IFP startfnx;
56: static IFP stopfnx;
57:
58: int ros_init (), ros_work (), ros_indication (), ros_lose ();
59:
60:
61: extern int errno;
62:
63: /* RESPONDER */
64:
65: ryresponder (argc, argv, host, myservice, mycontext, dispatches, ops,
66: start, stop)
67: int argc;
68: char **argv,
69: *host,
70: *myservice,
71: *mycontext;
72: struct dispatch *dispatches;
73: struct RyOperation *ops;
74: IFP start,
75: stop;
76: {
77: register struct dispatch *ds;
78: AEI aei;
79: struct TSAPdisconnect tds;
80: struct TSAPdisconnect *td = &tds;
81: struct RoSAPindication rois;
82: register struct RoSAPindication *roi = &rois;
83: register struct RoSAPpreject *rop = &roi -> roi_preject;
84:
85: if (myname = rindex (argv[0], '/'))
86: myname++;
87: if (myname == NULL || *myname == NULL)
88: myname = argv[0];
89:
90: isodetailor (myname, 0);
91: if (debug = isatty (fileno (stderr)))
92: ll_dbinit (pgm_log, myname);
93: else {
94: static char myfile[BUFSIZ];
95:
96: (void) sprintf (myfile, "%s.log",
97: (strncmp (myname, "ros.", 4)
98: && strncmp (myname, "lpp.", 4))
99: || myname[4] == NULL
100: ? myname : myname + 4);
101: pgm_log -> ll_file = myfile;
102: ll_hdinit (pgm_log, myname);
103: }
104:
105: advise (LLOG_NOTICE, NULLCP, "starting");
106:
107: if ((aei = _str2aei (host, myservice, mycontext, 0)) == NULLAEI)
108: adios (NULLCP, "unable to resolve service: %s", PY_pepy);
109:
110: for (ds = dispatches; ds -> ds_name; ds++)
111: if (RyDispatch (NOTOK, ops, ds -> ds_operation, ds -> ds_vector, roi)
112: == NOTOK)
113: ros_adios (rop, ds -> ds_name);
114:
115: startfnx = start;
116: stopfnx = stop;
117:
118: if (isodeserver (argc, argv, aei, ros_init, ros_work, ros_lose, td)
119: == NOTOK) {
120: if (td -> td_cc > 0)
121: adios (NULLCP, "isodeserver: [%s] %*.*s",
122: TErrString (td -> td_reason),
123: td -> td_cc, td -> td_cc, td -> td_data);
124: else
125: adios (NULLCP, "isodeserver: [%s]",
126: TErrString (td -> td_reason));
127: }
128:
129: exit (0);
130: }
131:
132: /* */
133:
134: static int ros_init (vecp, vec)
135: int vecp;
136: char **vec;
137: {
138: int reply,
139: result,
140: sd;
141: struct AcSAPstart acss;
142: register struct AcSAPstart *acs = &acss;
143: struct AcSAPindication acis;
144: register struct AcSAPindication *aci = &acis;
145: register struct AcSAPabort *aca = &aci -> aci_abort;
146: register struct PSAPstart *ps = &acs -> acs_start;
147: struct RoSAPindication rois;
148: register struct RoSAPindication *roi = &rois;
149: register struct RoSAPpreject *rop = &roi -> roi_preject;
150:
151: if (AcInit (vecp, vec, acs, aci) == NOTOK) {
152: acs_advise (aca, "initialization fails");
153: return NOTOK;
154: }
155: advise (LLOG_NOTICE, NULLCP,
156: "A-ASSOCIATE.INDICATION: <%d, %s, %s, %s, %d>",
157: acs -> acs_sd, oid2ode (acs -> acs_context),
158: sprintaei (&acs -> acs_callingtitle),
159: sprintaei (&acs -> acs_calledtitle), acs -> acs_ninfo);
160:
161: sd = acs -> acs_sd;
162:
163: for (vec++; *vec; vec++)
164: advise (LLOG_EXCEPTIONS, NULLCP, "unknown argument \"%s\"", *vec);
165:
166: reply = startfnx ? (*startfnx) (sd, acs) : ACS_ACCEPT;
167:
168: result = AcAssocResponse (sd, reply,
169: reply != ACS_ACCEPT ? ACS_USER_NOREASON : ACS_USER_NULL,
170: NULLOID, NULLAEI, NULLPA, NULLPC, ps -> ps_defctxresult,
171: ps -> ps_prequirements, ps -> ps_srequirements, SERIAL_NONE,
172: ps -> ps_settings, &ps -> ps_connect, NULLPEP, 0, aci);
173:
174: ACSFREE (acs);
175:
176: if (result == NOTOK) {
177: acs_advise (aca, "A-ASSOCIATE.RESPONSE");
178: return NOTOK;
179: }
180: if (reply != ACS_ACCEPT)
181: return NOTOK;
182:
183: if (RoSetService (sd, RoPService, roi) == NOTOK)
184: ros_adios (rop, "set RO/PS fails");
185:
186: return sd;
187: }
188:
189: /* */
190:
191: static int ros_work (fd)
192: int fd;
193: {
194: int result;
195: caddr_t out;
196: struct AcSAPindication acis;
197: struct RoSAPindication rois;
198: register struct RoSAPindication *roi = &rois;
199: register struct RoSAPpreject *rop = &roi -> roi_preject;
200:
201: switch (setjmp (toplevel)) {
202: case OK:
203: break;
204:
205: default:
206: if (stopfnx)
207: (*stopfnx) (fd, (struct AcSAPfinish *) 0);
208: case DONE:
209: (void) AcUAbortRequest (fd, NULLPEP, 0, &acis);
210: (void) RyLose (fd, roi);
211: return NOTOK;
212: }
213:
214: switch (result = RyWait (fd, NULLIP, &out, OK, roi)) {
215: case NOTOK:
216: if (rop -> rop_reason == ROS_TIMER)
217: break;
218: case OK:
219: case DONE:
220: ros_indication (fd, roi);
221: break;
222:
223: default:
224: adios (NULLCP, "unknown return from RoWaitRequest=%d", result);
225: }
226:
227: return OK;
228: }
229:
230: /* */
231:
232: static int ros_indication (sd, roi)
233: int sd;
234: register struct RoSAPindication *roi;
235: {
236: int reply,
237: result;
238:
239: switch (roi -> roi_type) {
240: case ROI_INVOKE:
241: case ROI_RESULT:
242: case ROI_ERROR:
243: adios (NULLCP, "unexpected indication type=%d", roi -> roi_type);
244: break;
245:
246: case ROI_UREJECT:
247: {
248: register struct RoSAPureject *rou = &roi -> roi_ureject;
249:
250: if (rou -> rou_noid)
251: advise (LLOG_EXCEPTIONS, NULLCP,
252: "RO-REJECT-U.INDICATION/%d: %s",
253: sd, RoErrString (rou -> rou_reason));
254: else
255: advise (LLOG_EXCEPTIONS, NULLCP,
256: "RO-REJECT-U.INDICATION/%d: %s (id=%d)",
257: sd, RoErrString (rou -> rou_reason),
258: rou -> rou_id);
259: }
260: break;
261:
262: case ROI_PREJECT:
263: {
264: register struct RoSAPpreject *rop = &roi -> roi_preject;
265:
266: if (ROS_FATAL (rop -> rop_reason))
267: ros_adios (rop, "RO-REJECT-P.INDICATION");
268: ros_advise (rop, "RO-REJECT-P.INDICATION");
269: }
270: break;
271:
272: case ROI_FINISH:
273: {
274: register struct AcSAPfinish *acf = &roi -> roi_finish;
275: struct AcSAPindication acis;
276: register struct AcSAPabort *aca = &acis.aci_abort;
277:
278: advise (LLOG_NOTICE, NULLCP, "A-RELEASE.INDICATION/%d: %d",
279: sd, acf -> acf_reason);
280:
281: reply = stopfnx ? (*stopfnx) (sd, acf) : ACS_ACCEPT;
282:
283: result = AcRelResponse (sd, reply, ACR_NORMAL, NULLPEP, 0,
284: &acis);
285:
286: ACFFREE (acf);
287:
288: if (result == NOTOK)
289: acs_advise (aca, "A-RELEASE.RESPONSE");
290: else
291: if (reply != ACS_ACCEPT)
292: break;
293: longjmp (toplevel, DONE);
294: }
295: /* NOTREACHED */
296:
297: default:
298: adios (NULLCP, "unknown indication type=%d", roi -> roi_type);
299: }
300: }
301:
302: /* */
303:
304: static int ros_lose (td)
305: struct TSAPdisconnect *td;
306: {
307: if (td -> td_cc > 0)
308: adios (NULLCP, "TNetAccept: [%s] %*.*s",
309: TErrString (td -> td_reason), td -> td_cc, td -> td_cc,
310: td -> td_data);
311: else
312: adios (NULLCP, "TNetAccept: [%s]", TErrString (td -> td_reason));
313: }
314:
315: /* ERRORS */
316:
317: void ros_adios (rop, event)
318: register struct RoSAPpreject *rop;
319: char *event;
320: {
321: ros_advise (rop, event);
322:
323: longjmp (toplevel, NOTOK);
324: }
325:
326:
327: void ros_advise (rop, event)
328: register struct RoSAPpreject *rop;
329: char *event;
330: {
331: char buffer[BUFSIZ];
332:
333: if (rop -> rop_cc > 0)
334: (void) sprintf (buffer, "[%s] %*.*s", RoErrString (rop -> rop_reason),
335: rop -> rop_cc, rop -> rop_cc, rop -> rop_data);
336: else
337: (void) sprintf (buffer, "[%s]", RoErrString (rop -> rop_reason));
338:
339: advise (LLOG_EXCEPTIONS, NULLCP, "%s: %s", event, buffer);
340: }
341:
342: /* */
343:
344: void acs_advise (aca, event)
345: register struct AcSAPabort *aca;
346: char *event;
347: {
348: char buffer[BUFSIZ];
349:
350: if (aca -> aca_cc > 0)
351: (void) sprintf (buffer, "[%s] %*.*s",
352: AcErrString (aca -> aca_reason),
353: aca -> aca_cc, aca -> aca_cc, aca -> aca_data);
354: else
355: (void) sprintf (buffer, "[%s]", AcErrString (aca -> aca_reason));
356:
357: advise (LLOG_EXCEPTIONS, NULLCP, "%s: %s (source %d)", event, buffer,
358: aca -> aca_source);
359: }
360:
361: /* */
362:
363: #ifndef lint
364: void adios (va_alist)
365: va_dcl
366: {
367: va_list ap;
368:
369: va_start (ap);
370:
371: _ll_log (pgm_log, LLOG_FATAL, ap);
372:
373: va_end (ap);
374:
375: _exit (1);
376: }
377: #else
378: /* VARARGS2 */
379:
380: void adios (what, fmt)
381: char *what,
382: *fmt;
383: {
384: adios (what, fmt);
385: }
386: #endif
387:
388:
389: #ifndef lint
390: void advise (va_alist)
391: va_dcl
392: {
393: int code;
394: va_list ap;
395:
396: va_start (ap);
397:
398: code = va_arg (ap, int);
399:
400: _ll_log (pgm_log, code, ap);
401:
402: va_end (ap);
403: }
404: #else
405: /* VARARGS3 */
406:
407: void advise (code, what, fmt)
408: char *what,
409: *fmt;
410: int code;
411: {
412: advise (code, what, fmt);
413: }
414: #endif
415:
416:
417: #ifndef lint
418: void ryr_advise (va_alist)
419: va_dcl
420: {
421: va_list ap;
422:
423: va_start (ap);
424:
425: _ll_log (pgm_log, LLOG_NOTICE, ap);
426:
427: va_end (ap);
428: }
429: #else
430: /* VARARGS2 */
431:
432: void ryr_advise (what, fmt)
433: char *what,
434: *fmt;
435: {
436: ryr_advise (what, fmt);
437: }
438: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.