|
|
1.1 ! root 1: /* ryinitiator.c - generic interactive initiator */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/imisc/RCS/ryinitiator.c,v 7.2 90/07/09 14:38:52 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/imisc/RCS/ryinitiator.c,v 7.2 90/07/09 14:38:52 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: ryinitiator.c,v $ ! 12: * Revision 7.2 90/07/09 14:38:52 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.1 90/07/01 21:04:09 mrose ! 16: * pepsy ! 17: * ! 18: * Revision 7.0 89/11/23 21:57:42 mrose ! 19: * Release 6.0 ! 20: * ! 21: */ ! 22: ! 23: /* ! 24: * NOTICE ! 25: * ! 26: * Acquisition, use, and distribution of this module and related ! 27: * materials are subject to the restrictions of a license agreement. ! 28: * Consult the Preface in the User's Manual for the full terms of ! 29: * this agreement. ! 30: * ! 31: */ ! 32: ! 33: ! 34: #include <stdio.h> ! 35: #include <varargs.h> ! 36: #include "ryinitiator.h" ! 37: ! 38: #undef TIMER ! 39: #undef TMS ! 40: #ifdef BSD42 ! 41: #define TIMER ! 42: #endif ! 43: #ifdef SYS5 ! 44: #define TIMER ! 45: #ifndef HPUX ! 46: #include <sys/times.h> ! 47: #define TMS ! 48: #endif ! 49: #endif ! 50: ! 51: /* DATA */ ! 52: ! 53: static int count = 1; ! 54: int length = 536; ! 55: ! 56: ! 57: #ifdef TIMER ! 58: #define DS_RESULT(ds) (timing ? timing_result : (ds) -> ds_result) ! 59: ! 60: static int timing = 0; ! 61: ! 62: int timing_result (); ! 63: #else ! 64: #define DS_RESULT(ds) ((ds) -> ds_result) ! 65: #endif ! 66: ! 67: static char *myname = "ryinitiator"; ! 68: ! 69: ! 70: extern char *isodeversion; ! 71: ! 72: /* INITIATOR */ ! 73: ! 74: /* ARGSUSED */ ! 75: ! 76: ryinitiator (argc, argv, myservice, mycontext, mypci, ops, dispatches, quit) ! 77: int argc; ! 78: char **argv, ! 79: *myservice, ! 80: *mycontext, ! 81: *mypci; ! 82: struct RyOperation ops[]; ! 83: struct dispatch *dispatches; ! 84: IFP quit; ! 85: { ! 86: int iloop, ! 87: sd; ! 88: register char *cp, ! 89: **ap; ! 90: char buffer[BUFSIZ], ! 91: *vec[NVEC + 1]; ! 92: register struct dispatch *ds; ! 93: struct QOStype qos; ! 94: struct SSAPref sfs; ! 95: register struct SSAPref *sf; ! 96: register struct PSAPaddr *pa; ! 97: struct AcSAPconnect accs; ! 98: register struct AcSAPconnect *acc = &accs; ! 99: struct AcSAPindication acis; ! 100: register struct AcSAPindication *aci = &acis; ! 101: register struct AcSAPabort *aca = &aci -> aci_abort; ! 102: AEI aei; ! 103: OID ctx, ! 104: pci; ! 105: struct PSAPctxlist pcs; ! 106: register struct PSAPctxlist *pc = &pcs; ! 107: struct RoSAPindication rois; ! 108: register struct RoSAPindication *roi = &rois; ! 109: register struct RoSAPpreject *rop = &roi -> roi_preject; ! 110: ! 111: if (myname = rindex (argv[0], '/')) ! 112: myname++; ! 113: if (myname == NULL || *myname == NULL) ! 114: myname = argv[0]; ! 115: ! 116: isodetailor (myname, 1); ! 117: ! 118: qos.qos_reliability = HIGH_QUALITY; ! 119: ! 120: for (ap = argv + 1; cp = *ap; ap++) { ! 121: if (*cp != '-') ! 122: break; ! 123: ! 124: if (strcmp (cp, "-low") == 0) { ! 125: qos.qos_reliability = LOW_QUALITY; ! 126: continue; ! 127: } ! 128: if (strcmp (cp, "-high") == 0) { ! 129: qos.qos_reliability = HIGH_QUALITY; ! 130: continue; ! 131: } ! 132: if (strcmp (cp, "-c") == 0) { ! 133: if ((cp = *++ap) == NULL ! 134: || sscanf (cp, "%d", &count) != 1 ! 135: || count < 1) ! 136: adios (NULLCP, "usage: %s -c count", myname); ! 137: #ifdef TIMER ! 138: timing++; ! 139: #endif ! 140: continue; ! 141: } ! 142: if (strcmp (cp, "-l") == 0) { ! 143: if ((cp = *++ap) == NULL ! 144: || sscanf (cp, "%d", &length) != 1 ! 145: || length < 0) ! 146: adios (NULLCP, "usage: %s -l length", myname); ! 147: continue; ! 148: } ! 149: ! 150: adios (NULLCP, "%s: unknown switch", cp); ! 151: } ! 152: ! 153: if ((cp = *ap++) == NULL) ! 154: adios (NULLCP, "usage: %s host [operation [ arguments ... ]]", myname); ! 155: ! 156: if ((aei = _str2aei (cp, myservice, mycontext, 0)) == NULLAEI) ! 157: adios (NULLCP, "unable to resolve service: %s", PY_pepy); ! 158: if ((pa = aei2addr (aei)) == NULLPA) ! 159: adios (NULLCP, "address translation failed"); ! 160: ! 161: if ((ctx = ode2oid (mycontext)) == NULLOID) ! 162: adios (NULLCP, "%s: unknown object descriptor", mycontext); ! 163: if ((ctx = oid_cpy (ctx)) == NULLOID) ! 164: adios (NULLCP, "out of memory"); ! 165: if ((pci = ode2oid (mypci)) == NULLOID) ! 166: adios (NULLCP, "%s: unknown object descriptor", mypci); ! 167: if ((pci = oid_cpy (pci)) == NULLOID) ! 168: adios (NULLCP, "out of memory"); ! 169: pc -> pc_nctx = 1; ! 170: pc -> pc_ctx[0].pc_id = 1; ! 171: pc -> pc_ctx[0].pc_asn = pci; ! 172: pc -> pc_ctx[0].pc_atn = NULLOID; ! 173: ! 174: if ((sf = addr2ref (PLocalHostName ())) == NULL) { ! 175: sf = &sfs; ! 176: (void) bzero ((char *) sf, sizeof *sf); ! 177: } ! 178: ! 179: if (*ap == NULL) { ! 180: printf ("%s", myname); ! 181: if (sf -> sr_ulen > 2) ! 182: printf (" running on host %s", sf -> sr_udata + 2); ! 183: if (sf -> sr_clen > 2) ! 184: printf (" at %s", sf -> sr_cdata + 2); ! 185: printf (" [%s, ", oid2ode (ctx)); ! 186: printf ("%s]\n", oid2ode (pci)); ! 187: printf ("using %s\n", isodeversion); ! 188: ! 189: printf ("%s... ", cp); ! 190: (void) fflush (stdout); ! 191: ! 192: iloop = 1; ! 193: } ! 194: else { ! 195: cp = *ap++; ! 196: for (ds = dispatches; ds -> ds_name; ds++) ! 197: if (strcmp (ds -> ds_name, cp) == 0) ! 198: break; ! 199: if (ds -> ds_name == NULL) ! 200: adios (NULLCP, "unknown operation \"%s\"", cp); ! 201: ! 202: iloop = 0; ! 203: } ! 204: ! 205: if (AcAssocRequest (ctx, NULLAEI, aei, NULLPA, pa, pc, NULLOID, ! 206: 0, ROS_MYREQUIRE, SERIAL_NONE, 0, sf, NULLPEP, 0, &qos, ! 207: acc, aci) ! 208: == NOTOK) ! 209: acs_adios (aca, "A-ASSOCIATE.REQUEST"); ! 210: ! 211: if (acc -> acc_result != ACS_ACCEPT) { ! 212: if (iloop) ! 213: printf ("failed\n"); ! 214: ! 215: adios (NULLCP, "association rejected: [%s]", ! 216: AcErrString (acc -> acc_result)); ! 217: } ! 218: if (iloop) { ! 219: printf ("connected\n"); ! 220: (void) fflush (stdout); ! 221: } ! 222: ! 223: sd = acc -> acc_sd; ! 224: ACCFREE (acc); ! 225: ! 226: if (RoSetService (sd, RoPService, roi) == NOTOK) ! 227: ros_adios (rop, "set RO/PS fails"); ! 228: ! 229: if (iloop) { ! 230: for (;;) { ! 231: if (getline (buffer) == NOTOK) ! 232: break; ! 233: ! 234: if (str2vec (buffer, vec) < 1) ! 235: continue; ! 236: ! 237: for (ds = dispatches; ds -> ds_name; ds++) ! 238: if (strcmp (ds -> ds_name, vec[0]) == 0) ! 239: break; ! 240: if (ds -> ds_name == NULL) { ! 241: advise (NULLCP, "unknown operation \"%s\"", vec[0]); ! 242: continue; ! 243: } ! 244: ! 245: invoke (sd, ops, ds, vec + 1); ! 246: } ! 247: } ! 248: else ! 249: invoke (sd, ops, ds, ap); ! 250: ! 251: (*quit) (sd, (struct dispatch *) NULL, (char **) NULL, (caddr_t *) NULL); ! 252: } ! 253: ! 254: /* INVOKE */ ! 255: ! 256: static invoke (sd, ops, ds, args) ! 257: int sd; ! 258: struct RyOperation ops[]; ! 259: register struct dispatch *ds; ! 260: char **args; ! 261: { ! 262: register int i; ! 263: int cc, ! 264: result; ! 265: caddr_t in; ! 266: struct RoSAPindication rois; ! 267: register struct RoSAPindication *roi = &rois; ! 268: register struct RoSAPpreject *rop = &roi -> roi_preject; ! 269: ! 270: in = NULL; ! 271: if (ds -> ds_argument && (*ds -> ds_argument) (sd, ds, args, &in) == NOTOK) ! 272: return; ! 273: ! 274: #ifdef TIMER ! 275: if (timing) { ! 276: register struct RyOperation *ryo = ops; ! 277: PE pe; ! 278: ! 279: cc = 0; ! 280: ! 281: for (; ryo -> ryo_name; ryo++) ! 282: if (ryo -> ryo_op == ds -> ds_operation) ! 283: break; ! 284: if (!ryo -> ryo_name || !ryo -> ryo_arg_mod) ! 285: goto nope; ! 286: ! 287: pe = NULLPE; ! 288: if (enc_f (ryo -> ryo_arg_index, ryo -> ryo_arg_mod, &pe, 1, NULL, ! 289: NULLCP, in) != NOTOK) ! 290: cc = ps_get_abs (pe); ! 291: if (pe) ! 292: pe_free (pe); ! 293: ! 294: nope: ; ! 295: timer (0, 0); ! 296: } ! 297: #endif ! 298: ! 299: for (i = 0; i < count; i++) ! 300: switch (result = RyStub (sd, ops, ds -> ds_operation, RyGenID (sd), ! 301: NULLIP, in, DS_RESULT (ds), ds -> ds_error, ! 302: ROS_SYNC, roi)) { ! 303: case NOTOK: /* failure */ ! 304: if (ROS_FATAL (rop -> rop_reason)) ! 305: ros_adios (rop, "STUB"); ! 306: ros_advise (rop, "STUB"); ! 307: goto out; ! 308: ! 309: case OK: /* got a result/error response */ ! 310: break; ! 311: ! 312: case DONE: /* got RO-END? */ ! 313: adios (NULLCP, "got RO-END.INDICATION"); ! 314: /* NOTREACHED */ ! 315: ! 316: default: ! 317: adios (NULLCP, "unknown return from RyStub=%d", result); ! 318: /* NOTREACHED */ ! 319: } ! 320: ! 321: #ifdef TIMER ! 322: if (timing) ! 323: timer (cc, count); ! 324: #endif ! 325: ! 326: out: ; ! 327: if (ds -> ds_fr_mod && in) ! 328: fre_obj (in, ds -> ds_fr_mod -> md_dtab[ds -> ds_fr_index], ! 329: ds -> ds_fr_mod); ! 330: } ! 331: ! 332: /* INTERACTIVE */ ! 333: ! 334: static int getline (buffer) ! 335: char *buffer; ! 336: { ! 337: register int i; ! 338: register char *cp, ! 339: *ep; ! 340: static int sticky = 0; ! 341: ! 342: if (sticky) { ! 343: sticky = 0; ! 344: return NOTOK; ! 345: } ! 346: ! 347: printf ("%s> ", myname); ! 348: (void) fflush (stdout); ! 349: ! 350: for (ep = (cp = buffer) + BUFSIZ - 1; (i = getchar ()) != '\n';) { ! 351: if (i == EOF) { ! 352: printf ("\n"); ! 353: clearerr (stdin); ! 354: if (cp != buffer) { ! 355: sticky++; ! 356: break; ! 357: } ! 358: ! 359: return NOTOK; ! 360: } ! 361: ! 362: if (cp < ep) ! 363: *cp++ = i; ! 364: } ! 365: *cp = NULL; ! 366: ! 367: return OK; ! 368: } ! 369: ! 370: /* TIMER */ ! 371: ! 372: #ifdef TIMER ! 373: ! 374: #ifndef NBBY ! 375: #define NBBY 8 ! 376: #endif ! 377: ! 378: ! 379: #ifndef TMS ! 380: static timer (bytes, pkts) ! 381: int bytes, ! 382: pkts; ! 383: { ! 384: long ms; ! 385: float bs, ! 386: ps; ! 387: struct timeval stop, ! 388: td; ! 389: static struct timeval start; ! 390: ! 391: if (pkts == 0) { ! 392: (void) gettimeofday (&start, (struct timezone *) 0); ! 393: return; ! 394: } ! 395: else ! 396: (void) gettimeofday (&stop, (struct timezone *) 0); ! 397: ! 398: tvsub (&td, &stop, &start); ! 399: ms = (td.tv_sec * 1000) + (td.tv_usec / 1000); ! 400: bs = (((float) bytes * pkts * NBBY * 1000) / (float) (ms ? ms : 1)) / NBBY; ! 401: ps = ((float) pkts * 1000) / (float) (ms ? ms : 1); ! 402: ! 403: printf ("%d operations in %d.%02d seconds (%.2f ops/s)", ! 404: pkts, td.tv_sec, td.tv_usec / 10000, ps); ! 405: if (bytes > 0) ! 406: printf ("; %d bytes/op for %.2f Kbytes/s", bytes, bs / 1024); ! 407: printf ("\n"); ! 408: } ! 409: ! 410: ! 411: static tvsub (tdiff, t1, t0) ! 412: register struct timeval *tdiff, ! 413: *t1, ! 414: *t0; ! 415: { ! 416: ! 417: tdiff -> tv_sec = t1 -> tv_sec - t0 -> tv_sec; ! 418: tdiff -> tv_usec = t1 -> tv_usec - t0 -> tv_usec; ! 419: if (tdiff -> tv_usec < 0) ! 420: tdiff -> tv_sec--, tdiff -> tv_usec += 1000000; ! 421: } ! 422: #else ! 423: long times (); ! 424: ! 425: ! 426: static timer (bytes, pkts) ! 427: int bytes, ! 428: pkts; ! 429: { ! 430: long ms; ! 431: float bs, ! 432: ps; ! 433: long stop, ! 434: td, ! 435: secs, ! 436: msecs; ! 437: struct tms tm; ! 438: static long start; ! 439: ! 440: if (pkts == 0) { ! 441: start = times (&tm); ! 442: return; ! 443: } ! 444: else ! 445: stop = times (&tm); ! 446: ! 447: td = stop - start; ! 448: secs = td / 60, msecs = (td % 60) * 1000 / 60; ! 449: ms = (secs * 1000) + msecs; ! 450: bs = (((float) bytes * pkts * NBBY * 1000) / (float) (ms ? ms : 1)) / NBBY; ! 451: ps = ((float) pkts * 1000) / (float) (ms ? ms : 1); ! 452: ! 453: printf ("%d operations in %d.%02d seconds (%.2f ops/s)", ! 454: pkts, secs, msecs / 10, ps); ! 455: if (bytes > 0) ! 456: printf ("; %d bytes/op for %.2f Kbytes/s", bytes, bs / 1024); ! 457: printf ("\n"); ! 458: } ! 459: #endif ! 460: #endif ! 461: ! 462: /* */ ! 463: ! 464: /* ARGSUSED */ ! 465: ! 466: static int timing_result (sd, id, dummy, result, roi) ! 467: int sd, ! 468: id, ! 469: dummy; ! 470: caddr_t result; ! 471: struct RoSAPindication *roi; ! 472: { ! 473: return OK; ! 474: } ! 475: ! 476: /* ERRORS */ ! 477: ! 478: void ros_adios (rop, event) ! 479: register struct RoSAPpreject *rop; ! 480: char *event; ! 481: { ! 482: ros_advise (rop, event); ! 483: ! 484: _exit (1); ! 485: } ! 486: ! 487: ! 488: void ros_advise (rop, event) ! 489: register struct RoSAPpreject *rop; ! 490: char *event; ! 491: { ! 492: char buffer[BUFSIZ]; ! 493: ! 494: if (rop -> rop_cc > 0) ! 495: (void) sprintf (buffer, "[%s] %*.*s", RoErrString (rop -> rop_reason), ! 496: rop -> rop_cc, rop -> rop_cc, rop -> rop_data); ! 497: else ! 498: (void) sprintf (buffer, "[%s]", RoErrString (rop -> rop_reason)); ! 499: ! 500: advise (NULLCP, "%s: %s", event, buffer); ! 501: } ! 502: ! 503: /* */ ! 504: ! 505: void acs_adios (aca, event) ! 506: register struct AcSAPabort *aca; ! 507: char *event; ! 508: { ! 509: acs_advise (aca, event); ! 510: ! 511: _exit (1); ! 512: } ! 513: ! 514: ! 515: void acs_advise (aca, event) ! 516: register struct AcSAPabort *aca; ! 517: char *event; ! 518: { ! 519: char buffer[BUFSIZ]; ! 520: ! 521: if (aca -> aca_cc > 0) ! 522: (void) sprintf (buffer, "[%s] %*.*s", ! 523: AcErrString (aca -> aca_reason), ! 524: aca -> aca_cc, aca -> aca_cc, aca -> aca_data); ! 525: else ! 526: (void) sprintf (buffer, "[%s]", AcErrString (aca -> aca_reason)); ! 527: ! 528: advise (NULLCP, "%s: %s (source %d)", event, buffer, ! 529: aca -> aca_source); ! 530: } ! 531: ! 532: /* */ ! 533: ! 534: #ifndef lint ! 535: void _advise (); ! 536: ! 537: ! 538: void adios (va_alist) ! 539: va_dcl ! 540: { ! 541: va_list ap; ! 542: ! 543: va_start (ap); ! 544: ! 545: _advise (ap); ! 546: ! 547: va_end (ap); ! 548: ! 549: _exit (1); ! 550: } ! 551: #else ! 552: /* VARARGS */ ! 553: ! 554: void adios (what, fmt) ! 555: char *what, ! 556: *fmt; ! 557: { ! 558: adios (what, fmt); ! 559: } ! 560: #endif ! 561: ! 562: ! 563: #ifndef lint ! 564: void advise (va_alist) ! 565: va_dcl ! 566: { ! 567: va_list ap; ! 568: ! 569: va_start (ap); ! 570: ! 571: _advise (ap); ! 572: ! 573: va_end (ap); ! 574: } ! 575: ! 576: ! 577: static void _advise (ap) ! 578: va_list ap; ! 579: { ! 580: char buffer[BUFSIZ]; ! 581: ! 582: asprintf (buffer, ap); ! 583: ! 584: (void) fflush (stdout); ! 585: ! 586: fprintf (stderr, "%s: ", myname); ! 587: (void) fputs (buffer, stderr); ! 588: (void) fputc ('\n', stderr); ! 589: ! 590: (void) fflush (stderr); ! 591: } ! 592: #else ! 593: /* VARARGS */ ! 594: ! 595: void advise (what, fmt) ! 596: char *what, ! 597: *fmt; ! 598: { ! 599: advise (what, fmt); ! 600: } ! 601: #endif ! 602: ! 603: ! 604: #ifndef lint ! 605: void ryr_advise (va_alist) ! 606: va_dcl ! 607: { ! 608: va_list ap; ! 609: ! 610: va_start (ap); ! 611: ! 612: _advise (ap); ! 613: ! 614: va_end (ap); ! 615: } ! 616: #else ! 617: /* VARARGS */ ! 618: ! 619: void ryr_advise (what, fmt) ! 620: char *what, ! 621: *fmt; ! 622: { ! 623: ryr_advise (what, fmt); ! 624: } ! 625: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.