Annotation of 43BSDReno/contrib/isode-beta/doc/manual/ryresp-assoc.c, revision 1.1

1.1     ! root        1: /* ryresponder.c - generic idempotent responder */
        !             2: 
        !             3: #include <stdio.h>
        !             4: #include <setjmp.h>
        !             5: #include "ryresponder.h"
        !             6: #include <isode/tsap.h>         /* for listening */
        !             7: 
        !             8: /* DATA */
        !             9: 
        !            10: int     debug = 0;
        !            11: 
        !            12: static LLog _pgm_log = {
        !            13:     "responder.log", NULLCP, NULLCP,
        !            14:     LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE, LLOG_FATAL, -1,
        !            15:     LLOGCLS | LLOGCRT | LLOGZER, NOTOK
        !            16: };
        !            17: LLog *pgm_log = &_pgm_log;
        !            18: 
        !            19: static char *myname = "ryresponder";
        !            20: 
        !            21: 
        !            22: static jmp_buf toplevel;
        !            23: 
        !            24: 
        !            25: static IFP      startfnx;
        !            26: static IFP      stopfnx;
        !            27: 
        !            28: int     ros_init (), ros_work (), ros_indication (), ros_lose ();
        !            29: 
        !            30: 
        !            31: extern int  errno;
        !            32: 
        !            33: /* RESPONDER */
        !            34: 
        !            35: int    ryresponder (argc, argv, host, myservice, mycontext,
        !            36:                      dispatches, ops, start, stop)
        !            37: int     argc;
        !            38: char  **argv,
        !            39:        *host,
        !            40:        *myservice,
        !            41:        *mycontext;
        !            42: struct dispatch *dispatches;
        !            43: struct RyOperation *ops;
        !            44: IFP     start,
        !            45:        stop;
        !            46: {
        !            47:     register struct dispatch   *ds;
        !            48:     AEI     aei;
        !            49:     struct TSAPdisconnect   tds;
        !            50:     struct TSAPdisconnect  *td = &tds;
        !            51:     struct RoSAPindication  rois;
        !            52:     register struct RoSAPindication *roi = &rois;
        !            53:     register struct RoSAPpreject   *rop = &roi -> roi_preject;
        !            54: 
        !            55:     if (myname = rindex (argv[0], '/'))
        !            56:        myname++;
        !            57:     if (myname == NULL || *myname == NULL)
        !            58:        myname = argv[0];
        !            59: 
        !            60:     isodetailor (myname, 0);
        !            61:     if (debug = isatty (fileno (stderr)))
        !            62:        ll_dbinit (pgm_log, myname);
        !            63:     else {
        !            64:        static char  myfile[BUFSIZ];
        !            65: 
        !            66:        (void) sprintf (myfile, "%s.log",
        !            67:                        (strncmp (myname, "ros.", 4)                    
        !            68:                                    && strncmp (myname, "lpp.", 4))
        !            69:                                || myname[4] == NULL
        !            70:                            ? myname : myname + 4);
        !            71:        pgm_log -> ll_file = myfile;
        !            72:        ll_hdinit (pgm_log, myname);
        !            73:     }
        !            74: 
        !            75:     advise (LLOG_NOTICE, NULLCP, "starting");
        !            76: 
        !            77:     if ((aei = _str2aei (host, myservice, mycontext, 0)) == NULLAEI)
        !            78:        adios (NULLCP, "unable to resolve service: %s", PY_pepy);
        !            79: 
        !            80:     for (ds = dispatches; ds -> ds_name; ds++)
        !            81:        if (RyDispatch (NOTOK, ops, ds -> ds_operation, ds -> ds_vector, roi)
        !            82:                == NOTOK)
        !            83:            ros_adios (rop, ds -> ds_name);
        !            84: 
        !            85:     startfnx = start;
        !            86:     stopfnx = stop;
        !            87: 
        !            88:     if (isodeserver (argc, argv, aei, ros_init, ros_work, ros_lose, td)
        !            89:            == NOTOK) {
        !            90:        if (td -> td_cc > 0)
        !            91:            adios (NULLCP, "isodeserver: [%s] %*.*s",
        !            92:                    TErrString (td -> td_reason),
        !            93:                    td -> td_cc, td -> td_cc, td -> td_data);
        !            94:        else
        !            95:            adios (NULLCP, "isodeserver: [%s]",
        !            96:                    TErrString (td -> td_reason));
        !            97:     }
        !            98: 
        !            99:     return 0;
        !           100: }
        !           101: 
        !           102: 
        !           103: static int  ros_init (vecp, vec)
        !           104: int    vecp;
        !           105: char  **vec;
        !           106: {
        !           107:     int            reply,
        !           108:            result,
        !           109:            sd;
        !           110:     struct AcSAPstart   acss;
        !           111:     register struct AcSAPstart *acs = &acss;
        !           112:     struct AcSAPindication  acis;
        !           113:     register struct AcSAPindication *aci = &acis;
        !           114:     register struct AcSAPabort   *aca = &aci -> aci_abort;
        !           115:     register struct PSAPstart *ps = &acs -> acs_start;
        !           116:     struct RoSAPindication  rois;
        !           117:     register struct RoSAPindication *roi = &rois;
        !           118:     register struct RoSAPpreject   *rop = &roi -> roi_preject;
        !           119: 
        !           120:     if (AcInit (vecp, vec, acs, aci) == NOTOK) {
        !           121:        acs_advise (aca, "initialization fails");
        !           122:        return NOTOK;
        !           123:     }
        !           124:     advise (LLOG_NOTICE, NULLCP,
        !           125:                "A-ASSOCIATE.INDICATION: <%d, %s, %s, %s, %d>",
        !           126:                acs -> acs_sd, oid2ode (acs -> acs_context),
        !           127:                sprintaei (&acs -> acs_callingtitle),
        !           128:                sprintaei (&acs -> acs_calledtitle), acs -> acs_ninfo);
        !           129: 
        !           130:     sd = acs -> acs_sd;
        !           131: 
        !           132:     for (vec++; *vec; vec++)
        !           133:        advise (LLOG_EXCEPTIONS, NULLCP, "unknown argument \"%s\"", *vec);
        !           134: 
        !           135:     reply = startfnx ? (*startfnx) (sd, acs) : ACS_ACCEPT;
        !           136: 
        !           137:     result = AcAssocResponse (sd, reply, reply != ACS_ACCEPT
        !           138:                              ? ACS_USER_NOREASON : ACS_USER_NULL,
        !           139:                NULLOID, NULLAEI,
        !           140:                NULLPA, NULLPC, ps -> ps_defctxresult,
        !           141:                ps -> ps_prequirements, ps -> ps_srequirements,
        !           142:                SERIAL_NONE, ps -> ps_settings, &ps -> ps_connect,
        !           143:                NULLPEP, 0, aci);
        !           144: 
        !           145:     ACSFREE (acs);
        !           146: 
        !           147:     if (result == NOTOK) {
        !           148:        acs_advise (aca, "A-ASSOCIATE.RESPONSE");
        !           149:        return NOTOK;
        !           150:     }
        !           151:     if (reply != ACS_ACCEPT)
        !           152:        return NOTOK;
        !           153: 
        !           154:     if (RoSetService (sd, RoPService, roi) == NOTOK)
        !           155:        ros_adios (rop, "set RO/PS fails");
        !           156: 
        !           157:     return sd;
        !           158: }
        !           159: 
        !           160: 
        !           161: static int  ros_work (fd)
        !           162: int    fd;
        !           163: {
        !           164:     int            result;
        !           165:     caddr_t out;
        !           166:     struct AcSAPindication  acis;
        !           167:     struct RoSAPindication  rois;
        !           168:     register struct RoSAPindication *roi = &rois;
        !           169:     register struct RoSAPpreject   *rop = &roi -> roi_preject;
        !           170: 
        !           171:     switch (setjmp (toplevel)) {
        !           172:        case OK: 
        !           173:            break;
        !           174: 
        !           175:        default: 
        !           176:            if (stopfnx)
        !           177:                (*stopfnx) (fd, (struct AcSAPfinish *) 0);
        !           178:        case DONE:
        !           179:            (void) AcUAbortRequest (fd, NULLPEP, 0, &acis);
        !           180:            (void) RyLose (fd, roi);
        !           181:            return NOTOK;
        !           182:     }
        !           183: 
        !           184:     switch (result = RyWait (fd, NULLIP, &out, OK, roi)) {
        !           185:        case NOTOK: 
        !           186:            if (rop -> rop_reason == ROS_TIMER)
        !           187:                break;
        !           188:        case OK: 
        !           189:        case DONE: 
        !           190:            ros_indication (fd, roi);
        !           191:            break;
        !           192: 
        !           193:        default: 
        !           194:            adios (NULLCP, "unknown return from RoWaitRequest=%d", result);
        !           195:     }
        !           196: 
        !           197:     return OK;
        !           198: }
        !           199: 
        !           200: 
        !           201: static int ros_indication (sd, roi)
        !           202: int    sd;
        !           203: register struct RoSAPindication *roi;
        !           204: {
        !           205:     int            reply,
        !           206:            result;
        !           207: 
        !           208:     switch (roi -> roi_type) {
        !           209:        case ROI_INVOKE: 
        !           210:        case ROI_RESULT: 
        !           211:        case ROI_ERROR: 
        !           212:            adios (NULLCP, "unexpected indication type=%d", roi -> roi_type);
        !           213:            break;
        !           214: 
        !           215:        case ROI_UREJECT: 
        !           216:            {
        !           217:                register struct RoSAPureject   *rou = &roi -> roi_ureject;
        !           218: 
        !           219:                if (rou -> rou_noid)
        !           220:                    advise (LLOG_EXCEPTIONS, NULLCP,
        !           221:                            "RO-REJECT-U.INDICATION/%d: %s",
        !           222:                            sd, RoErrString (rou -> rou_reason));
        !           223:                else
        !           224:                    advise (LLOG_EXCEPTIONS, NULLCP,
        !           225:                            "RO-REJECT-U.INDICATION/%d: %s (id=%d)",
        !           226:                            sd, RoErrString (rou -> rou_reason),
        !           227:                            rou -> rou_id);
        !           228:            }
        !           229:            break;
        !           230: 
        !           231:        case ROI_PREJECT: 
        !           232:            {
        !           233:                register struct RoSAPpreject   *rop = &roi -> roi_preject;
        !           234: 
        !           235:                if (ROS_FATAL (rop -> rop_reason))
        !           236:                    ros_adios (rop, "RO-REJECT-P.INDICATION");
        !           237:                ros_advise (rop, "RO-REJECT-P.INDICATION");
        !           238:            }
        !           239:            break;
        !           240: 
        !           241:        case ROI_FINISH: 
        !           242:            {
        !           243:                register struct AcSAPfinish *acf = &roi -> roi_finish;
        !           244:                struct AcSAPindication  acis;
        !           245:                register struct AcSAPabort *aca = &acis.aci_abort;
        !           246: 
        !           247:                advise (LLOG_NOTICE, NULLCP, "A-RELEASE.INDICATION/%d: %d",
        !           248:                        sd, acf -> acf_reason);
        !           249: 
        !           250:                reply = stopfnx ? (*stopfnx) (sd, acf) : ACS_ACCEPT;
        !           251: 
        !           252:                result = AcRelResponse (sd, reply, ACR_NORMAL, NULLPEP,
        !           253:                            0, &acis);
        !           254: 
        !           255:                ACFFREE (acf);
        !           256: 
        !           257:                if (result == NOTOK)
        !           258:                    acs_advise (aca, "A-RELEASE.RESPONSE");
        !           259:                else
        !           260:                    if (reply != ACS_ACCEPT)
        !           261:                        break;
        !           262:                longjmp (toplevel, DONE);
        !           263:            }
        !           264:        /* NOTREACHED */
        !           265: 
        !           266:        default: 
        !           267:            adios (NULLCP, "unknown indication type=%d", roi -> roi_type);
        !           268:     }
        !           269: }
        !           270: 
        !           271: 
        !           272: static int  ros_lose (td)
        !           273: struct TSAPdisconnect *td;
        !           274: {
        !           275:     if (td -> td_cc > 0)
        !           276:        adios (NULLCP, "TNetAccept: [%s] %*.*s",
        !           277:                TErrString (td -> td_reason), td -> td_cc, td -> td_cc,
        !           278:                td -> td_data);
        !           279:     else
        !           280:        adios (NULLCP, "TNetAccept: [%s]", TErrString (td -> td_reason));
        !           281: }
        !           282: 
        !           283: ...

unix.superglobalmegacorp.com

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