Annotation of 43BSDReno/contrib/isode-beta/others/lookup/ryresponder.c, revision 1.1

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

unix.superglobalmegacorp.com

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