Annotation of 43BSDReno/contrib/isode-beta/psap2-lpp/psaprelease1.c, revision 1.1.1.1

1.1       root        1: /* psaprelease1.c - PPM: initiate release */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/psap2-lpp/RCS/psaprelease1.c,v 7.2 90/07/01 21:05:28 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/psap2-lpp/RCS/psaprelease1.c,v 7.2 90/07/01 21:05:28 mrose Exp $
                      9:  *
                     10:  * Contributed by The Wollongong Group, Inc.
                     11:  *
                     12:  *
                     13:  * $Log:       psaprelease1.c,v $
                     14:  * Revision 7.2  90/07/01  21:05:28  mrose
                     15:  * pepsy
                     16:  * 
                     17:  * Revision 7.1  89/12/01  08:35:28  mrose
                     18:  * touch-up
                     19:  * 
                     20:  * Revision 7.0  89/11/23  22:15:56  mrose
                     21:  * Release 6.0
                     22:  * 
                     23:  */
                     24: 
                     25: /*
                     26:  *                               NOTICE
                     27:  *
                     28:  *    Acquisition, use, and distribution of this module and related
                     29:  *    materials are subject to the restrictions of a license agreement.
                     30:  *    Consult the Preface in the User's Manual for the full terms of
                     31:  *    this agreement.
                     32:  *
                     33:  */
                     34: 
                     35: 
                     36: /* LINTLIBRARY */
                     37: 
                     38: #include <stdio.h>
                     39: #include <signal.h>
                     40: #define        LPP
                     41: #include "PS-types.h"
                     42: #include "ppkt.h"
                     43: #include "tailor.h"
                     44: 
                     45: /*    P-RELEASE.REQUEST */
                     46: 
                     47: int    PRelRequest (sd, data, ndata, secs, pr, pi)
                     48: int    sd;
                     49: PE     *data;
                     50: int    ndata;
                     51: int    secs;
                     52: struct PSAPrelease *pr;
                     53: struct PSAPindication *pi;
                     54: {
                     55:     SBV            smask;
                     56:     int            result;
                     57:     register struct psapblk *pb;
                     58: 
                     59:     if (data == NULL || ndata <= 0 || data[0] == NULLPE || ndata > NPDATA_PS)
                     60:        return psaplose (pi, PC_PARAMETER, NULLCP, "bad release user data");
                     61:     if (data[0] -> pe_context != PCI_ACSE)
                     62:        return psaplose (pi, PC_PARAMETER, NULLCP,
                     63:                         "wrong context for release user data");
                     64:     if (secs != NOTOK)
                     65:        return psaplose (pi, PC_PARAMETER, NULLCP,
                     66:                         "asynchronous release not supported");
                     67:     missingP (pr);
                     68:     missingP (pi);
                     69: 
                     70:     smask = sigioblock ();
                     71: 
                     72:     psapPsig (pb, sd);
                     73: 
                     74:     if ((result = PRelRequestAux (pb, data[0], pr, pi)) == DONE)
                     75:        result = OK;
                     76:     else
                     77:        freepblk (pb);
                     78: 
                     79:     (void) sigiomask (smask);
                     80: 
                     81:     return result;
                     82: }
                     83: 
                     84: /*  */
                     85: 
                     86: static int  PRelRequestAux (pb, data, pr, pi)
                     87: register struct psapblk *pb;
                     88: PE     data;
                     89: struct PSAPrelease *pr;
                     90: struct PSAPindication *pi;
                     91: {
                     92:     int            result;
                     93:     PE     pe;
                     94:     PS     ps;
                     95:     struct type_PS_PDUs *pdu;
                     96:     register struct type_PS_ReleaseRequest__PDU *rr;
                     97: 
                     98:     pdu = NULL;
                     99:     if ((rr = (struct type_PS_ReleaseRequest__PDU *) malloc (sizeof *rr))
                    100:            == NULL) {
                    101:        result = psaplose (pi, PC_CONGEST, NULLCP, "out of memory");
                    102:        goto out;
                    103:     }
                    104:     rr -> reference = pb -> pb_reliability == LOW_QUALITY ? pb -> pb_reference
                    105:                                                          : NULLRF;
                    106:     rr -> user__data = data;
                    107: 
                    108:     result = encode_PS_ReleaseRequest__PDU (&pb -> pb_retry, 1, 0, NULLCP, rr);
                    109: 
                    110:     rr -> reference = NULL;
                    111:     rr -> user__data = NULLPE;
                    112:     free_PS_ReleaseRequest__PDU (rr);
                    113:     rr = NULL;
                    114: 
                    115:     if (result == NOTOK) {
                    116:        (void) psaplose (pi, PC_CONGEST, NULLCP, "error encoding PDU: %s",
                    117:                         PY_pepy);
                    118:        goto out;
                    119:     }
                    120: 
                    121:     switch (pb -> pb_reliability) {
                    122:        case HIGH_QUALITY:
                    123:        default:
                    124:            PLOGP (psap2_log,PS_PDUs, pb -> pb_retry,
                    125:                  "ReleaseRequest-PDU", 0);
                    126: 
                    127:            result = pe2ps (ps = pb -> pb_stream, pb -> pb_retry);
                    128: 
                    129:            pe_free (pb -> pb_retry);
                    130:            pb -> pb_retry = NULLPE;
                    131: 
                    132:            if (result == NOTOK
                    133:                    || (pb -> pb_response = ps2pe (ps)) == NULLPE) {
                    134:                result = pslose (pi, ps -> ps_errno);
                    135:                goto out;
                    136:            }
                    137:            break;
                    138: 
                    139:        case LOW_QUALITY:
                    140:            pb -> pb_tries = pb -> pb_maxtries;
                    141: 
                    142: again: ;
                    143:            for (;;) {
                    144:                switch ((*pb -> pb_retryfnx) (pb, PC_SESSION, pi)) {
                    145:                    case NOTOK:
                    146:                        result = NOTOK;
                    147:                        goto out;
                    148: 
                    149:                    case OK:
                    150:                        continue;
                    151: 
                    152:                    case DONE:
                    153:                    default:
                    154:                        break;
                    155:                }
                    156:                break;
                    157:            }
                    158: 
                    159:            pdu = NULL;
                    160:            break;
                    161:     }
                    162: 
                    163:     result = decode_PS_PDUs (pb -> pb_response, 1, NULLIP, NULLVP, &pdu);
                    164: 
                    165: #ifdef DEBUG
                    166:     if (result == OK && (psap2_log -> ll_events & LLOG_PDUS))
                    167:        pvpdu (psap2_log, print_PS_PDUs_P, pb -> pb_response, "PDU", 1);
                    168: #endif
                    169: 
                    170:     if (result == NOTOK) {
                    171:        if (pb -> pb_reliability == LOW_QUALITY)
                    172:            goto bad_ref;
                    173: 
                    174:        (void) ppktlose (pb, pi, PC_UNRECOGNIZED, NULLRF, NULLCP,
                    175:                         "error decoding PDU: %s", PY_pepy);
                    176:        goto out;
                    177:     }
                    178: 
                    179:     switch (pdu -> offset) {
                    180:        case type_PS_PDUs_releaseResponse:
                    181:        {
                    182:            register struct type_PS_ReleaseResponse__PDU *rp =
                    183:                                        pdu -> un.releaseResponse;
                    184: 
                    185:            if (pb -> pb_reliability == LOW_QUALITY
                    186:                    && refcmp (pb -> pb_reference, rp -> reference)) {
                    187:                (void) ppktlose (pb, pi, PC_SESSION, rp -> reference,
                    188:                                 NULLCP, "reference mismatch");
                    189: 
                    190: bad_ref: ;
                    191:                if (pdu)
                    192:                    free_PS_PDUs (pdu);
                    193:                goto again;
                    194:            }
                    195: 
                    196:            pe = rp -> user__data, rp -> user__data = NULLPE;
                    197: 
                    198:            pr -> pr_affirmative = 1;
                    199:            (pr -> pr_info[0] = pe) -> pe_context = PCI_ACSE;
                    200:            pr -> pr_ninfo = 1;
                    201: 
                    202:            result = OK;
                    203:        }
                    204:        break;
                    205: 
                    206:        case type_PS_PDUs_abort:
                    207:        {
                    208:            register struct PSAPabort *pa = &pi -> pi_abort;
                    209:            register struct type_PS_Abort__PDU *ab = pdu -> un.abort;
                    210: 
                    211:            if (pb -> pb_reliability == LOW_QUALITY
                    212:                    && refcmp (pb -> pb_reference, ab -> reference))
                    213:                goto bad_ref;
                    214: 
                    215:            if (ab -> reason) {
                    216:                switch (ab -> reason -> parm) {
                    217:                    case int_PS_Abort__reason_reason__not__specified:
                    218:                    default:
                    219:                        result = PC_NOTSPECIFIED;
                    220:                        break;
                    221: 
                    222:                    case int_PS_Abort__reason_unrecognized__ppdu:
                    223:                    case int_PS_Abort__reason_unexpected__ppdu:
                    224:                    case int_PS_Abort__reason_unrecognized__ppdu__parameter:
                    225:                        result = PC_UNRECOGNIZED
                    226:                                + (ab -> reason -> parm
                    227:                                    - int_PS_Abort__reason_unrecognized__ppdu);
                    228:                        break;
                    229: 
                    230:                    case int_PS_Abort__reason_invalid__ppdu__parameter:
                    231:                        result = PC_INVALID;
                    232:                        break;
                    233: 
                    234:                    case int_PS_Abort__reason_reference__mismatch:
                    235:                        result = PC_SESSION;
                    236:                        break;
                    237:                }
                    238:                result = psaplose (pi, result, NULLCP, NULLCP);
                    239:                break;
                    240:            }
                    241:            pe = ab -> user__data, ab -> user__data = NULLPE;
                    242: 
                    243:            pi -> pi_type = PI_ABORT;
                    244:            bzero ((char *) pa, sizeof *pa);
                    245: 
                    246:            pa -> pa_peer = 1;
                    247:            pa -> pa_reason = PC_ABORTED;
                    248:            (pa -> pa_info[0] = pe) -> pe_context = PCI_ACSE;
                    249:            pa -> pa_ninfo = 1;
                    250: 
                    251:            result = NOTOK;
                    252:        }
                    253:        break;
                    254: 
                    255:        default:
                    256:        /* this works 'cause the "reference" is always the FIRST element */
                    257:            result = ppktlose (pb, pi, PC_SESSION,
                    258:                               pdu -> un.connectResponse -> reference, NULLCP,
                    259:                               "unexpected PDU %d", pdu -> offset);
                    260:            break;
                    261:     }
                    262: 
                    263: out: ;
                    264:     if (pdu)
                    265:        free_PS_PDUs (pdu);
                    266:     if (rr)
                    267:        free_PS_ReleaseRequest__PDU (rr);
                    268: 
                    269:     return result;
                    270: }
                    271: 
                    272: /*  */
                    273: 
                    274: /* ARGSUSED */
                    275: 
                    276: int    PRelRetryRequest (sd, secs, pr, pi)
                    277: int    sd;
                    278: int    secs;
                    279: struct PSAPrelease *pr;
                    280: struct PSAPindication *pi;
                    281: {
                    282:     return psaplose (pi, PC_OPERATION, "release not in progress");
                    283: }

unix.superglobalmegacorp.com

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