|
|
1.1 ! root 1: /* ryinitiator.c - remote association initiator */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/others/idist/RCS/ryinitiator.c,v 7.2 90/07/09 14:39:25 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/others/idist/RCS/ryinitiator.c,v 7.2 90/07/09 14:39:25 mrose Exp $ ! 9: * ! 10: * Severely hacked to give embedded functionality for client. ! 11: * ! 12: * Julian Onions <[email protected]> ! 13: * Nottingham University Computer Science ! 14: * ! 15: * ! 16: * $Log: ryinitiator.c,v $ ! 17: * Revision 7.2 90/07/09 14:39:25 mrose ! 18: * sync ! 19: * ! 20: * Revision 7.1 90/07/01 21:04:19 mrose ! 21: * pepsy ! 22: * ! 23: * Revision 7.0 89/11/23 21:58:41 mrose ! 24: * Release 6.0 ! 25: * ! 26: */ ! 27: ! 28: #include <stdio.h> ! 29: #include <varargs.h> ! 30: #include "Idist-ops.h" ! 31: #include "Idist-types.h" ! 32: #include "defs.h" ! 33: ! 34: /* DATA */ ! 35: ! 36: void adios (), advise (), ros_adios (), ros_advise (), ! 37: acs_advise (), acs_adios (); ! 38: ! 39: char *getstring (); ! 40: ! 41: static char *myservice = "isode idist"; ! 42: ! 43: static char *mycontext = "isode idist"; ! 44: static char *mypci = "isode idist pci"; ! 45: ! 46: ! 47: extern char *isodeversion; ! 48: ! 49: static int ryconnect (); ! 50: ! 51: /* INITIATOR */ ! 52: ! 53: makeconn (thehost) ! 54: char *thehost; ! 55: { ! 56: int result; ! 57: PE data; ! 58: struct type_Idist_Initiate *initial; ! 59: char *cp; ! 60: char buf[BUFSIZ]; ! 61: char ruser[128], *rhost; ! 62: static char lasthost[BUFSIZ]; ! 63: ! 64: if (lasthost[0] != 0) { ! 65: if (strcmp (thehost, lasthost) == 0) ! 66: return 1; ! 67: closeconn (); ! 68: } ! 69: ! 70: (void) strcpy (lasthost, thehost); ! 71: ! 72: if ((initial = (struct type_Idist_Initiate *) ! 73: malloc (sizeof *initial)) == NULL) ! 74: adios ("memory", "out of"); ! 75: ! 76: initial -> version = VERSION; ! 77: ! 78: if (cp = index(thehost, '@')) { ! 79: rhost = cp + 1; ! 80: (void) strncpy (ruser, thehost, cp - thehost); ! 81: ruser[cp - thehost] = 0; ! 82: } ! 83: else { ! 84: (void) strcpy (ruser, user); ! 85: rhost = thehost; ! 86: } ! 87: if (!qflag) ! 88: printf ("updating host %s\n", rhost); ! 89: (void) sprintf (buf, "user (%s:%s): ", rhost, ruser); ! 90: cp = getstring (buf); ! 91: if (cp == NULL) ! 92: cp = ruser; ! 93: initial -> user = str2qb (cp, strlen (cp), 1); ! 94: ! 95: (void) sprintf (buf, "password (%s:%s): ", rhost, cp); ! 96: cp = getpassword (buf); ! 97: ! 98: initial -> passwd = str2qb (cp, strlen(cp), 1); ! 99: bzero (cp, strlen (cp)); /* in case of cores */ ! 100: ! 101: if (encode_Idist_Initiate (&data, 1, 0, NULLCP, initial) == NOTOK) { ! 102: advise (NULLCP, "Error encoding data"); ! 103: return 0; ! 104: } ! 105: data -> pe_context = 3; /* hack */ ! 106: ! 107: result = ryconnect (rhost, data, myservice, mycontext, mypci); ! 108: ! 109: free_Idist_Initiate (initial); ! 110: ! 111: return result == OK ? 1 : 0; ! 112: } ! 113: ! 114: ! 115: static int ry_sd = NOTOK; ! 116: ! 117: static int ryconnect (thehost, data, theservice, thecontext, thepci) ! 118: char *thehost, ! 119: *theservice, ! 120: *thecontext, ! 121: *thepci; ! 122: PE data; ! 123: { ! 124: struct SSAPref sfs; ! 125: register struct SSAPref *sf; ! 126: register struct PSAPaddr *pa; ! 127: struct AcSAPconnect accs; ! 128: register struct AcSAPconnect *acc = &accs; ! 129: struct AcSAPindication acis; ! 130: register struct AcSAPindication *aci = &acis; ! 131: register struct AcSAPabort *aca = &aci -> aci_abort; ! 132: AEI aei; ! 133: OID ctx, ! 134: pci; ! 135: struct PSAPctxlist pcs; ! 136: register struct PSAPctxlist *pc = &pcs; ! 137: struct RoSAPindication rois; ! 138: register struct RoSAPindication *roi = &rois; ! 139: register struct RoSAPpreject *rop = &roi -> roi_preject; ! 140: ! 141: if ((aei = _str2aei (thehost, theservice, thecontext, 0)) == NULLAEI) ! 142: adios (NULLCP, "unable to resolve service: %s", PY_pepy); ! 143: if ((pa = aei2addr (aei)) == NULLPA) ! 144: adios (NULLCP, "address translation failed"); ! 145: ! 146: if ((ctx = ode2oid (thecontext)) == NULLOID) ! 147: adios (NULLCP, "%s: unknown object descriptor", thecontext); ! 148: if ((ctx = oid_cpy (ctx)) == NULLOID) ! 149: adios (NULLCP, "out of memory"); ! 150: if ((pci = ode2oid (thepci)) == NULLOID) ! 151: adios (NULLCP, "%s: unknown object descriptor", thepci); ! 152: if ((pci = oid_cpy (pci)) == NULLOID) ! 153: adios (NULLCP, "out of memory"); ! 154: pc -> pc_nctx = 1; ! 155: pc -> pc_ctx[0].pc_id = 1; ! 156: pc -> pc_ctx[0].pc_asn = pci; ! 157: pc -> pc_ctx[0].pc_atn = NULLOID; ! 158: ! 159: if ((sf = addr2ref (PLocalHostName ())) == NULL) { ! 160: sf = &sfs; ! 161: (void) bzero ((char *) sf, sizeof *sf); ! 162: } ! 163: ! 164: if (AcAssocRequest (ctx, NULLAEI, aei, NULLPA, pa, pc, NULLOID, ! 165: 0, ROS_MYREQUIRE, SERIAL_NONE, 0, sf, &data, 1, NULLQOS, ! 166: acc, aci) ! 167: == NOTOK) ! 168: acs_adios (aca, "A-ASSOCIATE.REQUEST"); ! 169: ! 170: if (acc -> acc_result != ACS_ACCEPT) { ! 171: int slen; ! 172: char *str; ! 173: ! 174: if (acc -> acc_ninfo > 0 && (str = prim2str(acc->acc_info[0], &slen))) ! 175: adios (NULLCP, "association rejected: [%s] %*.*s", ! 176: AcErrString (acc -> acc_result), ! 177: slen, slen, str); ! 178: else ! 179: adios (NULLCP, "association rejected: [%s]", ! 180: AcErrString (acc -> acc_result)); ! 181: } ! 182: ! 183: ry_sd = acc -> acc_sd; ! 184: ACCFREE (acc); ! 185: ! 186: if (RoSetService (ry_sd, RoPService, roi) == NOTOK) ! 187: ros_adios (rop, "set RO/PS fails"); ! 188: return OK; ! 189: } ! 190: ! 191: closeconn () ! 192: { ! 193: struct AcSAPrelease acrs; ! 194: register struct AcSAPrelease *acr = &acrs; ! 195: struct AcSAPindication acis; ! 196: register struct AcSAPindication *aci = &acis; ! 197: register struct AcSAPabort *aca = &aci -> aci_abort; ! 198: ! 199: if (ry_sd == NOTOK) ! 200: return; ! 201: ! 202: if (AcRelRequest (ry_sd, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK) ! 203: acs_adios (aca, "A-RELEASE.REQUEST"); ! 204: ! 205: if (!acr -> acr_affirmative) { ! 206: (void) AcUAbortRequest (ry_sd, NULLPEP, 0, aci); ! 207: adios (NULLCP, "release rejected by peer: %d", acr -> acr_reason); ! 208: } ! 209: ! 210: ACRFREE (acr); ! 211: } ! 212: ! 213: /* */ ! 214: ! 215: invoke (op, arg, mod, ind, rfx, efx) ! 216: int op; ! 217: modtyp *mod; /* encoding/decoding table for Idist */ ! 218: int ind; /* index of this type in tables */ ! 219: caddr_t arg; ! 220: IFP rfx, efx; ! 221: { ! 222: int result; ! 223: struct RoSAPindication rois; ! 224: register struct RoSAPindication *roi = &rois; ! 225: register struct RoSAPpreject *rop = &roi -> roi_preject; ! 226: extern int result_value; ! 227: ! 228: switch (result = RyStub (ry_sd, table_Idist_Operations, op, ! 229: RyGenID (ry_sd), NULLIP, arg, rfx, efx, ! 230: ROS_SYNC, roi)) { ! 231: case NOTOK: /* failure */ ! 232: if (ROS_FATAL (rop -> rop_reason)) ! 233: ros_adios (rop, "STUB"); ! 234: ros_advise (rop, "STUB"); ! 235: break; ! 236: ! 237: case OK: /* got a result/error response */ ! 238: break; ! 239: ! 240: case DONE: /* got RO-END? */ ! 241: adios (NULLCP, "got RO-END.INDICATION"); ! 242: /* NOTREACHED */ ! 243: ! 244: default: ! 245: adios (NULLCP, "unknown return from RyStub=%d", result); ! 246: /* NOTREACHED */ ! 247: } ! 248: ! 249: if (mod && ind >= 0 && arg) ! 250: fre_obj(arg, mod->md_dtab[ind], mod); ! 251: return result_value; ! 252: } ! 253: ! 254: /* */ ! 255: ! 256: /* */ ! 257: ! 258: void ros_adios (rop, event) ! 259: register struct RoSAPpreject *rop; ! 260: char *event; ! 261: { ! 262: ros_advise (rop, event); ! 263: ! 264: cleanup (); ! 265: ! 266: _exit (1); ! 267: } ! 268: ! 269: ! 270: void ros_advise (rop, event) ! 271: register struct RoSAPpreject *rop; ! 272: char *event; ! 273: { ! 274: char buffer[BUFSIZ]; ! 275: ! 276: if (rop -> rop_cc > 0) ! 277: (void) sprintf (buffer, "[%s] %*.*s", RoErrString (rop -> rop_reason), ! 278: rop -> rop_cc, rop -> rop_cc, rop -> rop_data); ! 279: else ! 280: (void) sprintf (buffer, "[%s]", RoErrString (rop -> rop_reason)); ! 281: ! 282: advise (NULLCP, "%s: %s", event, buffer); ! 283: } ! 284: ! 285: /* */ ! 286: ! 287: void acs_adios (aca, event) ! 288: register struct AcSAPabort *aca; ! 289: char *event; ! 290: { ! 291: acs_advise (aca, event); ! 292: ! 293: cleanup (); ! 294: _exit (1); ! 295: } ! 296: ! 297: ! 298: void acs_advise (aca, event) ! 299: register struct AcSAPabort *aca; ! 300: char *event; ! 301: { ! 302: char buffer[BUFSIZ]; ! 303: ! 304: if (aca -> aca_cc > 0) ! 305: (void) sprintf (buffer, "[%s] %*.*s", ! 306: AcErrString (aca -> aca_reason), ! 307: aca -> aca_cc, aca -> aca_cc, aca -> aca_data); ! 308: else ! 309: (void) sprintf (buffer, "[%s]", AcErrString (aca -> aca_reason)); ! 310: ! 311: advise (NULLCP, "%s: %s (source %d)", event, buffer, ! 312: aca -> aca_source); ! 313: } ! 314: ! 315: /* */ ! 316: ! 317: #ifndef lint ! 318: void _advise (); ! 319: ! 320: ! 321: void adios (va_alist) ! 322: va_dcl ! 323: { ! 324: va_list ap; ! 325: ! 326: va_start (ap); ! 327: ! 328: _advise (ap); ! 329: ! 330: cleanup (); ! 331: ! 332: va_end (ap); ! 333: ! 334: _exit (1); ! 335: } ! 336: #else ! 337: /* VARARGS */ ! 338: ! 339: void adios (what, fmt) ! 340: char *what, ! 341: *fmt; ! 342: { ! 343: adios (what, fmt); ! 344: } ! 345: #endif ! 346: ! 347: ! 348: #ifndef lint ! 349: void advise (va_alist) ! 350: va_dcl ! 351: { ! 352: va_list ap; ! 353: ! 354: va_start (ap); ! 355: ! 356: _advise (ap); ! 357: ! 358: va_end (ap); ! 359: } ! 360: ! 361: ! 362: static void _advise (ap) ! 363: va_list ap; ! 364: { ! 365: char buffer[BUFSIZ]; ! 366: ! 367: asprintf (buffer, ap); ! 368: ! 369: (void) fflush (stdout); ! 370: ! 371: fprintf (stderr, "%s: ", myname); ! 372: (void) fputs (buffer, stderr); ! 373: (void) fputc ('\n', stderr); ! 374: ! 375: (void) fflush (stderr); ! 376: } ! 377: #else ! 378: /* VARARGS */ ! 379: ! 380: void advise (what, fmt) ! 381: char *what, ! 382: *fmt; ! 383: { ! 384: advise (what, fmt); ! 385: } ! 386: #endif ! 387: ! 388: ! 389: #ifndef lint ! 390: void ryr_advise (va_alist) ! 391: va_dcl ! 392: { ! 393: va_list ap; ! 394: ! 395: va_start (ap); ! 396: ! 397: _advise (ap); ! 398: ! 399: va_end (ap); ! 400: } ! 401: #else ! 402: /* VARARGS */ ! 403: ! 404: void ryr_advise (what, fmt) ! 405: char *what, ! 406: *fmt; ! 407: { ! 408: ryr_advise (what, fmt); ! 409: } ! 410: #endif ! 411: ! 412: char *getstring (prompt) ! 413: char *prompt; ! 414: { ! 415: static char buffer[BUFSIZ]; ! 416: char *cp; ! 417: ! 418: fputs (prompt, stdout); ! 419: (void) fflush (stdout); ! 420: ! 421: if (fgets (buffer, sizeof buffer, stdin) == NULL) ! 422: return NULLCP; ! 423: ! 424: if (cp = index (buffer, '\n')) ! 425: *cp = '\0'; ! 426: if (buffer[0] == '\0') ! 427: return NULLCP; ! 428: return buffer; ! 429: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.