Annotation of 43BSDReno/contrib/isode-beta/others/idist/ryresponder.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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