Annotation of 43BSDReno/contrib/isode-beta/ftam/ftambulk.c, revision 1.1.1.1

1.1       root        1: /* ftambulk.c - FPM: bulk data transfer */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftambulk.c,v 7.0 89/11/23 21:53:26 mrose Rel $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/ftam/RCS/ftambulk.c,v 7.0 89/11/23 21:53:26 mrose Rel $
                      9:  *
                     10:  *
                     11:  * $Log:       ftambulk.c,v $
                     12:  * Revision 7.0  89/11/23  21:53:26  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-DATA.REQUEST */
                     35: 
                     36: int    FDataRequest (sd, fadus, nfadu, fti)
                     37: int    sd;
                     38: PE     fadus[];
                     39: int    nfadu;
                     40: struct FTAMindication *fti;
                     41: {
                     42:     SBV            smask;
                     43:     int     result;
                     44:     register struct ftamblk *fsb;
                     45: 
                     46:     missingP (fti);
                     47: 
                     48:     smask = sigioblock ();
                     49: 
                     50:     ftamPsig (fsb, sd);
                     51: 
                     52:     result = FDataRequestAux (fsb, fadus, nfadu, fti);
                     53: 
                     54:     (void) sigiomask (smask);
                     55: 
                     56:     return result;
                     57: }
                     58: 
                     59: /*  */
                     60: 
                     61: static int  FDataRequestAux (fsb, fadus, nfadu, fti)
                     62: register struct ftamblk *fsb;
                     63: PE     fadus[];
                     64: int    nfadu;
                     65: struct FTAMindication *fti;
                     66: {
                     67:     register int    i;
                     68:     PE     pe,
                     69:           *pep;
                     70:     struct PSAPindication   pis;
                     71:     struct PSAPindication  *pi = &pis;
                     72:     struct PSAPabort   *pa = &pi -> pi_abort;
                     73: 
                     74:     switch (fsb -> fsb_state) {
                     75:        case FSB_DATAREAD: 
                     76:            if (fsb -> fsb_flags & FSB_INIT)
                     77:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                     78:                        "not responder");
                     79:            break;
                     80: 
                     81:        case FSB_DATAWRITE: 
                     82:            if (!(fsb -> fsb_flags & FSB_INIT))
                     83:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                     84:                        "not initiator");
                     85:            break;
                     86: 
                     87:        default: 
                     88:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
                     89:     }
                     90: 
                     91:     for (pep = fadus, i = nfadu - 1; i >= 0; pep++, i--) {
                     92:        if ((pe = *pep) == NULLPE)
                     93:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                     94:                    "empty FADU at slot %d", nfadu - i - 1);
                     95: 
                     96:        if (pe -> pe_context == PE_DFLT_CTX)
                     97:            pe -> pe_context = fsb -> fsb_id;
                     98: 
                     99:        if (pe -> pe_context == fsb -> fsb_id)
                    100:            switch (PE_ID (pe -> pe_class, pe -> pe_id)) {
                    101:                case PE_ID (PE_CLASS_APPL, FADU_NODESCR):
                    102:                case PE_ID (PE_CLASS_APPL, FADU_ENTERTREE):
                    103:                case PE_ID (PE_CLASS_APPL, FADU_EXITREE):
                    104:                    break;
                    105: 
                    106:                default:
                    107:                    return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                    108:                                "bad context at slot %d", nfadu - i - 1);
                    109:            }
                    110:     }
                    111: 
                    112:     if (PDataRequest (fsb -> fsb_fd, fadus, nfadu, pi) == NOTOK) {
                    113:        (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
                    114:        if (PC_FATAL (pa -> pa_reason))
                    115:            freefsblk (fsb);
                    116: 
                    117:        return NOTOK;
                    118:     }
                    119: 
                    120:     return OK;
                    121: }
                    122: 
                    123: /*    F-DATA-END.REQUEST */
                    124: 
                    125: int    FDataEndRequest (sd, action, diag, ndiag, fti)
                    126: int    sd;
                    127: int    action;
                    128: struct FTAMdiagnostic diag[];
                    129: int    ndiag;
                    130: struct FTAMindication *fti;
                    131: {
                    132:     SBV            smask;
                    133:     int     result;
                    134:     register struct ftamblk *fsb;
                    135: 
                    136:     switch (action) {
                    137:        case FACTION_SUCCESS: 
                    138:        case FACTION_TRANS: 
                    139:        case FACTION_PERM: 
                    140:            break;
                    141: 
                    142:        default: 
                    143:            return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
                    144:                    "bad value for action parameter");
                    145:     }
                    146:     toomuchP (diag, ndiag, NFDIAG, "diagnostic");
                    147:     missingP (fti);
                    148: 
                    149:     smask = sigioblock ();
                    150: 
                    151:     ftamPsig (fsb, sd);
                    152: 
                    153:     result = FDataEndRequestAux (fsb, action, diag, ndiag, fti);
                    154: 
                    155:     (void) sigiomask (smask);
                    156: 
                    157:     return result;
                    158: }
                    159: 
                    160: /*  */
                    161: 
                    162: static int  FDataEndRequestAux (fsb, action, diag, ndiag, fti)
                    163: register struct ftamblk *fsb;
                    164: int    action;
                    165: struct FTAMdiagnostic diag[];
                    166: int    ndiag;
                    167: struct FTAMindication *fti;
                    168: {
                    169:     int     result;
                    170:     PE     pe;
                    171:     struct PSAPindication   pis;
                    172:     struct PSAPindication  *pi = &pis;
                    173:     struct PSAPabort   *pa = &pi -> pi_abort;
                    174:     register struct type_FTAM_PDU *pdu;
                    175:     register struct type_FTAM_F__DATA__END__request *req;
                    176: 
                    177:     switch (fsb -> fsb_state) {
                    178:        case FSB_DATAREAD: 
                    179:            if (fsb -> fsb_flags & FSB_INIT)
                    180:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                    181:                        "not responder");
                    182:            break;
                    183: 
                    184:        case FSB_DATAWRITE: 
                    185:            if (!(fsb -> fsb_flags & FSB_INIT))
                    186:                return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
                    187:                        "not initiator");
                    188:            break;
                    189: 
                    190:        default: 
                    191:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
                    192:     }
                    193: 
                    194:     pe = NULLPE;
                    195:     if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
                    196: no_mem: ;
                    197:        (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
                    198: out: ;
                    199:        if (pe)
                    200:            pe_free (pe);
                    201:        if (pdu)
                    202:            free_FTAM_PDU (pdu);
                    203:        if (fti -> fti_abort.fta_action == FACTION_PERM)
                    204:            freefsblk (fsb);
                    205:        return NOTOK;
                    206:     }
                    207:     pdu -> offset = type_FTAM_PDU_f__data__end__request;
                    208:     if ((req = (struct type_FTAM_F__DATA__END__request *)
                    209:                        calloc (1, sizeof *req)) == NULL)
                    210:        goto no_mem;
                    211:     pdu -> un.f__data__end__request = req;
                    212:     if ((req -> action__result =
                    213:             (struct type_FTAM_Action__Result *)
                    214:                        calloc (1, sizeof *req -> action__result)) == NULL)
                    215:        goto no_mem;
                    216:     req -> action__result -> parm = action;
                    217:     if (ndiag > 0
                    218:            && (req -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
                    219:                    == NULL)
                    220:        goto out;
                    221: 
                    222:     if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
                    223:        (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
                    224:                         "error encoding PDU: %s", PY_pepy);
                    225:        goto out;
                    226:     }
                    227: 
                    228:     pe -> pe_context = fsb -> fsb_id;
                    229: 
                    230:     fsbtrace (fsb,
                    231:              (fsb -> fsb_fd, "P-DATA.REQUEST", "F-DATA-END-request", pe, 0));
                    232: 
                    233:     result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
                    234: 
                    235:     pe_free (pe);
                    236:     pe = NULLPE;
                    237:     free_FTAM_PDU (pdu);
                    238:     pdu = NULL;
                    239: 
                    240:     if (result == NOTOK) {
                    241:        (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
                    242:        goto out;
                    243:     }
                    244: 
                    245:     fsb -> fsb_state = FSB_DATAFIN1;
                    246: 
                    247:     return OK;
                    248: }
                    249: 
                    250: /*    F-CANCEL.REQUEST */
                    251: 
                    252: int    FCancelRequest (sd, action, sharedASE, diag, ndiag, fti)
                    253: int    sd;
                    254: int    action;
                    255: PE     sharedASE;
                    256: struct FTAMdiagnostic diag[];
                    257: int    ndiag;
                    258: struct FTAMindication *fti;
                    259: {
                    260:     SBV            smask;
                    261:     int     result;
                    262:     register struct ftamblk *fsb;
                    263: 
                    264:     switch (action) {
                    265:        case FACTION_SUCCESS: 
                    266:        case FACTION_TRANS: 
                    267:        case FACTION_PERM: 
                    268:            break;
                    269: 
                    270:        default: 
                    271:            return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
                    272:                    "bad value for action parameter");
                    273:     }
                    274:     toomuchP (diag, ndiag, NFDIAG, "diagnostic");
                    275:     missingP (fti);
                    276: 
                    277:     smask = sigioblock ();
                    278: 
                    279:     ftamPsig (fsb, sd);
                    280: 
                    281:     result = FCancelRequestAux (fsb, action, sharedASE, diag, ndiag, fti);
                    282: 
                    283:     (void) sigiomask (smask);
                    284: 
                    285:     return result;
                    286: }
                    287: 
                    288: /*  */
                    289: 
                    290: static int  FCancelRequestAux (fsb, action, sharedASE, diag, ndiag, fti)
                    291: register struct ftamblk *fsb;
                    292: int    action;
                    293: PE     sharedASE;
                    294: struct FTAMdiagnostic diag[];
                    295: int    ndiag;
                    296: struct FTAMindication *fti;
                    297: {
                    298:     int            result,
                    299:            settings;
                    300:     char   *prequest;
                    301:     PE     pe;
                    302:     struct PSAPindication   pis;
                    303:     struct PSAPindication  *pi = &pis;
                    304:     struct PSAPabort   *pa = &pi -> pi_abort;
                    305:     register struct type_FTAM_PDU *pdu;
                    306:     register struct type_FTAM_F__CANCEL__request *req;
                    307: 
                    308:     switch (fsb -> fsb_state) {
                    309:        case FSB_DATAREAD:
                    310:        case FSB_DATAWRITE:
                    311:                break;
                    312: 
                    313:        default:
                    314:            return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
                    315:     }
                    316: 
                    317:     pe = NULLPE;
                    318:     if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
                    319: no_mem: ;
                    320:        (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
                    321: out: ;
                    322:        if (pe)
                    323:            pe_free (pe);
                    324:        if (pdu)
                    325:            free_FTAM_PDU (pdu);
                    326:        if (fti -> fti_abort.fta_action == FACTION_PERM)
                    327:            freefsblk (fsb);
                    328:        return NOTOK;
                    329:     }
                    330:     pdu -> offset = type_FTAM_PDU_f__cancel__request;
                    331:     if ((req = (struct type_FTAM_F__CANCEL__request *)
                    332:                        calloc (1, sizeof *req)) == NULL)
                    333:        goto no_mem;
                    334:     pdu -> un.f__cancel__request = req;
                    335:     if ((req -> action__result =
                    336:             (struct type_FTAM_Action__Result *)
                    337:                        calloc (1, sizeof *req -> action__result)) == NULL)
                    338:        goto no_mem;
                    339:     req -> action__result -> parm = action;
                    340:     if (sharedASE
                    341:            && (req -> shared__ASE__information =
                    342:                        shared2fpm (fsb, sharedASE, fti)) == NULL)
                    343:        goto out;
                    344:     if (ndiag > 0
                    345:            && (req -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
                    346:                        == NULL)
                    347:        goto out;
                    348: 
                    349:     if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
                    350:        (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
                    351:                         "error encoding PDU: %s", PY_pepy);
                    352:        goto out;
                    353:     }
                    354: 
                    355:     pe -> pe_context = fsb -> fsb_id;
                    356: 
                    357:     if (fsb -> fsb_srequirements & SR_RESYNC) {
                    358:        fsbtrace (fsb, (fsb -> fsb_fd, "P-RESYNCHRONIZE.REQUEST",
                    359:                        "F-CANCEL-request", pe, 0));
                    360: 
                    361:        settings = 0;           /* XXX: more later! */
                    362: 
                    363:        result = PReSyncRequest (fsb -> fsb_fd, SYNC_ABANDON, SERIAL_NONE,
                    364:                        settings, &pe, 1, pi);
                    365: 
                    366:        prequest = "PReSyncRequest";
                    367:     }
                    368:     else {
                    369:        fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", "F-CANCEL-request",
                    370:                        pe, 0));
                    371: 
                    372:        result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
                    373: 
                    374:        prequest = "PDataRequest";
                    375:     }
                    376: 
                    377:     pe_free (pe);
                    378:     pe = NULLPE;
                    379:     free_FTAM_PDU (pdu);
                    380:     pdu = NULL;
                    381: 
                    382:     if (result == NOTOK) {
                    383:        (void) ps2ftamlose (fsb, fti, prequest, pa);
                    384:        goto out;
                    385:     }
                    386: 
                    387:     fsb -> fsb_flags |= FSB_CANCEL;
                    388:     fsb -> fsb_state = FSB_DATACANCEL;
                    389:     fsb -> fsb_cancelaction = action;
                    390:     if (fsb -> fsb_cancelshared = sharedASE)
                    391:        fsb -> fsb_cancelshared -> pe_refcnt++;
                    392:     fsb -> fsb_canceldiags = diag;
                    393:     fsb -> fsb_cancelndiag = ndiag;
                    394: 
                    395:     return FWaitRequestAux (fsb, NOTOK, fti);
                    396: }
                    397: 
                    398: /*    F-CANCEL.RESPONSE */
                    399: 
                    400: int    FCancelResponse (sd, action, sharedASE, diag, ndiag, fti)
                    401: int    sd;
                    402: int    action;
                    403: PE     sharedASE;
                    404: struct FTAMdiagnostic diag[];
                    405: int    ndiag;
                    406: struct FTAMindication *fti;
                    407: {
                    408:     SBV            smask;
                    409:     int     result;
                    410:     register struct ftamblk *fsb;
                    411: 
                    412:     switch (action) {
                    413:        case FACTION_SUCCESS: 
                    414:        case FACTION_TRANS: 
                    415:        case FACTION_PERM: 
                    416:            break;
                    417: 
                    418:        default: 
                    419:            return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
                    420:                    "bad value for action parameter");
                    421:     }
                    422:     toomuchP (diag, ndiag, NFDIAG, "diagnostic");
                    423:     missingP (fti);
                    424: 
                    425:     smask = sigioblock ();
                    426: 
                    427:     ftamPsig (fsb, sd);
                    428: 
                    429:     result = FCancelResponseAux (fsb, action, sharedASE, diag, ndiag, fti);
                    430: 
                    431:     (void) sigiomask (smask);
                    432: 
                    433:     return result;
                    434: }
                    435: 
                    436: /*  */
                    437: 
                    438: int    FCancelResponseAux (fsb, action, sharedASE, diag, ndiag, fti)
                    439: register struct ftamblk *fsb;
                    440: int    action;
                    441: PE     sharedASE;
                    442: struct FTAMdiagnostic diag[];
                    443: int    ndiag;
                    444: struct FTAMindication *fti;
                    445: {
                    446:     int            result;
                    447:     char   *prequest;
                    448:     PE     pe;
                    449:     struct PSAPindication   pis;
                    450:     struct PSAPindication  *pi = &pis;
                    451:     struct PSAPabort   *pa = &pi -> pi_abort;
                    452:     register struct type_FTAM_PDU *pdu;
                    453:     register struct type_FTAM_F__CANCEL__response *rsp;
                    454: 
                    455:     if (fsb -> fsb_state != FSB_DATACANCEL)
                    456:        return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
                    457: 
                    458:     pe = NULLPE;
                    459:     if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
                    460: no_mem: ;
                    461:        (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
                    462: out: ;
                    463:        if (pe)
                    464:            pe_free (pe);
                    465:        if (pdu)
                    466:            free_FTAM_PDU (pdu);
                    467:        if (fti -> fti_abort.fta_action == FACTION_PERM)
                    468:            freefsblk (fsb);
                    469:        return NOTOK;
                    470:     }
                    471:     pdu -> offset = type_FTAM_PDU_f__cancel__response;
                    472:     if ((rsp = (struct type_FTAM_F__CANCEL__response *)
                    473:                        calloc (1, sizeof *rsp)) == NULL)
                    474:        goto no_mem;
                    475:     pdu -> un.f__cancel__response = rsp;
                    476:     if ((rsp -> action__result =
                    477:             (struct type_FTAM_Action__Result *)
                    478:                        calloc (1, sizeof *rsp -> action__result)) == NULL)
                    479:        goto no_mem;
                    480:     rsp -> action__result -> parm = action;
                    481:     if (sharedASE
                    482:            && (rsp -> shared__ASE__information =
                    483:                        shared2fpm (fsb, sharedASE, fti)) == NULL)
                    484:        goto out;
                    485:     if (ndiag > 0
                    486:            && (rsp -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
                    487:                        == NULL)
                    488:        goto out;
                    489: 
                    490:     if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
                    491:        (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
                    492:                         "error encoding PDU: %s", PY_pepy);
                    493:        goto out;
                    494:     }
                    495: 
                    496:     pe -> pe_context = fsb -> fsb_id;
                    497: 
                    498:     if (fsb -> fsb_srequirements & SR_RESYNC) {
                    499:        fsbtrace (fsb, (fsb -> fsb_fd, "P-RESYNCHRONIZE.RESPONSE",
                    500:                "F-CANCEL-response", pe, 0));
                    501: 
                    502:        result = PReSyncResponse (fsb -> fsb_fd, SERIAL_NONE,
                    503:                        fsb -> fsb_settings, &pe, 1, pi);
                    504: 
                    505:        prequest = "PReSyncResponse";
                    506:     }
                    507:     else {
                    508:        fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", "F-CANCEL-response",
                    509:                pe, 0));
                    510: 
                    511:        result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
                    512: 
                    513:        prequest = "PDataRequest";
                    514:     }
                    515: 
                    516:     pe_free (pe);
                    517:     pe = NULLPE;
                    518:     free_FTAM_PDU (pdu);
                    519:     pdu = NULL;
                    520: 
                    521:     if (result == NOTOK) {
                    522:        (void) ps2ftamlose (fsb, fti, prequest, pa);
                    523:        goto out;
                    524:     }
                    525: 
                    526:     fsb -> fsb_state = FSB_DATAIDLE;
                    527: 
                    528:     return OK;
                    529: }

unix.superglobalmegacorp.com

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