Annotation of 43BSDReno/contrib/isode-beta/others/idist/ryinitiator.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.