|
|
1.1 ! root 1: /* ryinitiator.c - generic interactive initiator */ ! 2: ! 3: #include <stdio.h> ! 4: #include <varargs.h> ! 5: #include "ryinitiator.h" ! 6: ! 7: /* DATA */ ! 8: ! 9: static char *myname = "ryinitiator"; ! 10: ! 11: ! 12: extern char *isodeversion; ! 13: ! 14: /* INITIATOR */ ! 15: ! 16: ryinitiator (argc, argv, myservice, mycontext, mypci, ops, dispatches, quit) ! 17: int argc; ! 18: char **argv, ! 19: *myservice, ! 20: *mycontext, ! 21: *mypci; ! 22: struct RyOperation ops[]; ! 23: struct dispatch *dispatches; ! 24: IFP quit; ! 25: { ! 26: int iloop, ! 27: sd; ! 28: char buffer[BUFSIZ], ! 29: *vec[NVEC + 1]; ! 30: register struct dispatch *ds; ! 31: struct SSAPref sfs; ! 32: register struct SSAPref *sf; ! 33: register struct PSAPaddr *pa; ! 34: struct AcSAPconnect accs; ! 35: register struct AcSAPconnect *acc = &accs; ! 36: struct AcSAPindication acis; ! 37: register struct AcSAPindication *aci = &acis; ! 38: register struct AcSAPabort *aca = &aci -> aci_abort; ! 39: AEI aei; ! 40: OID ctx, ! 41: pci; ! 42: struct PSAPctxlist pcs; ! 43: register struct PSAPctxlist *pc = &pcs; ! 44: struct RoSAPindication rois; ! 45: register struct RoSAPindication *roi = &rois; ! 46: register struct RoSAPpreject *rop = &roi -> roi_preject; ! 47: ! 48: if (myname = rindex (argv[0], '/')) ! 49: myname++; ! 50: if (myname == NULL || *myname == NULL) ! 51: myname = argv[0]; ! 52: ! 53: if (argc < 2) ! 54: adios (NULLCP, "usage: %s host [operation [ arguments ... ]]", myname); ! 55: ! 56: if ((aei = _str2aei (argv[1], myservice, mycontext, 0)) == NULLAEI) ! 57: adios (NULLCP, "unable to resolve service: %s", PY_pepy); ! 58: if ((pa = aei2addr (aei)) == NULLPA) ! 59: adios (NULLCP, "address translation failed"); ! 60: ! 61: if ((ctx = ode2oid (mycontext)) == NULLOID) ! 62: adios (NULLCP, "%s: unknown object descriptor", mycontext); ! 63: if ((ctx = oid_cpy (ctx)) == NULLOID) ! 64: adios (NULLCP, "out of memory"); ! 65: if ((pci = ode2oid (mypci)) == NULLOID) ! 66: adios (NULLCP, "%s: unknown object descriptor", mypci); ! 67: if ((pci = oid_cpy (pci)) == NULLOID) ! 68: adios (NULLCP, "out of memory"); ! 69: pc -> pc_nctx = 1; ! 70: pc -> pc_ctx[0].pc_id = 1; ! 71: pc -> pc_ctx[0].pc_asn = pci; ! 72: pc -> pc_ctx[0].pc_atn = NULLOID; ! 73: ! 74: if ((sf = addr2ref (PLocalHostName ())) == NULL) { ! 75: sf = &sfs; ! 76: (void) bzero ((char *) sf, sizeof *sf); ! 77: } ! 78: ! 79: if (argc < 3) { ! 80: printf ("%s", myname); ! 81: if (sf -> sr_ulen > 2) ! 82: printf (" running on host %s", sf -> sr_udata + 2); ! 83: if (sf -> sr_clen > 2) ! 84: printf (" at %s", sf -> sr_cdata + 2); ! 85: printf (" [%s, ", oid2ode (ctx)); ! 86: printf ("%s]\n", oid2ode (pci)); ! 87: printf ("using %s\n", isodeversion); ! 88: ! 89: printf ("%s... ", argv[1]); ! 90: (void) fflush (stdout); ! 91: ! 92: iloop = 1; ! 93: } ! 94: else { ! 95: for (ds = dispatches; ds -> ds_name; ds++) ! 96: if (strcmp (ds -> ds_name, argv[2]) == 0) ! 97: break; ! 98: if (ds -> ds_name == NULL) ! 99: adios (NULLCP, "unknown operation \"%s\"", argv[2]); ! 100: ! 101: iloop = 0; ! 102: } ! 103: ! 104: if (AcAssocRequest (ctx, NULLAEI, aei, NULLPA, pa, pc, NULLOID, ! 105: 0, ROS_MYREQUIRE, SERIAL_NONE, 0, sf, NULLPEP, 0, NULLQOS, ! 106: acc, aci) ! 107: == NOTOK) ! 108: acs_adios (aca, "A-ASSOCIATE.REQUEST"); ! 109: ! 110: if (acc -> acc_result != ACS_ACCEPT) { ! 111: if (iloop) ! 112: printf ("failed\n"); ! 113: ! 114: adios (NULLCP, "association rejected: [%s]", ! 115: AcErrString (acc -> acc_result)); ! 116: } ! 117: if (iloop) { ! 118: printf ("connected\n"); ! 119: (void) fflush (stdout); ! 120: } ! 121: ! 122: sd = acc -> acc_sd; ! 123: ACCFREE (acc); ! 124: ! 125: if (RoSetService (sd, RoPService, roi) == NOTOK) ! 126: ros_adios (rop, "set RO/PS fails"); ! 127: ! 128: if (iloop) { ! 129: for (;;) { ! 130: if (getline (buffer) == NOTOK) ! 131: break; ! 132: ! 133: if (str2vec (buffer, vec) < 1) ! 134: continue; ! 135: ! 136: for (ds = dispatches; ds -> ds_name; ds++) ! 137: if (strcmp (ds -> ds_name, vec[0]) == 0) ! 138: break; ! 139: if (ds -> ds_name == NULL) { ! 140: advise (NULLCP, "unknown operation \"%s\"", vec[0]); ! 141: continue; ! 142: } ! 143: ! 144: invoke (sd, ops, ds, vec + 1); ! 145: } ! 146: } ! 147: else ! 148: invoke (sd, ops, ds, argv + 3); ! 149: ! 150: (*quit) (sd, (struct dispatch *) NULL, (char **) NULL, (caddr_t *) NULL); ! 151: } ! 152: ! 153: /* */ ! 154: ! 155: static invoke (sd, ops, ds, args) ! 156: int sd; ! 157: struct RyOperation ops[]; ! 158: register struct dispatch *ds; ! 159: char **args; ! 160: { ! 161: int result; ! 162: caddr_t in; ! 163: struct RoSAPindication rois; ! 164: register struct RoSAPindication *roi = &rois; ! 165: register struct RoSAPpreject *rop = &roi -> roi_preject; ! 166: ! 167: in = NULL; ! 168: if (ds -> ds_argument && (*ds -> ds_argument) (sd, ds, args, &in) == NOTOK) ! 169: return; ! 170: ! 171: switch (result = RyStub (sd, ops, ds -> ds_operation, RyGenID (sd), NULLIP, ! 172: in, ds -> ds_result, ds -> ds_error, ROS_SYNC, roi)) { ! 173: case NOTOK: /* failure */ ! 174: if (ROS_FATAL (rop -> rop_reason)) ! 175: ros_adios (rop, "STUB"); ! 176: ros_advise (rop, "STUB"); ! 177: break; ! 178: ! 179: case OK: /* got a result/error response */ ! 180: break; ! 181: ! 182: case DONE: /* got RO-END? */ ! 183: adios (NULLCP, "got RO-END.INDICATION"); ! 184: /* NOTREACHED */ ! 185: ! 186: default: ! 187: adios (NULLCP, "unknown return from RyStub=%d", result); ! 188: /* NOTREACHED */ ! 189: } ! 190: ! 191: if (ds -> ds_free && in) ! 192: (void) (*ds -> ds_free) (in); ! 193: } ! 194: ! 195: /* */ ! 196: ! 197: static int getline (buffer) ! 198: char *buffer; ! 199: { ! 200: register int i; ! 201: register char *cp, ! 202: *ep; ! 203: static int sticky = 0; ! 204: ! 205: if (sticky) { ! 206: sticky = 0; ! 207: return NOTOK; ! 208: } ! 209: ! 210: printf ("%s> ", myname); ! 211: (void) fflush (stdout); ! 212: ! 213: for (ep = (cp = buffer) + BUFSIZ - 1; (i = getchar ()) != '\n';) { ! 214: if (i == EOF) { ! 215: printf ("\n"); ! 216: clearerr (stdin); ! 217: if (cp != buffer) { ! 218: sticky++; ! 219: break; ! 220: } ! 221: ! 222: return NOTOK; ! 223: } ! 224: ! 225: if (cp < ep) ! 226: *cp++ = i; ! 227: } ! 228: *cp = NULL; ! 229: ! 230: return OK; ! 231: } ! 232: ! 233: /* */ ! 234: ! 235: void ros_adios (rop, event) ! 236: register struct RoSAPpreject *rop; ! 237: char *event; ! 238: { ! 239: ros_advise (rop, event); ! 240: ! 241: _exit (1); ! 242: } ! 243: ! 244: ! 245: void ros_advise (rop, event) ! 246: register struct RoSAPpreject *rop; ! 247: char *event; ! 248: { ! 249: char buffer[BUFSIZ]; ! 250: ! 251: if (rop -> rop_cc > 0) ! 252: (void) sprintf (buffer, "[%s] %*.*s", RoErrString (rop -> rop_reason), ! 253: rop -> rop_cc, rop -> rop_cc, rop -> rop_data); ! 254: else ! 255: (void) sprintf (buffer, "[%s]", RoErrString (rop -> rop_reason)); ! 256: ! 257: advise (NULLCP, "%s: %s", event, buffer); ! 258: } ! 259: ! 260: /* */ ! 261: ! 262: void acs_adios (aca, event) ! 263: register struct AcSAPabort *aca; ! 264: char *event; ! 265: { ! 266: acs_advise (aca, event); ! 267: ! 268: _exit (1); ! 269: } ! 270: ! 271: ! 272: void acs_advise (aca, event) ! 273: register struct AcSAPabort *aca; ! 274: char *event; ! 275: { ! 276: char buffer[BUFSIZ]; ! 277: ! 278: if (aca -> aca_cc > 0) ! 279: (void) sprintf (buffer, "[%s] %*.*s", ! 280: AcErrString (aca -> aca_reason), ! 281: aca -> aca_cc, aca -> aca_cc, aca -> aca_data); ! 282: else ! 283: (void) sprintf (buffer, "[%s]", AcErrString (aca -> aca_reason)); ! 284: ! 285: advise (NULLCP, "%s: %s (source %d)", event, buffer, ! 286: aca -> aca_source); ! 287: } ! 288: ! 289: /* */ ! 290: ! 291: #ifndef lint ! 292: void _advise (); ! 293: ! 294: ! 295: void adios (va_alist) ! 296: va_dcl ! 297: { ! 298: va_list ap; ! 299: ! 300: va_start (ap); ! 301: ! 302: _advise (ap); ! 303: ! 304: va_end (ap); ! 305: ! 306: _exit (1); ! 307: } ! 308: #else ! 309: /* VARARGS */ ! 310: ! 311: void adios (what, fmt) ! 312: char *what, ! 313: *fmt; ! 314: { ! 315: adios (what, fmt); ! 316: } ! 317: #endif ! 318: ! 319: ! 320: #ifndef lint ! 321: void advise (va_alist) ! 322: va_dcl ! 323: { ! 324: va_list ap; ! 325: ! 326: va_start (ap); ! 327: ! 328: _advise (ap); ! 329: ! 330: va_end (ap); ! 331: } ! 332: ! 333: ! 334: static void _advise (ap) ! 335: va_list ap; ! 336: { ! 337: char buffer[BUFSIZ]; ! 338: ! 339: asprintf (buffer, ap); ! 340: ! 341: (void) fflush (stdout); ! 342: ! 343: fprintf (stderr, "%s: ", myname); ! 344: (void) fputs (buffer, stderr); ! 345: (void) fputc ('\n', stderr); ! 346: ! 347: (void) fflush (stderr); ! 348: } ! 349: #else ! 350: /* VARARGS */ ! 351: ! 352: void advise (what, fmt) ! 353: char *what, ! 354: *fmt; ! 355: { ! 356: advise (what, fmt); ! 357: } ! 358: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.