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

1.1     ! root        1: /* ssapwrite.c - SPM: write various SPDUs  */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/ssap/RCS/ssapwrite.c,v 7.0 89/11/23 22:25:52 mrose Rel $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/ssap/RCS/ssapwrite.c,v 7.0 89/11/23 22:25:52 mrose Rel $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       ssapwrite.c,v $
        !            12:  * Revision 7.0  89/11/23  22:25:52  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 "spkt.h"
        !            32: 
        !            33: /*  */
        !            34: 
        !            35: int    SWriteRequestAux (sb, code, data, cc, type, ssn, settings,
        !            36:                 id, oid, ref, si)
        !            37: register struct ssapblk *sb;
        !            38: int     code;
        !            39: char   *data;
        !            40: int     cc,
        !            41:         type,
        !            42:         settings;
        !            43: long   ssn;
        !            44: struct SSAPactid   *id,
        !            45:                    *oid;
        !            46: struct SSAPref *ref;
        !            47: struct SSAPindication  *si;
        !            48: {
        !            49:     int     result;
        !            50:     register struct ssapkt *s,
        !            51:                            *p;
        !            52:     struct TSAPdisconnect   tds;
        !            53:     register struct TSAPdisconnect *td = &tds;
        !            54:     struct udvec    uvs[3];
        !            55:     register struct udvec  *uv;
        !            56: 
        !            57:     if (sb -> sb_flags & SB_EXPD)
        !            58:        switch (code) {
        !            59:            case SPDU_MAA: 
        !            60:                result = PR_MAA;
        !            61:                goto send_pr;
        !            62: 
        !            63:            case SPDU_AI:
        !            64:            case SPDU_AD:
        !            65:            case SPDU_RS: 
        !            66:                result = PR_RS;
        !            67:                goto send_pr;
        !            68: 
        !            69:            case SPDU_AIA:
        !            70:            case SPDU_ADA:
        !            71:            case SPDU_RA: 
        !            72:                result = PR_RA;
        !            73:        send_pr: ;
        !            74:                if ((p = newspkt (SPDU_PR)) == NULL)
        !            75:                    return ssaplose (si, SC_CONGEST, NULLCP, "out of memory");
        !            76:                p -> s_mask |= SMASK_PR_TYPE;
        !            77:                p -> s_pr_type = result;
        !            78:                result = spkt2sd (p, sb -> sb_fd, 1, si);
        !            79:                freespkt (p);
        !            80:                if (result == NOTOK)
        !            81:                    return NOTOK;
        !            82:                break;
        !            83: 
        !            84:            default: 
        !            85:                break;
        !            86:        }
        !            87: 
        !            88:     uv = uvs;
        !            89:     uvs[0].uv_base = uvs[1].uv_base = NULL;
        !            90: 
        !            91:     switch (code) {
        !            92:        case SPDU_MAP: 
        !            93:        case SPDU_MIP: 
        !            94:        case SPDU_RS: 
        !            95:        case SPDU_AS: 
        !            96:        case SPDU_AR: 
        !            97:        case SPDU_AD: 
        !            98:        case SPDU_AI: 
        !            99: #ifdef notdef                  /* aka SPDU_MAP */
        !           100:        case SPDU_AE: 
        !           101: #endif
        !           102:        case SPDU_CD: 
        !           103:            if (s = newspkt (SPDU_GT))
        !           104:                s -> s_mask |= SMASK_SPDU_GT;
        !           105:            break;
        !           106: 
        !           107:        default: 
        !           108:            s = newspkt (SPDU_PT);
        !           109:            break;
        !           110:     }
        !           111:     if (s == NULL)
        !           112:        return ssaplose (si, SC_CONGEST, NULLCP, "out of memory");
        !           113: 
        !           114:     if (spkt2tsdu (s, &uv -> uv_base, &uv -> uv_len) == NOTOK) {
        !           115:        (void) ssaplose (si, s -> s_errno, NULLCP, NULLCP);
        !           116:        goto out1;
        !           117:     }
        !           118:     freespkt (s);
        !           119:     uv++;
        !           120: 
        !           121:     if ((s = newspkt (code)) == NULL) {
        !           122:        (void) ssaplose (si, SC_CONGEST, NULLCP, "out of memory");
        !           123:        goto out2;
        !           124:     }
        !           125:     switch (code) {
        !           126:        case SPDU_MAP: 
        !           127:            if (type) {
        !           128:                s -> s_mask |= SMASK_MAP_SYNC;
        !           129:                s -> s_map_sync = type;
        !           130:            }
        !           131:            s -> s_mask |= SMASK_MAP_SERIAL;
        !           132:            s -> s_map_serial = ssn;
        !           133:            break;
        !           134: 
        !           135:        case SPDU_MAA: 
        !           136:            s -> s_mask |= SMASK_MAA_SERIAL;
        !           137:            s -> s_maa_serial = ssn;
        !           138:            break;
        !           139: 
        !           140:        case SPDU_MIP: 
        !           141:            if (type == SYNC_NOCONFIRM) {
        !           142:                s -> s_mask |= SMASK_MIP_SYNC;
        !           143:                s -> s_mip_sync = MIP_SYNC_NOEXPL;
        !           144:            }
        !           145:            s -> s_mask |= SMASK_MIP_SERIAL;
        !           146:            s -> s_mip_serial = ssn;
        !           147:            break;
        !           148: 
        !           149:        case SPDU_MIA: 
        !           150:            s -> s_mask |= SMASK_MIA_SERIAL;
        !           151:            s -> s_mia_serial = ssn;
        !           152:            break;
        !           153: 
        !           154:        case SPDU_RS: 
        !           155:            if (sb -> sb_requirements & SR_TOKENS) {
        !           156:                s -> s_mask |= SMASK_RS_SET;
        !           157:                s -> s_rs_settings = settings;
        !           158:            }
        !           159:            s -> s_mask |= SMASK_RS_TYPE;
        !           160:            s -> s_rs_type = type;
        !           161:            s -> s_mask |= SMASK_RS_SSN;
        !           162:            s -> s_rs_serial = ssn;
        !           163:            break;
        !           164: 
        !           165:        case SPDU_RA: 
        !           166:            if (sb -> sb_requirements & SR_TOKENS) {
        !           167:                s -> s_mask |= SMASK_RA_SET;
        !           168:                s -> s_ra_settings = settings;
        !           169:            }
        !           170:            s -> s_mask |= SMASK_RA_SSN;
        !           171:            s -> s_ra_serial = ssn;
        !           172:            break;
        !           173: 
        !           174:        case SPDU_AS: 
        !           175:            s -> s_mask |= SMASK_AS_ID;
        !           176:            s -> s_as_id = *id; /* struct copy */
        !           177:            break;
        !           178: 
        !           179:        case SPDU_AR: 
        !           180:            s -> s_mask |= SMASK_AR_OID | SMASK_AR_SSN | SMASK_AR_ID;
        !           181:            s -> s_ar_oid = *oid;       /* struct copy */
        !           182:            s -> s_ar_serial = ssn;
        !           183:            s -> s_ar_id = *id; /* struct copy */       
        !           184:            if (ref) {
        !           185:                s -> s_mask |= SMASK_AR_REF;
        !           186:                s -> s_ar_reference = *ref;     /* struct copy */
        !           187:            }
        !           188:            break;
        !           189: 
        !           190:        case SPDU_AI:
        !           191:            s -> s_mask |= SMASK_AI_REASON;
        !           192:            s -> s_ai_reason = type;
        !           193:            break;
        !           194: 
        !           195:        case SPDU_AD:
        !           196:            s -> s_mask |= SMASK_AD_REASON;
        !           197:            s -> s_ad_reason = type;
        !           198:            break;
        !           199: 
        !           200:        case SPDU_ED: 
        !           201:            s -> s_mask |= SMASK_ED_REASON;
        !           202:            s -> s_ed_reason = type;
        !           203:            break;
        !           204: 
        !           205:        default: 
        !           206:            break;
        !           207:     }
        !           208: 
        !           209:     if (cc > 0) {
        !           210:        s -> s_mask |= SMASK_UDATA_PGI;
        !           211:        s -> s_udata = data, s -> s_ulen = cc;
        !           212:     }
        !           213:     else
        !           214:        s -> s_udata = NULL, s -> s_ulen = 0;
        !           215:     result = spkt2tsdu (s, &uv -> uv_base, &uv -> uv_len);
        !           216:     s -> s_mask &= ~SMASK_UDATA_PGI;
        !           217:     s -> s_udata = NULL, s -> s_ulen = 0;
        !           218: 
        !           219:     if (result == NOTOK) {
        !           220:        (void) ssaplose (si, s -> s_errno, NULLCP, NULLCP);
        !           221:        goto out3;
        !           222:     }
        !           223:     freespkt (s);
        !           224:     uv++;
        !           225: 
        !           226:     uv -> uv_base = NULL;
        !           227: 
        !           228:     if ((result = TWriteRequest (sb -> sb_fd, uvs, td)) == NOTOK)
        !           229:        (void) ts2sslose (si, "TWriteRequest", td);
        !           230: 
        !           231:     free (uvs[0].uv_base);
        !           232:     free (uvs[1].uv_base);
        !           233: 
        !           234:     return result;
        !           235: 
        !           236: out3: ;
        !           237:     if (uvs[1].uv_base)
        !           238:        free (uvs[1].uv_base);
        !           239: out2: ;
        !           240:     if (uvs[0].uv_base)
        !           241:        free (uvs[0].uv_base);
        !           242: out1: ;
        !           243:     freespkt (s);
        !           244: 
        !           245:     return NOTOK;
        !           246: }

unix.superglobalmegacorp.com

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