Annotation of 43BSDReno/contrib/isode-beta/ssap/ssaprelease1.c, revision 1.1

1.1     ! root        1: /* ssaprelease1.c - SPM: initiate release */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/ssap/RCS/ssaprelease1.c,v 7.0 89/11/23 22:25:34 mrose Rel $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/ssap/RCS/ssaprelease1.c,v 7.0 89/11/23 22:25:34 mrose Rel $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       ssaprelease1.c,v $
        !            12:  * Revision 7.0  89/11/23  22:25:34  mrose
        !            13:  * Release 6.0
        !            14:  * 
        !            15:  */
        !            16: 
        !            17: /*
        !            18:  *                               NOTICE
        !            19:  *
        !            20:  *    Acquisition, use, and distribution of this module and related
        !            21:  *    materials are subject to the restrictions of a license agreement.
        !            22:  *    Consult the Preface in the User's Manual for the full terms of
        !            23:  *    this agreement.
        !            24:  *
        !            25:  */
        !            26: 
        !            27: 
        !            28: /* LINTLIBRARY */
        !            29: 
        !            30: #include <stdio.h>
        !            31: #include <signal.h>
        !            32: #include "spkt.h"
        !            33: 
        !            34: /*    S-RELEASE.REQUEST */
        !            35: 
        !            36: int    SRelRequest (sd, data, cc, secs, sr, si)
        !            37: int    sd;
        !            38: char   *data;
        !            39: int    cc;
        !            40: int    secs;
        !            41: struct SSAPrelease *sr;
        !            42: struct SSAPindication *si;
        !            43: {
        !            44:     SBV            smask;
        !            45:     int     result;
        !            46:     register struct ssapblk *sb;
        !            47: 
        !            48:     missingP (sr);
        !            49:     missingP (si);
        !            50: 
        !            51:     smask = sigioblock ();
        !            52: 
        !            53:     ssapPsig (sb, sd);
        !            54:     toomuchP (sb, data, cc, SF_SIZE, "release");
        !            55: 
        !            56:     result = SRelRequestAux (sb, data, cc, secs, sr, si);
        !            57: 
        !            58:     (void) sigiomask (smask);
        !            59: 
        !            60:     return result;
        !            61: }
        !            62: 
        !            63: /*  */
        !            64: 
        !            65: #define        dotoken(requires,shift,bit,type) \
        !            66: { \
        !            67:     if ((sb -> sb_requirements & requires) && !(sb -> sb_owned & bit)) \
        !            68:        return ssaplose (si, SC_OPERATION, NULLCP, \
        !            69:                    "%s token not owned by you", type); \
        !            70: }
        !            71: 
        !            72: 
        !            73: static int  SRelRequestAux (sb, data, cc, secs, sr, si)
        !            74: register struct ssapblk *sb;
        !            75: char   *data;
        !            76: int    cc;
        !            77: int    secs;
        !            78: struct SSAPrelease *sr;
        !            79: struct SSAPindication *si;
        !            80: {
        !            81:     register struct ssapkt *s;
        !            82: 
        !            83:     dotokens ();
        !            84: 
        !            85:     if (sb -> sb_flags & SB_CD)
        !            86:        return ssaplose (si, SC_OPERATION, NULLCP,
        !            87:                "capability data request in progress");
        !            88:     if (sb -> sb_flags & SB_CDA)
        !            89:        return ssaplose (si, SC_OPERATION, NULLCP,
        !            90:                "awaiting your capability data response");
        !            91:     if (sb -> sb_flags & SB_GTC)
        !            92:        return ssaplose (si, SC_OPERATION, NULLCP,
        !            93:                "give control request in progress");
        !            94:     if (sb -> sb_flags & SB_MAA)
        !            95:        return ssaplose (si, SC_OPERATION, "awaiting your majorsync response");
        !            96:     if (sb -> sb_flags & SB_RELEASE)
        !            97:        return ssaplose (si, SC_OPERATION, "release already in progress");
        !            98: 
        !            99:     if (sb -> sb_xspdu || sb -> sb_spdu)
        !           100:        return ssaplose (si, SC_WAITING, NULLCP, NULLCP);
        !           101: 
        !           102:     if ((s = newspkt (SPDU_FN)) == NULL)
        !           103:        return ssaplose (si, SC_CONGEST, NULLCP, "out of memory");
        !           104:     if (cc > 0) {
        !           105:        s -> s_mask |= SMASK_UDATA_PGI;
        !           106:        s -> s_udata = data, s -> s_ulen = cc;
        !           107:     }
        !           108:     else
        !           109:        s -> s_udata = NULL, s -> s_ulen = 0;
        !           110: 
        !           111:     sb -> sb_retry = s;
        !           112: 
        !           113:     return SRelRetryRequestAux (sb, secs, sr, si);
        !           114: }
        !           115: 
        !           116: #undef dotoken
        !           117: 
        !           118: /*    S-RELEASE-RETRY.REQUEST (pseudo) */
        !           119: 
        !           120: int    SRelRetryRequest (sd, secs, sr, si)
        !           121: int    sd;
        !           122: int    secs;
        !           123: struct SSAPrelease *sr;
        !           124: struct SSAPindication *si;
        !           125: {
        !           126:     SBV            smask;
        !           127:     int            result;
        !           128:     register struct ssapblk *sb;
        !           129: 
        !           130:     missingP (sr);
        !           131:     missingP (si);
        !           132: 
        !           133:     smask = sigioblock ();
        !           134: 
        !           135:     if ((sb = findsblk (sd)) == NULL)
        !           136:        result = ssaplose (si, SC_PARAMETER, NULLCP,
        !           137:                           "invalid session descriptor");
        !           138:     else
        !           139:        if (!(sb -> sb_flags & SB_RELEASE))
        !           140:            result = ssaplose (si, SC_OPERATION, "release not in progress");
        !           141:        else
        !           142:            result = SRelRetryRequestAux (sb, secs, sr, si);
        !           143: 
        !           144:     (void) sigiomask (smask);
        !           145: 
        !           146:     return result;
        !           147: }
        !           148: 
        !           149: /*  */
        !           150: 
        !           151: static int  SRelRetryRequestAux (sb, secs, sr, si)
        !           152: register struct ssapblk *sb;
        !           153: int    secs;
        !           154: struct SSAPrelease *sr;
        !           155: struct SSAPindication *si;
        !           156: {
        !           157:     int            code,
        !           158:            result;
        !           159:     register struct ssapkt *s;
        !           160: 
        !           161:     if (sb -> sb_flags & SB_RELEASE)
        !           162:        goto waiting;
        !           163: 
        !           164:     code = SPDU_FN;
        !           165: 
        !           166: again: ;
        !           167:     if (((s = sb -> sb_retry) -> s_code = code) == SPDU_FN) {
        !           168:        s -> s_mask |= SMASK_FN_DISC;
        !           169:        s -> s_fn_disconnect = FN_DISC_RELEASE;
        !           170:     }
        !           171: 
        !           172:     result = spkt2sd (s, sb -> sb_fd, 0, si);
        !           173: 
        !           174:     if (s -> s_code == SPDU_FN) {
        !           175:        s -> s_mask &= ~(SMASK_UDATA_PGI | SMASK_FN_DISC);
        !           176:        s -> s_udata = NULL, s -> s_ulen = 0;
        !           177:        s -> s_fn_disconnect = 0;
        !           178:     }
        !           179: 
        !           180:     if (result == NOTOK)
        !           181:        goto out1;
        !           182: 
        !           183: waiting: ;
        !           184:     if ((s = sb2spkt (sb, si, secs, NULLTX)) == NULL) {
        !           185:        register struct SSAPabort  *sa = &si -> si_abort;
        !           186:        
        !           187:        if (sa -> sa_reason == SC_TIMER) {
        !           188:            sb -> sb_flags |= SB_RELEASE;
        !           189: 
        !           190:            return NOTOK;
        !           191:        }
        !           192: 
        !           193:        goto out2;
        !           194:     }
        !           195: 
        !           196:     bzero ((char *) sr, sizeof *sr);
        !           197:     switch (s -> s_code) {
        !           198:        case SPDU_FN: 
        !           199:            freespkt (s);
        !           200:            code = SPDU_DN;
        !           201:            goto again;     
        !           202: 
        !           203:        case SPDU_DN: 
        !           204:            sr -> sr_affirmative = 1;
        !           205:            copySPKTdata (s, sr);
        !           206:            freespkt (s);
        !           207:            freesblk (sb);
        !           208:            return OK;
        !           209: 
        !           210:        case SPDU_NF: 
        !           211:            if (!(sb -> sb_requirements & SR_RLS_EXISTS)
        !           212:                    || !(sb -> sb_owned & ST_RLS_TOKEN))
        !           213:                goto bad_nf;
        !           214:            sr -> sr_affirmative = 0;
        !           215:            copySPKTdata (s, sr);
        !           216:            freespkt (s);
        !           217:            return OK;
        !           218: 
        !           219:        case SPDU_RS:
        !           220:            if (sb -> sb_spdu)  /* XXX */
        !           221:                freespkt (sb -> sb_spdu);
        !           222:            sb -> sb_spdu = s;
        !           223:            return ssaplose (si, SC_WAITING, NULLCP, NULLCP);
        !           224: 
        !           225:        case SPDU_AB: 
        !           226:            si -> si_type = SI_ABORT;
        !           227:            {
        !           228:                register struct SSAPabort  *sa = &si -> si_abort;
        !           229: 
        !           230:                if (!(sa -> sa_peer = (s -> s_ab_disconnect & AB_DISC_USER)
        !           231:                            ? 1 : 0))
        !           232:                    sa -> sa_reason = SC_ABORT;
        !           233:                sa -> sa_info = s -> s_udata, sa -> sa_cc = s -> s_ulen;
        !           234:                sa -> sa_realinfo = s -> s_udata, s -> s_udata = NULL;
        !           235:            }
        !           236:            break;
        !           237: 
        !           238:        default: 
        !           239: bad_nf: ;
        !           240:            (void) spktlose (sb -> sb_fd, si, SC_PROTOCOL, NULLCP,
        !           241:                    "session protocol mangled: not expecting 0x%x",
        !           242:                    s -> s_code);
        !           243:            break;
        !           244:     }
        !           245: 
        !           246: out2: ;
        !           247:     freespkt (s);
        !           248: out1: ;
        !           249:     freesblk (sb);
        !           250: 
        !           251:     return NOTOK;
        !           252: }

unix.superglobalmegacorp.com

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