Annotation of 43BSDReno/contrib/isode-beta/ftam/ftamgroup1.c, revision 1.1

1.1     ! root        1: /* ftamgroup1.c - FPM: initiate a grouped transaction */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamgroup1.c,v 7.0 89/11/23 21:53:37 mrose Rel $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/ftam/RCS/ftamgroup1.c,v 7.0 89/11/23 21:53:37 mrose Rel $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       ftamgroup1.c,v $
        !            12:  * Revision 7.0  89/11/23  21:53:37  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 "fpkt.h"
        !            33: 
        !            34: /*    F-{MANAGE,BULK-{BEGIN,END}}.REQUEST (group) */
        !            35: 
        !            36: int     FManageRequest (sd, ftg, fti)
        !            37: int     sd;
        !            38: struct FTAMgroup   *ftg;
        !            39: struct FTAMindication  *fti;
        !            40: {
        !            41:     return FGroupRequest (sd, ftg, FTI_MANAGEMENT, FSB_MANAGEMENT, fti);
        !            42: }
        !            43: 
        !            44: 
        !            45: int     FBulkBeginRequest (sd, ftg, fti)
        !            46: int     sd;
        !            47: struct FTAMgroup   *ftg;
        !            48: struct FTAMindication  *fti;
        !            49: {
        !            50:     return FGroupRequest (sd, ftg, FTI_BULKBEGIN, FSB_BULKBEGIN, fti);
        !            51: }
        !            52: 
        !            53: 
        !            54: int     FBulkEndRequest (sd, ftg, fti)
        !            55: int     sd;
        !            56: struct FTAMgroup   *ftg;
        !            57: struct FTAMindication  *fti;
        !            58: {
        !            59:     return FGroupRequest (sd, ftg, FTI_BULKEND, FSB_BULKEND, fti);
        !            60: }
        !            61: 
        !            62: /*    F-GROUP.REQUEST (group) */
        !            63: 
        !            64: static int  FGroupRequest (sd, ftg, type, state, fti)
        !            65: int     sd;
        !            66: struct FTAMgroup   *ftg;
        !            67: int    type,
        !            68:        state;
        !            69: struct FTAMindication  *fti;
        !            70: {
        !            71:     SBV            smask;
        !            72:     int            result;
        !            73:     register struct ftamblk *fsb;
        !            74: 
        !            75:     missingP (ftg);
        !            76:     missingP (fti);
        !            77: 
        !            78:     smask = sigioblock ();
        !            79: 
        !            80:     ftamPsig (fsb, sd);
        !            81: 
        !            82:     if ((result = figrpchk (fsb, ftg, type, fti)) != NOTOK)
        !            83:        result = FGroupRequestAux (fsb, ftg, state, fti);
        !            84: 
        !            85:     (void) sigiomask (smask);
        !            86: 
        !            87:     return result;
        !            88: }
        !            89: 
        !            90: /*  */
        !            91: 
        !            92: static int  FGroupRequestAux (fsb, ftg, state, fti)
        !            93: register struct ftamblk *fsb;
        !            94: register struct FTAMgroup  *ftg;
        !            95: int    state;
        !            96: struct FTAMindication  *fti;
        !            97: {
        !            98:     register int    i;
        !            99:     int     did_loop,
        !           100:            npdu,
        !           101:            result;
        !           102:     char  **txp,
        !           103:           *texts[NPDATA];
        !           104:     PE     pe,
        !           105:           *pep,
        !           106:            info[NPDATA];
        !           107:     struct PSAPindication   pis;
        !           108:     struct PSAPindication *pi = &pis;
        !           109:     struct PSAPabort  *pa = &pi -> pi_abort;
        !           110:     struct type_FTAM_PDU **pdup,
        !           111:                          *pdus[NPDATA];
        !           112: 
        !           113:     bzero ((char *) texts, sizeof texts);
        !           114:     bzero ((char *) info, sizeof info);
        !           115:     bzero ((char *) pdus, sizeof pdus);
        !           116: 
        !           117:     did_loop = 0;
        !           118:     if ((result = figrp2pdus (fsb, ftg, pdus, texts, &npdu, fti)) == NOTOK)
        !           119:        goto out;
        !           120: 
        !           121:     for (pdup = pdus, pep = info, txp = texts, i = npdu - 1;
        !           122:            i >= 0;
        !           123:            pdup++, pep++, txp++, i--) {
        !           124:        pe = NULLPE;
        !           125:        if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, *pdup) == NOTOK) {
        !           126:            result = ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
        !           127:                               "error encoding PDU: %s", PY_pepy);          
        !           128:            goto out;
        !           129:        }
        !           130:        (*pep = pe) -> pe_context = fsb -> fsb_id;
        !           131: 
        !           132:        fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", *txp, pe, 0));
        !           133:     }
        !           134:     did_loop = 1;
        !           135: 
        !           136:     result = PDataRequest (fsb -> fsb_fd, info, npdu, pi);
        !           137: 
        !           138: out: ;
        !           139:     for (pdup = pdus, pep = info, i = NPDATA - 1;
        !           140:            i >= 0;
        !           141:            pdup++, pep++, i--) {
        !           142:        if (*pep)
        !           143:            pe_free (*pep);
        !           144:        if (*pdup)
        !           145:            free_FTAM_PDU (*pdup);
        !           146:     }
        !           147: 
        !           148:     if (result == NOTOK) {
        !           149:        if (did_loop)
        !           150:            (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
        !           151:        if (fti -> fti_abort.fta_action == FACTION_PERM)
        !           152:            freefsblk (fsb);
        !           153: 
        !           154:        return NOTOK;
        !           155:     }
        !           156: 
        !           157:     fsb -> fsb_state = state;
        !           158:     fsb -> fsb_group = ftg -> ftg_flags;
        !           159:     
        !           160:     return FWaitRequestAux (fsb, NOTOK, fti);
        !           161: }
        !           162: 
        !           163: /*  */
        !           164: 
        !           165: static int  figrpchk (fsb, ftg, type, fti)
        !           166: register struct ftamblk *fsb;
        !           167: register struct FTAMgroup *ftg;
        !           168: int    type;
        !           169: struct FTAMindication *fti;
        !           170: {
        !           171:     int     i,
        !           172:             request;
        !           173:     register struct FTAMpasswords  *fp;
        !           174:     register struct FTAMconcurrency *fc;
        !           175: 
        !           176:     if (!(fsb -> fsb_flags & FSB_INIT))
        !           177:        return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not initiator");
        !           178:     switch (fsb -> fsb_state) {
        !           179:        case FSB_INITIALIZED: 
        !           180:            if (type == FTI_BULKEND)
        !           181:                goto wrong_state;
        !           182:            break;
        !           183: 
        !           184:        case FSB_DATAIDLE: 
        !           185:            if (type != FTI_BULKEND)
        !           186:                goto wrong_state;
        !           187:            break;
        !           188: 
        !           189:        default: 
        !           190:     wrong_state: ;
        !           191:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
        !           192:     }
        !           193: 
        !           194:     switch (fsb -> fsb_class) {
        !           195:        case FCLASS_TRANSFER: 
        !           196:            if (type != FTI_MANAGEMENT)
        !           197:                break;
        !           198:            goto bad_class;
        !           199: 
        !           200:        case FCLASS_MANAGE: 
        !           201:            if (type == FTI_MANAGEMENT)
        !           202:                break;
        !           203:            goto bad_class;
        !           204: 
        !           205:        case FCLASS_TM: 
        !           206:        case FCLASS_ACCESS: 
        !           207:            break;
        !           208: 
        !           209:        default: 
        !           210:     bad_class: ;
        !           211:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           212:                    "file management not permitted");
        !           213:     }
        !           214: 
        !           215:     if (!(ftg -> ftg_flags & FTG_BEGIN) || !(ftg -> ftg_flags & FTG_END))
        !           216:        return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "must be grouped");
        !           217: 
        !           218:     switch (type) {
        !           219:        case FTI_MANAGEMENT: 
        !           220:        case FTI_BULKBEGIN: 
        !           221:            if ((ftg -> ftg_flags & (FTG_SELECT | FTG_CREATE)) == 0
        !           222:                    || (ftg -> ftg_flags & (FTG_SELECT | FTG_CREATE))
        !           223:                    == (FTG_SELECT | FTG_CREATE))
        !           224:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           225:                        "missing/duplicate select/create request");
        !           226:            if (type == FTI_MANAGEMENT) {
        !           227:                if (ftg -> ftg_flags & (FTG_OPEN | FTG_CLOSE))
        !           228:                    return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           229:                            "file transfer not permitted");
        !           230:                goto finish_end;
        !           231:            }
        !           232:            if (!(ftg -> ftg_flags & FTG_OPEN))
        !           233:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           234:                        "missing open request");
        !           235:            if (ftg -> ftg_flags & (FTG_CLOSE | FTG_DESELECT | FTG_DELETE))
        !           236:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           237:                        "file management/close not permitted");
        !           238:            break;
        !           239: 
        !           240:        case FTI_BULKEND: 
        !           241:            if (ftg -> ftg_flags & (FTG_SELECT | FTG_CREATE | FTG_OPEN))
        !           242:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           243:                        "file management/open not permitted");
        !           244:            if ((ftg -> ftg_flags & FTG_CLOSE) == 0)
        !           245:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           246:                        "missing close request");
        !           247: 
        !           248:     finish_end: ;
        !           249:            if ((ftg -> ftg_flags & (FTG_DESELECT | FTG_DELETE)) == 0
        !           250:                    || (ftg -> ftg_flags & (FTG_DESELECT | FTG_DELETE))
        !           251:                    == (FTG_DESELECT | FTG_DELETE))
        !           252:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           253:                        "missing/duplicate deselect/delete request");
        !           254:            break;
        !           255:     }
        !           256: 
        !           257:     if (!(fsb -> fsb_units & FUNIT_GROUPING)
        !           258:            && (ftg -> ftg_flags & (FTG_BEGIN | FTG_END)))
        !           259:        return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           260:                "grouping not permitted");
        !           261:     if (!(fsb -> fsb_units & FUNIT_LIMITED)
        !           262:            && (ftg -> ftg_flags & (FTG_CREATE | FTG_RDATTR | FTG_DELETE)))
        !           263:        return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           264:                "limited file management not permitted");
        !           265:     if (!(fsb -> fsb_units & FUNIT_ENHANCED)
        !           266:            && (ftg -> ftg_flags & FTG_CHATTR))
        !           267:        return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           268:                "enhanced file management not permitted");
        !           269: 
        !           270:     i = 0;
        !           271: 
        !           272:     if (ftg -> ftg_flags & FTG_SELECT) {
        !           273:        register struct FTAMselect *ftse = &ftg -> ftg_select;
        !           274: 
        !           275:        if (ftse -> ftse_attrs.fa_present != FA_FILENAME)
        !           276:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           277:                    "only filename should be present");
        !           278:        if (ftse -> ftse_access & ~FA_REQ_MASK)
        !           279:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           280:                    "FADU-Identity groups not permitted");
        !           281: 
        !           282:        request = ftse -> ftse_access;
        !           283:        fp = &ftse -> ftse_pwds;
        !           284:        fc = &ftse -> ftse_conctl;
        !           285: 
        !           286:        goto finish_create;
        !           287:     }
        !           288: 
        !           289:     if (ftg -> ftg_flags & FTG_CREATE) {
        !           290:        register struct FTAMcreate *ftce = &ftg -> ftg_create;
        !           291: 
        !           292:        switch (ftce -> ftce_override) {
        !           293:            case FOVER_FAIL: 
        !           294:            case FOVER_SELECT: 
        !           295:            case FOVER_WRITE: 
        !           296:            case FOVER_DELETE: 
        !           297:                break;
        !           298: 
        !           299:            default: 
        !           300:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           301:                        "bad value for creation mode");
        !           302:        }
        !           303:        if (!(ftce -> ftce_attrs.fa_present & FA_FILENAME))
        !           304:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           305:                    "filename not present");
        !           306:        if (!(ftce -> ftce_attrs.fa_present & FA_ACTIONS))
        !           307:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           308:                    "permitted-actions not present");
        !           309:        if (!(ftce -> ftce_attrs.fa_present & FA_CONTENTS))
        !           310:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           311:                    "contents-type not present");
        !           312:        if (ftce -> ftce_attrs.fa_present & ~FA_CRE_ATTRS)
        !           313:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           314:                             "illegal attributes present");
        !           315:        if (!(fsb -> fsb_attrs & FATTR_STORAGE)
        !           316:                && (ftce -> ftce_attrs.fa_present & FA_STORAGE))
        !           317:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           318:                    "storage attributes not permitted");
        !           319:        if (!(fsb -> fsb_attrs & FATTR_SECURITY)
        !           320:                && (ftce -> ftce_attrs.fa_present & FA_SECURITY))
        !           321:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           322:                    "security attributes not permitted");
        !           323:        if (ftce -> ftce_access & ~FA_REQ_MASK)
        !           324:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           325:                    "FADU-Identity groups not permitted");
        !           326: 
        !           327:        request = ftce -> ftce_access;
        !           328:        fp = &ftce -> ftce_pwds;
        !           329:        fc = &ftce -> ftce_conctl;
        !           330: 
        !           331: finish_create: ;
        !           332:        if (!(fsb -> fsb_attrs & FATTR_SECURITY) && passes_present (fp))
        !           333:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           334:                    "access passwords not permitted");
        !           335:        if (fsb -> fsb_attrs & FATTR_STORAGE) {
        !           336:            if ((!(request & FA_PERM_READ)
        !           337:                        && fc -> fc_readlock < FLOCK_PRESENT)
        !           338:                    || (!(request & FA_PERM_INSERT)
        !           339:                        && fc -> fc_insertlock < FLOCK_PRESENT)
        !           340:                    || (!(request & FA_PERM_REPLACE)
        !           341:                        && fc -> fc_replacelock < FLOCK_PRESENT)
        !           342:                    || (!(request & FA_PERM_ERASE)
        !           343:                        && fc -> fc_eraselock < FLOCK_PRESENT)
        !           344:                    || (!(request & FA_PERM_EXTEND)
        !           345:                        && fc -> fc_extendlock < FLOCK_PRESENT)
        !           346:                    || (!(request & FA_PERM_READATTR)
        !           347:                        && fc -> fc_readattrlock < FLOCK_PRESENT)
        !           348:                    || (!(request & FA_PERM_CHNGATTR)
        !           349:                        && fc -> fc_chngattrlock < FLOCK_PRESENT)
        !           350:                    || (!(request & FA_PERM_DELETE)
        !           351:                        && fc -> fc_deletelock < FLOCK_PRESENT))
        !           352:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           353:                        "bad settings for select/create concurrency control");
        !           354:        }
        !           355: 
        !           356:        i++;
        !           357:     }
        !           358: 
        !           359:     if (ftg -> ftg_flags & FTG_CLOSE) {
        !           360:        register struct FTAMclose   *ftcl = &ftg -> ftg_close;
        !           361:        
        !           362:        switch (ftcl -> ftcl_action) {
        !           363:            case FACTION_SUCCESS: 
        !           364:            case FACTION_TRANS: 
        !           365:            case FACTION_PERM: 
        !           366:                break;
        !           367: 
        !           368:            default: 
        !           369:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           370:                        "bad value for close action parameter");
        !           371:        }
        !           372: 
        !           373:        if (ftcl -> ftcl_ndiag > NFDIAG)
        !           374:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           375:                    "too many close diagnostics");
        !           376: 
        !           377:        i++;
        !           378:     }
        !           379: 
        !           380:     if (ftg -> ftg_flags & FTG_RDATTR) {
        !           381:        register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
        !           382: 
        !           383:        if (!(fsb -> fsb_attrs & FATTR_STORAGE)
        !           384:                && (ftra -> ftra_attrnames & FA_STORAGE))
        !           385:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           386:                    "storage attributes not permitted");
        !           387:        if (!(fsb -> fsb_attrs & FATTR_SECURITY)
        !           388:                && (ftra -> ftra_attrnames & FA_SECURITY))
        !           389:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           390:                    "security attributes not permitted");
        !           391: 
        !           392:        i++;
        !           393:     }
        !           394: 
        !           395:     if (ftg -> ftg_flags & FTG_CHATTR) {
        !           396:        register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
        !           397: 
        !           398:        if (ftca -> ftca_attrs.fa_present & ftca -> ftca_attrs.fa_novalue)
        !           399:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           400:                    "attributes can not be changed to no-value-available");
        !           401:        if (!(fsb -> fsb_attrs & FATTR_STORAGE)
        !           402:                && (ftca -> ftca_attrs.fa_present & FA_STORAGE))
        !           403:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           404:                    "storage attributes not permitted");
        !           405:        if (!(fsb -> fsb_attrs & FATTR_SECURITY)
        !           406:                && (ftca -> ftca_attrs.fa_present & FA_SECURITY))
        !           407:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           408:                    "security attributes not permitted");
        !           409:        if (ftca -> ftca_attrs.fa_present & FA_CONTROL)
        !           410:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           411:                             "encoding of access-control not supported (yet)");
        !           412: 
        !           413:        i++;
        !           414:     }
        !           415: 
        !           416:     if (ftg -> ftg_flags & FTG_DESELECT)
        !           417:        i++;
        !           418: 
        !           419:     if (ftg -> ftg_flags & FTG_DELETE)
        !           420:        i++;
        !           421: 
        !           422:     if (ftg -> ftg_flags & FTG_OPEN) {
        !           423:        register struct FTAMopen *ftop = &ftg -> ftg_open;
        !           424:        
        !           425:        if ((request = ftop -> ftop_mode) & ~FA_MODE_MASK)
        !           426:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           427:                        "bad open mode");
        !           428: #ifdef notdef
        !           429:        if (ftop -> ftop_contents == NULLOID)
        !           430:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           431:                        "missing contents type in open");
        !           432: #endif
        !           433:        if (fsb -> fsb_attrs & FATTR_STORAGE) {
        !           434:            fc = &ftop -> ftop_conctl;
        !           435:            if ((!(request & FA_PERM_READ)
        !           436:                        && fc -> fc_readlock < FLOCK_PRESENT)
        !           437:                    || (!(request & FA_PERM_INSERT)
        !           438:                        && fc -> fc_insertlock < FLOCK_PRESENT)
        !           439:                    || (!(request & FA_PERM_REPLACE)
        !           440:                        && fc -> fc_replacelock < FLOCK_PRESENT)
        !           441:                    || (!(request & FA_PERM_ERASE)
        !           442:                        && fc -> fc_eraselock < FLOCK_PRESENT)
        !           443:                    || (!(request & FA_PERM_EXTEND)
        !           444:                        && fc -> fc_extendlock < FLOCK_PRESENT)
        !           445:                    || fc -> fc_readattrlock != FLOCK_NOTREQD
        !           446:                    || fc -> fc_chngattrlock != FLOCK_NOTREQD
        !           447:                    || fc -> fc_deletelock != FLOCK_NOTREQD)
        !           448:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           449:                        "bad settings for open concurrency control");
        !           450:        }
        !           451: 
        !           452:        i++;
        !           453:     }
        !           454: 
        !           455:     if (i != ftg -> ftg_threshold)
        !           456:        return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
        !           457:                "threshold mismatch; expecting %d, found %d",
        !           458:                ftg -> ftg_threshold, i);
        !           459: 
        !           460:     return OK;
        !           461: }
        !           462: 
        !           463: /*  */
        !           464: 
        !           465: static int  figrp2pdus (fsb, ftg, pdus, texts, npdu, fti)
        !           466: register struct ftamblk *fsb;
        !           467: register struct FTAMgroup *ftg;
        !           468: struct type_FTAM_PDU *pdus[];
        !           469: char   *texts[];
        !           470: int    *npdu;
        !           471: struct FTAMindication *fti;
        !           472: {
        !           473:     int     i;
        !           474:     register struct type_FTAM_PDU *pdu;
        !           475: 
        !           476:     i = 0;
        !           477: 
        !           478: #define        new_pdu(t,o,u,x) \
        !           479:        register struct t *req; \
        !           480:  \
        !           481:        if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) \
        !           482:            goto no_mem; \
        !           483:        pdus[i] = pdu; \
        !           484:        pdu  -> offset = o; \
        !           485:        texts[i++] = x; \
        !           486:        if ((req = (struct t *) calloc (1, sizeof *req)) == NULL) \
        !           487:            goto no_mem; \
        !           488:        pdu -> un.u = req;
        !           489: 
        !           490: #define        new_action(a) \
        !           491:     if (a != int_FTAM_Action__Result_success) { \
        !           492:        if ((req -> action__result = \
        !           493:                        (struct type_FTAM_Action__Result *) \
        !           494:                                calloc (1, sizeof *req -> action__result)) \
        !           495:                == NULL) \
        !           496:            goto no_mem; \
        !           497:        req -> action__result -> parm = a; \
        !           498:     }
        !           499: 
        !           500:     if (ftg -> ftg_flags & FTG_BEGIN) {
        !           501:        new_pdu (type_FTAM_F__BEGIN__GROUP__request,
        !           502:                 type_FTAM_PDU_f__begin__group__request,
        !           503:                 f__begin__group__request, "F-BEGIN-GROUP-request");
        !           504:        req -> parm = ftg -> ftg_threshold;
        !           505:     }
        !           506: 
        !           507:     if (ftg -> ftg_flags & FTG_SELECT) {
        !           508:        register struct FTAMselect *ftse = &ftg -> ftg_select;
        !           509: 
        !           510:        new_pdu (type_FTAM_F__SELECT__request,
        !           511:                 type_FTAM_PDU_f__select__request,
        !           512:                 f__select__request, "F-SELECT-request");
        !           513:        if ((req -> attributes = attr2fpm (fsb, &ftse -> ftse_attrs, fti))
        !           514:                == NULL)
        !           515:            return NOTOK;
        !           516:        if ((req -> requested__access = bits2fpm (fsb, frequested_pairs,
        !           517:                                                  ftse -> ftse_access, fti))
        !           518:                == NULL)
        !           519:            return NOTOK;
        !           520:        if (passes_present (&ftse -> ftse_pwds)
        !           521:                && (req -> access__passwords = pass2fpm (fsb,
        !           522:                                                         &ftse -> ftse_pwds,
        !           523:                                                         fti)) == NULL)
        !           524:            return NOTOK;
        !           525:        if (conctl_present (&ftse -> ftse_conctl)
        !           526:                && (req -> concurrency__control =
        !           527:                                conctl2fpm (fsb, &ftse -> ftse_conctl, fti))
        !           528:                        == NULL)
        !           529:            return NOTOK;
        !           530:        if (ftse -> ftse_sharedASE
        !           531:                && (req -> shared__ASE__information =
        !           532:                            shared2fpm (fsb, ftse -> ftse_sharedASE, fti)) == NULL)
        !           533:            return NOTOK;
        !           534:        if (ftse -> ftse_account
        !           535:                && (req -> account = str2qb (ftse -> ftse_account,
        !           536:                                             strlen (ftse -> ftse_account), 1))
        !           537:                        == NULL)
        !           538:            goto no_mem;
        !           539:     }
        !           540: 
        !           541:     if (ftg -> ftg_flags & FTG_CREATE) {
        !           542:        register struct FTAMcreate *ftce = &ftg -> ftg_create;
        !           543: 
        !           544:        new_pdu (type_FTAM_F__CREATE__request,
        !           545:                 type_FTAM_PDU_f__create__request,
        !           546:                 f__create__request, "F-CREATE-request");
        !           547:        req -> override = ftce -> ftce_override;
        !           548:        if ((req -> initial__attributes = attr2fpm (fsb, &ftce -> ftce_attrs,
        !           549:                                                    fti)) == NULL)
        !           550:            return NOTOK;
        !           551:        if (ftce -> ftce_create) {
        !           552:            register struct type_FTAM_Password *p;
        !           553:            
        !           554:            if ((p = (struct type_FTAM_Password *) calloc (1, sizeof *p))
        !           555:                    == NULL)
        !           556:                goto no_mem;
        !           557:            req -> create__password = p;
        !           558:            p -> offset = type_FTAM_Password_binary;
        !           559:            if ((p -> un.binary = str2qb (ftce -> ftce_create,
        !           560:                                          ftce -> ftce_crelen, 1)) == NULL)
        !           561:                goto no_mem;
        !           562:        }
        !           563:        if ((req -> requested__access = bits2fpm (fsb, frequested_pairs,
        !           564:                                                  ftce -> ftce_access, fti))
        !           565:                == NULL)
        !           566:            return NOTOK;
        !           567:        if (passes_present (&ftce -> ftce_pwds)
        !           568:                && (req -> access__passwords = pass2fpm (fsb,
        !           569:                                                         &ftce -> ftce_pwds,
        !           570:                                                         fti)) == NULL)
        !           571:            return NOTOK;
        !           572:        if (conctl_present (&ftce -> ftce_conctl)
        !           573:                && (req -> concurrency__control =
        !           574:                                conctl2fpm (fsb, &ftce -> ftce_conctl, fti))
        !           575:                        == NULL)
        !           576:            return NOTOK;
        !           577:        if (ftce -> ftce_sharedASE
        !           578:                && (req -> shared__ASE__information =
        !           579:                            shared2fpm (fsb, ftce -> ftce_sharedASE, fti)) == NULL)
        !           580:            return NOTOK;
        !           581:        if (ftce -> ftce_account
        !           582:                && (req -> account = str2qb (ftce -> ftce_account,
        !           583:                                             strlen (ftce -> ftce_account), 1))
        !           584:                        == NULL)
        !           585:            goto no_mem;
        !           586:     }
        !           587: 
        !           588:     if (ftg -> ftg_flags & FTG_CLOSE) {
        !           589:        register struct FTAMclose *ftcl = &ftg -> ftg_close;
        !           590: 
        !           591:        new_pdu (type_FTAM_F__CLOSE__request, type_FTAM_PDU_f__close__request,
        !           592:                 f__close__request, "F-CLOSE-request");
        !           593:        new_action (ftcl -> ftcl_action);
        !           594:        if (ftcl -> ftcl_sharedASE
        !           595:                && (req -> shared__ASE__information =
        !           596:                                shared2fpm (fsb, ftcl -> ftcl_sharedASE, fti))
        !           597:                        == NULL)
        !           598:            return NOTOK;
        !           599:        if (ftcl -> ftcl_ndiag > 0
        !           600:                && (req -> diagnostic = diag2fpm (fsb, 0, ftcl -> ftcl_diags,
        !           601:                                                  ftcl -> ftcl_ndiag, fti))
        !           602:                        == NULL)
        !           603:            return NOTOK;
        !           604:     }
        !           605: 
        !           606:     if (ftg -> ftg_flags & FTG_RDATTR) {
        !           607:        register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
        !           608: 
        !           609:        if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
        !           610:            goto no_mem;
        !           611:        pdus[i] = pdu;
        !           612:        pdu -> offset = type_FTAM_PDU_f__read__attrib__request;
        !           613:        texts[i++] = "F-READ-ATTRIB-request";
        !           614:        if ((pdu -> un.f__read__attrib__request =
        !           615:                            bits2fpm (fsb, fname_pairs, ftra -> ftra_attrnames,
        !           616:                                      fti)) == NULLPE)
        !           617:            return NOTOK;
        !           618:     }
        !           619: 
        !           620:     if (ftg -> ftg_flags & FTG_CHATTR) {
        !           621:        register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
        !           622: 
        !           623:        if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
        !           624:            goto no_mem;
        !           625:        pdus[i] = pdu;
        !           626:        pdu -> offset = type_FTAM_PDU_f__change__attrib__request;
        !           627:        texts[i++] = "F-CHANGE-ATTRIB-request";
        !           628:        if ((pdu -> un.f__change__attrib__request =
        !           629:                        attr2fpm (fsb, &ftca -> ftca_attrs, fti)) == NULL)
        !           630:            return NOTOK;
        !           631:     }
        !           632: 
        !           633:     if (ftg -> ftg_flags & FTG_DESELECT) {
        !           634:        register struct FTAMdeselect *ftde = &ftg -> ftg_deselect;
        !           635: 
        !           636:        if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
        !           637:            goto no_mem;
        !           638:        pdus[i] = pdu;
        !           639:        pdu -> offset = type_FTAM_PDU_f__deselect__request;
        !           640:        texts[i++] = "F-DESELECT-request";
        !           641:        if (ftde -> ftde_sharedASE
        !           642:                && (pdu -> un.f__deselect__request =
        !           643:                        shared2fpm (fsb, ftde -> ftde_sharedASE, fti)) == NULL)
        !           644:            return NOTOK;
        !           645:     }
        !           646: 
        !           647:     if (ftg -> ftg_flags & FTG_DELETE) {
        !           648:        register struct FTAMdelete *ftxe = &ftg -> ftg_delete;
        !           649: 
        !           650:        if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
        !           651:            goto no_mem;
        !           652:        pdus[i] = pdu;
        !           653:        pdu -> offset = type_FTAM_PDU_f__delete__request;
        !           654:        texts[i++] = "F-DELETE-request";
        !           655:        if (ftxe -> ftxe_sharedASE
        !           656:                && (pdu -> un.f__deselect__request =
        !           657:                        shared2fpm (fsb, ftxe -> ftxe_sharedASE, fti)) == NULL)
        !           658:            return NOTOK;
        !           659:     }
        !           660:     
        !           661:     if (ftg -> ftg_flags & FTG_OPEN) {
        !           662:        register struct FTAMopen *ftop = &ftg -> ftg_open;
        !           663: 
        !           664:        new_pdu (type_FTAM_F__OPEN__request, type_FTAM_PDU_f__open__request,
        !           665:                 f__open__request, "F-OPEN-request");
        !           666:        if (ftop -> ftop_mode != FA_PERM_READ
        !           667:                && (req -> processing__mode = bits2fpm (fsb, fmode_pairs,
        !           668:                                                        ftop -> ftop_mode,
        !           669:                                                        fti)) == NULL)
        !           670:            return NOTOK;
        !           671:        if ((req -> contents__type =
        !           672:                        (struct choice_FTAM_0 *)
        !           673:                                calloc (1, sizeof *req -> contents__type))
        !           674:                == NULL)
        !           675:            goto no_mem;
        !           676:        if (ftop -> ftop_contents) {
        !           677:            register struct type_FTAM_Contents__Type__Attribute *proposed;
        !           678: 
        !           679:            req -> contents__type -> offset = choice_FTAM_0_proposed;
        !           680:            if ((proposed = (struct type_FTAM_Contents__Type__Attribute *)
        !           681:                                        calloc (1, sizeof *proposed)) == NULL)
        !           682:                goto no_mem;
        !           683:            req -> contents__type -> un.proposed = proposed;
        !           684:            if ((proposed -> document__type__name =
        !           685:                                oid_cpy (ftop -> ftop_contents)) == NULLOID)
        !           686:                goto no_mem;
        !           687:            if (proposed -> parameter = ftop -> ftop_parameter)
        !           688:                proposed -> parameter -> pe_refcnt++;
        !           689:        }
        !           690:        else
        !           691:            req -> contents__type -> offset = choice_FTAM_0_unknown;
        !           692:        if (conctl_present (&ftop -> ftop_conctl)
        !           693:                && (req -> concurrency__control =
        !           694:                                conctl2fpm (fsb, &ftop -> ftop_conctl, fti))
        !           695:                        == NULL)
        !           696:            return NOTOK;
        !           697:        if (ftop -> ftop_sharedASE
        !           698:                && (req -> shared__ASE__information =
        !           699:                            shared2fpm (fsb, ftop -> ftop_sharedASE, fti)) == NULL)
        !           700:            return NOTOK;
        !           701:        if (fsb -> fsb_units & FUNIT_FADULOCK)
        !           702:            req -> enable__fadu__locking = ftop -> ftop_locking
        !           703:                                                ? int_FTAM_FADU__Lock_on
        !           704:                                                : int_FTAM_FADU__Lock_off;
        !           705:     }
        !           706: 
        !           707:     if (ftg -> ftg_flags & FTG_END) {
        !           708:        if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
        !           709:            goto no_mem;
        !           710:        pdus[i] = pdu;
        !           711:        pdu -> offset = type_FTAM_PDU_f__end__group__request;
        !           712:        texts[i++] = "F-END-GROUP-request";
        !           713:     }
        !           714: 
        !           715:     *npdu = i;
        !           716:     return OK;
        !           717: 
        !           718: #undef new_pdu
        !           719: #undef new_action
        !           720: 
        !           721: no_mem: ;
        !           722:     return ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
        !           723: }

unix.superglobalmegacorp.com

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