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