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

1.1       root        1: /* ftam-get.c - interactive initiator FTAM -- "get" */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-get.c,v 7.2 90/07/01 21:03:08 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/ftam2/RCS/ftam-get.c,v 7.2 90/07/01 21:03:08 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       ftam-get.c,v $
                     12:  * Revision 7.2  90/07/01  21:03:08  mrose
                     13:  * pepsy
                     14:  * 
                     15:  * Revision 7.1  90/01/11  23:48:39  mrose
                     16:  * lint
                     17:  * 
                     18:  * Revision 7.0  89/11/23  21:54:17  mrose
                     19:  * Release 6.0
                     20:  * 
                     21:  */
                     22: 
                     23: /*
                     24:  *                               NOTICE
                     25:  *
                     26:  *    Acquisition, use, and distribution of this module and related
                     27:  *    materials are subject to the restrictions of a license agreement.
                     28:  *    Consult the Preface in the User's Manual for the full terms of
                     29:  *    this agreement.
                     30:  *
                     31:  */
                     32: 
                     33: 
                     34: #include <errno.h>
                     35: #include <stdio.h>
                     36: #include "ftamuser.h"
                     37: 
                     38: /*  */
                     39: 
                     40: static int effector;
                     41: 
                     42: int    ubffnx ();
                     43: struct vfsmap *findvf ();
                     44: 
                     45: /*  */
                     46: 
                     47: int    f_get (vec)
                     48: char  **vec;
                     49: {
                     50: #ifndef        BRIDGE
                     51:     int     sglobbed;
                     52:     register char  *bp;
                     53:     register char  *dst,
                     54:                   **gp,
                     55:                   **src;
                     56:     char   *freedst = NULL,
                     57:            buffer[BUFSIZ];
                     58:     struct stat st;
                     59: #endif
                     60:     struct FADUidentity faduids;
                     61:     register struct FADUidentity   *faduid = &faduids;
                     62:     struct vfsmap  *vf = &vfs[tmode];
                     63: 
                     64:     if (vf == &vfs[VFS_DEF]
                     65:            && (!(units & FUNIT_LIMITED)
                     66:                    || (class != FCLASS_MANAGE && class != FCLASS_TM))) {
                     67:        advise (NULLCP,
                     68:                "unable to use \"default\" document type on this association");
                     69:        return OK;
                     70:     }
                     71: 
                     72: #ifdef BRIDGE
                     73:     if (*++vec == NULL)
                     74:        return NOTOK;
                     75: #else
                     76:     if (*++vec == NULL) {
                     77:        if (getline ("source: ", buffer) == NOTOK || str2vec (buffer, vec) < 1)
                     78:            return OK;
                     79:        dst = NULL;
                     80:     }
                     81:     else {
                     82:        register char **ap;
                     83: 
                     84:        for (ap = vec; *ap; ap++)
                     85:            continue;
                     86:        if (--ap != vec)
                     87:            dst = *ap, *ap = NULL;
                     88:        else
                     89:            dst = NULL;
                     90:     }
                     91:     if (!(src = xglob (vec, 1)))
                     92:        return OK;
                     93:     sglobbed = xglobbed;       
                     94: 
                     95:     if (dst == NULL) {
                     96:        if (getline ("destination: ", buffer) == NOTOK) {
                     97:            blkfree (src);
                     98:            return OK;
                     99:        }
                    100:        switch (str2vec (buffer, vec)) {
                    101:            case 0:
                    102:                break;
                    103: 
                    104:            case 1:
                    105:                dst = *vec;
                    106:                break;
                    107: 
                    108:            default:
                    109:                advise (NULLCP, "too many destinations");
                    110:                goto out;
                    111:        }
                    112:     }
                    113:     if (dst && !(dst = freedst = xglob1val (dst, 0)))
                    114:        goto out;
                    115: #endif
                    116: 
                    117:     faduid -> fa_type = FA_FIRSTLAST;
                    118:     faduid -> fa_firstlast = FA_FIRST;
                    119: 
                    120: #ifdef BRIDGE
                    121:     return getvf (*vec, *vec, faduid, vf, ubffnx);
                    122: #else
                    123:     if (src[1] == NULL) {
                    124:        if (interrupted)
                    125:            goto out;
                    126: 
                    127:        if (dst == NULL) {
                    128:            switch (realstore) {
                    129:                case RFS_UNIX: 
                    130:                    if (dst = rindex (*src, '/'))
                    131:                        dst++;
                    132:                    if (dst == NULL || *dst == NULL)
                    133:                        dst = *src;
                    134:                    break;
                    135: 
                    136:                default: 
                    137:                    dst = *src;
                    138:                    break;
                    139:            }
                    140: 
                    141: ask_it: ;
                    142:            if (query)
                    143:                switch (ask ("get %s %s", *src, dst)) {
                    144:                    case NOTOK:
                    145:                        goto out;
                    146: 
                    147:                    case OK:
                    148:                    default:
                    149:                        break;
                    150: 
                    151:                    case DONE:
                    152:                        goto out;
                    153:                }
                    154:        }
                    155:        else
                    156:            if (stat (dst, &st) != NOTOK
                    157:                    && (st.st_mode & S_IFMT) == S_IFDIR) {
                    158: #ifdef apollo
                    159:                 if (*dst == '/')
                    160:                    (void) sprintf (bp = buffer, "%s", dst);
                    161:                 else
                    162: #endif
                    163:                (void) sprintf (bp = buffer, "%s/", dst);
                    164:                bp += strlen (bp);
                    165:                switch (realstore) {
                    166:                    case RFS_UNIX:
                    167:                        if (dst = rindex (*src, '/'))
                    168:                            dst++;
                    169:                        if (dst == NULL || *dst == NULL)
                    170:                            dst = *src;
                    171:                        break;
                    172: 
                    173:                    default:
                    174:                        break;
                    175:                }
                    176:                (void) strcpy (bp, dst);
                    177:                dst = buffer;
                    178:                goto ask_it;
                    179:            }
                    180: 
                    181:        if (check_get (dst) != NOTOK)
                    182:            (void) getvf (*src, dst, faduid, vf, ubffnx);
                    183:        goto out;
                    184:     }
                    185: 
                    186:     switch (realstore) {
                    187:        case RFS_UNKNOWN:
                    188:            advise (NULLCP, "%s", rs_unknown);
                    189:            goto out;
                    190: 
                    191:        case RFS_UNIX:
                    192: #ifdef apollo
                    193:             if (dst && dst[strlen (dst) - 1] == '/')
                    194:                (void) sprintf (bp = buffer, "%s", dst);
                    195:             else
                    196: #endif
                    197:            (void) sprintf (bp = buffer, "%s/", dst ? dst : ".");
                    198:            bp += strlen (bp);
                    199:            break;
                    200: 
                    201:        default:
                    202:            advise (NULLCP, "%s", rs_support);
                    203:            goto out;
                    204:     }
                    205: 
                    206:     if (stat (buffer, &st) == NOTOK) {
                    207:        advise (dst, "unable to stat");
                    208:        goto out;
                    209:     }
                    210:     if ((st.st_mode & S_IFMT) != S_IFDIR) {
                    211:        advise (NULLCP, "%s: not a directory");
                    212:        goto out;
                    213:     }
                    214: 
                    215:     for (gp = src; *gp && !interrupted; gp++) {
                    216:        switch (realstore) {
                    217:            case RFS_UNIX:
                    218:                if (dst = rindex (*gp, '/'))
                    219:                    dst++;
                    220:                if (dst == NULL || *dst == NULL)
                    221:                    dst = *gp;
                    222:                break;
                    223: 
                    224:            default:
                    225:                dst = *gp;
                    226:                break;
                    227:        }
                    228:        (void) strcpy (bp, dst);
                    229:        dst = buffer;
                    230: 
                    231:        if (sglobbed) {
                    232:            if (query)
                    233:                switch (ask ("get %s %s", *gp, dst)) {
                    234:                    case NOTOK:
                    235:                        continue;
                    236: 
                    237:                    case OK:
                    238:                    default:
                    239:                        break;
                    240: 
                    241:                    case DONE:
                    242:                        goto out;
                    243:                }
                    244:            else
                    245:                advise (NULLCP, "get %s %s", *gp, dst);
                    246:        }
                    247: 
                    248:        if (check_get (dst) == NOTOK)
                    249:            break;
                    250:        (void) getvf (*gp, dst, faduid, vf, ubffnx);
                    251: 
                    252:        if (ftamfd == NOTOK)
                    253:            break;
                    254:     }
                    255: 
                    256: out: ;
                    257:     blkfree (src);
                    258:     if (freedst)
                    259:        free (freedst);
                    260: 
                    261:     return OK;
                    262: #endif
                    263: }
                    264: 
                    265: /*  */
                    266: 
                    267: #ifndef        BRIDGE
                    268: static int  check_get (dst)
                    269: char   *dst;
                    270: {
                    271:     int            result;
                    272:     register char  *cp;
                    273: 
                    274:     if ((result = access (dst, W_OK)) == NOTOK && errno == ENOENT)
                    275:        if (cp = rindex (dst, '/')) {
                    276:            *cp = NULL;
                    277:            result = access (*dst ? dst : "/", W_OK);
                    278:            *cp = '/';
                    279:        }
                    280:        else
                    281:            result = access (".", W_OK);
                    282:     if (result == OK)
                    283:        return result;
                    284: 
                    285:     advise (dst, "unable to write");
                    286: 
                    287:     return result;
                    288: }
                    289: #endif
                    290: 
                    291: /*  */
                    292: 
                    293: int    getvf (src, dst, faduid, vf, wfnx)
                    294: char   *src,
                    295:        *dst;
                    296: register struct FADUidentity *faduid;
                    297: register struct vfsmap *vf;
                    298: IFP    wfnx;
                    299: {
                    300:     int            fd,
                    301:            result;
                    302: #ifdef BRIDGE
                    303:     int     ftp_result;
                    304: #endif
                    305:     PE     param;
                    306:     struct FTAMgroup    ftgs;
                    307:     register struct FTAMgroup  *ftg = &ftgs;
                    308:     struct FTAMindication   ftis;
                    309:     register struct FTAMindication *fti = &ftis;
                    310:     register struct FTAMabort *fta = &fti -> fti_abort;
                    311: 
                    312:     if (vf == &vfs[VFS_DEF]) {
                    313:        if (!(vf = findvf (src))) {
                    314:            vf = &vfs[VFS_UBF];
                    315:            advise (NULLCP,
                    316:                "unable to determine document type associated with %s", src);
                    317:            /* most likely reason: the file isn't there... */
                    318: 
                    319:            if (vf -> vf_oid == NULLOID || !(vf -> vf_flags & VF_OK))
                    320:                return NOTOK;
                    321:            advise (NULLCP, "proposing %s transfer", vf -> vf_text);
                    322:        }
                    323:        else
                    324:            if (vf == &vfs[VFS_FDF]) {
                    325:                advise (NULLCP, "%s is a %s", src, vf -> vf_text);
                    326:                return NOTOK;
                    327:            }
                    328:     }
                    329:     else
                    330:        if (vf -> vf_oid == NULLOID || !(vf -> vf_flags & VF_OK)) {
                    331:            advise (NULLCP, "no support for %ss", vf -> vf_text);
                    332:            return NOTOK;
                    333:        }
                    334: 
                    335:     bzero ((char *) ftg, sizeof *ftg);
                    336:     ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
                    337:     ftg -> ftg_threshold = 0;
                    338: 
                    339:     ftg -> ftg_flags |= FTG_SELECT;
                    340:     {
                    341:        register struct FTAMselect *ftse = &ftg -> ftg_select;
                    342:        register struct FTAMattributes *fa = &ftse -> ftse_attrs;
                    343: 
                    344:        fa -> fa_present = FA_FILENAME;
                    345:        fa -> fa_nfile = 0;
                    346:        fa -> fa_files[fa -> fa_nfile++] = src;
                    347: 
                    348:        ftse -> ftse_access = FA_PERM_READ;
                    349:        FCINIT (&ftse -> ftse_conctl);
                    350:     }
                    351:     ftg -> ftg_threshold++;
                    352: 
                    353:     param = NULLPE;
                    354: 
                    355:     ftg -> ftg_flags |= FTG_OPEN;
                    356:     {
                    357:        register struct FTAMopen *ftop = &ftg -> ftg_open;
                    358: 
                    359:        ftop -> ftop_mode = FA_PERM_READ;
                    360:        ftop -> ftop_contents = vf -> vf_oid;
                    361:        if (vf -> vf_parameter) {
                    362:            if (enc_f (vf -> vf_number, &_ZDOCS_mod, &param, 1, 0, NULLCP,
                    363:                      vf -> vf_parameter) == NOTOK) {
                    364:                advise (NULLCP, "unable to build document type parameter: %s",
                    365:                        PY_pepy);
                    366:                return NOTOK;
                    367:            }
                    368:            ftop -> ftop_parameter = param;
                    369:        }       
                    370:        FCINIT (&ftop -> ftop_conctl);
                    371:        ftop -> ftop_conctl.fc_readlock = FLOCK_SHARED;
                    372:     }
                    373:     ftg -> ftg_threshold++;
                    374: 
                    375:     result = FBulkBeginRequest (ftamfd, ftg, fti);
                    376: 
                    377:     if (param)
                    378:        pe_free (param);
                    379: 
                    380:     if (result == NOTOK) {
                    381:        ftam_advise (&fti -> fti_abort, "F-BULK-BEGIN.REQUEST");
                    382:        return NOTOK;
                    383:     }
                    384: 
                    385:     ftg = &fti -> fti_group;
                    386: 
                    387:     if (ftg -> ftg_flags & FTG_SELECT) {
                    388:        register struct FTAMselect *ftse = &ftg -> ftg_select;
                    389: 
                    390:        ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1,
                    391:                ftse -> ftse_action);
                    392:        if (ftse -> ftse_state != FSTATE_SUCCESS)
                    393:            goto you_lose;
                    394:     }
                    395: 
                    396:     if (ftg -> ftg_flags & FTG_OPEN) {
                    397:        register struct FTAMopen *ftop = &ftg -> ftg_open;
                    398: 
                    399:        ftam_diag (ftop -> ftop_diags, ftop -> ftop_ndiag, 1,
                    400:                ftop -> ftop_action);
                    401:        if (ftop -> ftop_state != FSTATE_SUCCESS)
                    402:            goto you_lose;
                    403: 
                    404:        for (myvf = vfs; myvf -> vf_entry; myvf++)
                    405:            if (oid_cmp (myvf -> vf_oid, ftop -> ftop_contents) == 0)
                    406:                break;
                    407:        switch (myvf - vfs) {
                    408:            case VFS_UBF:
                    409:            case VFS_UTF:
                    410:                effector = 1;
                    411:                if (ftop -> ftop_parameter && myvf -> vf_number >= 0) {
                    412:                    caddr_t parm = NULL;
                    413: 
                    414:                    if (dec_f (myvf -> vf_number, &_ZDOCS_mod,
                    415:                              ftop -> ftop_parameter, 1, NULLIP, NULLVP,
                    416:                               (char **) &parm) == NOTOK)
                    417:                        advise (NULLCP,
                    418:                                "unable to parse document type parameter: %s",
                    419:                                PY_pepy);
                    420:                    else
                    421:                        switch (myvf - vfs) {
                    422:                            case VFS_UTF:
                    423:                                {
                    424:                                    PElementID  id;
                    425:                                    register struct type_DOCS_FTAM__1__Parameters *p1 =
                    426:                                        (struct type_DOCS_FTAM__1__Parameters *)
                    427:                                                        parm;
                    428: 
                    429:                                    if (p1 -> optionals
                    430:                                            & opt_DOCS_FTAM__1__Parameters_universal__class__number)
                    431:                                        id = (PElementID)
                    432:                                                p1 -> universal__class__number;
                    433:                                    else
                    434:                                        id = PE_DEFN_GFXS;
                    435:                                    switch (id) {
                    436:                                        case PE_DEFN_GFXS:
                    437:                                            if (getenv ("HP-FTAM")) {
                    438:                                                effector = 1;
                    439:                                                break;
                    440:                                            }   /* else fall... */
                    441:                                        case PE_DEFN_PRTS:
                    442:                                        case PE_DEFN_VISS:
                    443:                                            effector = 0;
                    444:                                            break;
                    445: 
                    446:                                        case PE_DEFN_T61S:
                    447:                                        case PE_DEFN_VTXS:
                    448:                                        case PE_DEFN_IA5S:
                    449:                                        case PE_DEFN_GENS:
                    450:                                            effector = 1;
                    451:                                            break;
                    452: 
                    453:                                        default:
                    454:                                            break;
                    455:                                    }
                    456:                                }
                    457:                                break;
                    458: 
                    459:                            case VFS_UBF:
                    460:                            default:
                    461:                                break;
                    462:                        }
                    463:                    if (parm)
                    464:                        fre_obj (parm, _ZDOCS_mod.md_dtab[myvf -> vf_number],
                    465:                                 &_ZDOCS_mod);
                    466:                }
                    467:                if (debug)
                    468:                    advise (NULLCP, "effector=%d", effector);
                    469:                /* and fall... */
                    470:            case VFS_FDF:
                    471:                if (myvf != vf || watch) {
                    472:                    advise (NULLCP, "%s transfer", myvf -> vf_text);
                    473:                    vf = myvf;
                    474:                }
                    475:                break;
                    476: 
                    477:            default:
                    478:                vf = &vfs[VFS_UBF];
                    479:                advise (NULLCP, "document type mismatch; assuming %s (%s)",
                    480:                                vf -> vf_text, vf -> vf_entry);
                    481:                break;
                    482:        }
                    483:     }
                    484:     myvf = vf;
                    485: 
                    486:     FTGFREE (ftg);
                    487: 
                    488:     if (FReadWriteRequest (ftamfd, FA_OPS_READ, faduid, myvf -> vf_context,
                    489:                NOTOK, 0, fti) == NOTOK) {
                    490:        ftam_advise (fta, "F-READWRITE.REQUEST");
                    491:        return NOTOK;
                    492:     }
                    493: 
                    494:     if (dst) {
                    495: #ifdef BRIDGE
                    496:        if ((fd = dataconn(dst)) == NOTOK) {
                    497: #else
                    498:        if ((fd = open (dst, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == NOTOK) {
                    499: #endif
                    500:            struct FTAMdiagnostic   diags[NFDIAG];
                    501:            register struct FTAMdiagnostic *dp = diags;
                    502: 
                    503:            advise (dst, "unable to write");
                    504: #ifdef BRIDGE
                    505:            ftp_result = DONE;
                    506: #endif
                    507: 
                    508:            dp -> ftd_type = DIAG_PERM;
                    509:            dp -> ftd_identifier = FS_ACC_LCL;
                    510:            dp -> ftd_observer = dp -> ftd_source = EREF_IFSU;
                    511:            dp -> ftd_delay = DIAG_NODELAY;
                    512:            (void) sprintf (dp -> ftd_data, "unable to write %s: %s",
                    513:                    dst, sys_errname (errno));
                    514:            dp -> ftd_cc = strlen (dp -> ftd_data);
                    515:            dp++;
                    516: 
                    517:            if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags,
                    518:                                dp - diags, fti) == NOTOK) {
                    519:                ftam_advise (fta, "F-CANCEL.REQUEST");
                    520:                if (fd != NOTOK)
                    521:                    (void) close (fd);
                    522:                return NOTOK;
                    523:            }
                    524: 
                    525:            if (fti -> fti_type == FTI_CANCEL) {
                    526:                register struct FTAMcancel *ftcn = &fti -> fti_cancel;
                    527: 
                    528:                ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
                    529:                        ftcn -> ftcn_action);
                    530:                FTCNFREE (ftcn);
                    531:            }
                    532: 
                    533:            goto done_transfer;
                    534:        }
                    535:     }
                    536:     else
                    537:        fd = NOTOK;
                    538: 
                    539:     if (fd != NOTOK)
                    540:        (*wfnx) (fd, (struct PSAPdata *) 0, OK);
                    541: 
                    542:     result = getloop (fd, dst, wfnx);
                    543: 
                    544:     if (fd != NOTOK) {
                    545:        (*wfnx) (fd, (struct PSAPdata *) 0, DONE);
                    546:        (void) close (fd);
                    547:     }
                    548:     
                    549:     switch (result) {
                    550:        case NOTOK: 
                    551:            return NOTOK;
                    552: 
                    553:        case OK: 
                    554:        default: 
                    555:            break;
                    556: 
                    557:        case DONE: 
                    558:            goto done_transfer;
                    559:     }
                    560: 
                    561:     if (FTransEndRequest (ftamfd, NULLPE, fti) == NOTOK) {
                    562:        ftam_advise (fta, "F-TRANSFER-END.REQUEST");
                    563:        return NOTOK;
                    564:     }
                    565: 
                    566:     switch (fti -> fti_type) {
                    567:        case FTI_TRANSEND:
                    568:            {
                    569:                register struct FTAMtransend *ftre = &fti -> fti_transend;
                    570: 
                    571:                ftam_diag (ftre -> ftre_diags, ftre -> ftre_ndiag, 1,
                    572:                           ftre -> ftre_action);
                    573:                FTREFREE (ftre);
                    574:            }
                    575:            break;
                    576: 
                    577:        case FTI_CANCEL:
                    578:            {
                    579:                register struct FTAMcancel *ftcn = &fti -> fti_cancel;
                    580:                
                    581:                advise (NULLCP, "data transfer cancelled!");
                    582:                ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1, 
                    583:                        ftcn -> ftcn_action);
                    584:                FTCNFREE (ftcn);
                    585: 
                    586:                if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE, 
                    587:                            (struct FTAMdiagnostic *) 0, 0, fti)
                    588:                        == NOTOK) {
                    589:                    ftam_advise (fta, "F-CANCEL.RESPONSE");
                    590:                    return NOTOK;
                    591:                }
                    592:            }
                    593:            break;
                    594: 
                    595:        default:
                    596:            adios (NULLCP, "unexpected indication type=%d", fti -> fti_type);
                    597:     }
                    598: #ifdef BRIDGE
                    599:     ftp_result = OK;
                    600: #endif
                    601: 
                    602: done_transfer: ;
                    603:     ftg = &ftgs;
                    604:     bzero ((char *) ftg, sizeof *ftg);
                    605:     ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
                    606:     ftg -> ftg_threshold = 0;
                    607: 
                    608:     ftg -> ftg_flags |= FTG_CLOSE;
                    609:     ftg -> ftg_threshold++;
                    610: 
                    611:     ftg -> ftg_flags |= FTG_DESELECT;
                    612:     ftg -> ftg_threshold++;
                    613: 
                    614:     if (FBulkEndRequest (ftamfd, ftg, fti) == NOTOK) {
                    615:        ftam_advise (fta, "F-BULK-END.REQUEST");
                    616:        return NOTOK;
                    617:     }
                    618: 
                    619:     ftg = &fti -> fti_group;
                    620: 
                    621:     if (ftg -> ftg_flags & FTG_CLOSE) {
                    622:        register struct FTAMclose     *ftcl = &ftg -> ftg_close;
                    623: 
                    624:        ftam_diag (ftcl -> ftcl_diags, ftcl -> ftcl_ndiag, 1,
                    625:                ftcl -> ftcl_action);
                    626:     }
                    627: 
                    628:     if (ftg -> ftg_flags & FTG_DESELECT) {
                    629:        register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
                    630: 
                    631:        ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
                    632:                ftde -> ftde_action);
                    633:        ftam_chrg (&ftde -> ftde_charges);
                    634:     }
                    635: 
                    636:     FTGFREE (ftg);
                    637: #ifdef BRIDGE
                    638:     return ftp_result;
                    639: #else
                    640:     return OK;
                    641: #endif
                    642: 
                    643: you_lose: ;
                    644:     FTGFREE (ftg);
                    645:     return NOTOK;
                    646: }
                    647: 
                    648: /*  */
                    649: 
                    650: static struct vfsmap *findvf (file)
                    651: char   *file;
                    652: {
                    653:     struct FTAMgroup    ftgs;
                    654:     register struct FTAMgroup  *ftg = &ftgs;
                    655:     struct FTAMindication   ftis;
                    656:     register struct FTAMindication *fti = &ftis;
                    657:     struct vfsmap *vf;
                    658: 
                    659:     bzero ((char *) ftg, sizeof *ftg);
                    660:     ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
                    661:     ftg -> ftg_threshold = 0;
                    662: 
                    663:     ftg -> ftg_flags |= FTG_SELECT;
                    664:     {
                    665:        register struct FTAMselect *ftse = &ftg -> ftg_select;
                    666:        register struct FTAMattributes *fa = &ftse -> ftse_attrs;
                    667: 
                    668:        fa -> fa_present = FA_FILENAME;
                    669:        fa -> fa_nfile = 0;
                    670:        fa -> fa_files[fa -> fa_nfile++] = file;
                    671: 
                    672:        ftse -> ftse_access = FA_PERM_READATTR;
                    673:        FCINIT (&ftse -> ftse_conctl);
                    674:     }
                    675:     ftg -> ftg_threshold++;
                    676: 
                    677:     ftg -> ftg_flags |= FTG_RDATTR;
                    678:     {
                    679:        register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
                    680: 
                    681:        ftra -> ftra_attrnames = FA_FILENAME | FA_CONTENTS;
                    682:     }
                    683:     ftg -> ftg_threshold++;
                    684: 
                    685:     ftg -> ftg_flags |= FTG_DESELECT;
                    686:     ftg -> ftg_threshold++;
                    687: 
                    688:     if (FManageRequest (ftamfd, ftg, fti) == NOTOK) {
                    689:        ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST");
                    690:        return NULL;
                    691:     }
                    692: 
                    693:     ftg = &fti -> fti_group;
                    694: 
                    695:     if (ftg -> ftg_flags & FTG_SELECT) {
                    696:        register struct FTAMselect *ftse = &ftg -> ftg_select;
                    697: 
                    698:        if (debug)
                    699:            ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1,
                    700:                    ftse -> ftse_action);
                    701:        if (ftse -> ftse_state != FSTATE_SUCCESS)
                    702:            goto you_lose;
                    703:     }
                    704: 
                    705:     vf = NULL;
                    706:     if (ftg -> ftg_flags & FTG_RDATTR) {
                    707:        register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
                    708:        register struct FTAMattributes *fa = &ftra -> ftra_attrs;
                    709: 
                    710:        if (debug)
                    711:            ftam_diag (ftra -> ftra_diags, ftra -> ftra_ndiag, 1,
                    712:                    ftra -> ftra_action);
                    713:        if (ftra -> ftra_action != FACTION_SUCCESS)
                    714:            fa -> fa_present = 0;
                    715: 
                    716:        if (fa -> fa_present & FA_CONTENTS) {
                    717:            for (vf = vfs; vf -> vf_entry; vf++)
                    718:                if (vf -> vf_oid
                    719:                        && (vf -> vf_flags & VF_OK)
                    720:                        && oid_cmp (vf -> vf_oid, fa -> fa_contents) == 0) {
                    721:                    if (fa -> fa_parameter && vf -> vf_number >= 0) {
                    722:                        if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
                    723:                            fre_obj (vf -> vf_parameter,
                    724:                                     _ZDOCS_mod.md_dtab[vf -> vf_number],
                    725:                                     &_ZDOCS_mod);
                    726:                        vf -> vf_parameter = NULL, vf -> vf_flags &= ~VF_PARM;
                    727:                        if (dec_f (vf -> vf_number, &_ZDOCS_mod,
                    728:                                   fa -> fa_parameter, 1, NULLIP, NULLVP,
                    729:                                   &vf -> vf_parameter) == NOTOK) {
                    730:                            advise (NULLCP,
                    731:                                 "unable to parse document type parameter: %s",
                    732:                                    PY_pepy);
                    733:                            vf = NULL;
                    734:                        }
                    735:                        else
                    736:                            if (vf -> vf_check
                    737:                                    && (*vf -> vf_check) (vf -> vf_parameter,
                    738:                                                          PY_pepy) == NOTOK) {
                    739:                                advise (NULLCP, "%s", PY_pepy);
                    740:                                vf = NULL;
                    741:                            }
                    742:                    }
                    743:                    break;
                    744:                }
                    745:            if (!vf -> vf_entry) {
                    746:                advise (NULLCP,
                    747:                        "unknown document type %s associated with %s",
                    748:                        sprintoid (fa -> fa_contents), file);
                    749:                vf = NULL;
                    750:            }
                    751:        }
                    752:     }
                    753: 
                    754:     if (ftg -> ftg_flags & FTG_DESELECT) {
                    755:        register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
                    756: 
                    757:        if (debug) {
                    758:            ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
                    759:                ftde -> ftde_action);
                    760:            ftam_chrg (&ftde -> ftde_charges);
                    761:        }
                    762:     }
                    763: 
                    764:     FTGFREE (ftg);
                    765:     return vf;
                    766: 
                    767: you_lose: ;
                    768:     FTGFREE (ftg);
                    769:     return NULL;
                    770: }
                    771: 
                    772: /*  */
                    773: 
                    774: static int  getloop (fd, dst, wfnx)
                    775: int    fd;
                    776: char   *dst;
                    777: IFP    wfnx;
                    778: {
                    779:     int            reason,
                    780:            result;
                    781:     struct FTAMindication   ftis;
                    782:     register struct FTAMindication *fti = &ftis;
                    783:     register struct FTAMabort  *fta = &fti -> fti_abort;
                    784: 
                    785:     for (;;) {
                    786:        if (!interrupted) {
                    787:            int     nfds;
                    788:            fd_set  rfds;
                    789: 
                    790:            nfds = 0;
                    791:            FD_ZERO (&rfds);
                    792:                                        /* interrupt causes EINTR */
                    793:            if (FSelectMask (ftamfd, &rfds, &nfds, fti) == OK)
                    794:                (void) xselect (nfds, &rfds, NULLFD, NULLFD, NOTOK);
                    795:        }
                    796: 
                    797:        if (interrupted) {
                    798:            advise (NULLCP, "cancelling transfer");
                    799:            reason = FS_GEN_INITIATOR;
                    800:            errno = EINTR;
                    801:            goto do_cancel;
                    802:        }
                    803:        
                    804:        switch (result = FWaitRequest (ftamfd, NOTOK, fti)) {
                    805:            case NOTOK: 
                    806:                ftam_advise (&fti -> fti_abort, "F-WAIT.REQUEST");
                    807:                return NOTOK;
                    808: 
                    809:            case OK: 
                    810:            case DONE: 
                    811:                break;
                    812: 
                    813:            default: 
                    814:                adios (NULLCP, "unknown return from FWaitRequest=%d",
                    815:                        result);
                    816:        }
                    817: 
                    818:        switch (fti -> fti_type) {
                    819:            case FTI_DATA: 
                    820:                if ((*wfnx) (fd, &fti -> fti_data, OK) == NOTOK) {
                    821:                    struct FTAMdiagnostic   diags[NFDIAG];
                    822:                    register struct FTAMdiagnostic *dp;
                    823: 
                    824:                    advise (dst, "error writing");
                    825:                    reason = FS_ACC_WRITE;
                    826: 
                    827: do_cancel: ;
                    828:                    dp = diags;
                    829: 
                    830:                    dp -> ftd_type = DIAG_PERM;
                    831:                    dp -> ftd_identifier = reason;
                    832:                    dp -> ftd_observer = dp -> ftd_source = EREF_IFSU;
                    833:                    dp -> ftd_delay = DIAG_NODELAY;
                    834:                    (void) strcpy (dp -> ftd_data, sys_errname (errno));
                    835:                    dp -> ftd_cc = strlen (dp -> ftd_data);
                    836:                    dp++;
                    837: 
                    838:                    if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags,
                    839:                            dp - diags, fti) == NOTOK) {
                    840:                        ftam_advise (fta, "F-CANCEL.REQUEST");
                    841:                        return NOTOK;
                    842:                    }
                    843: 
                    844:                    if (fti -> fti_type == FTI_CANCEL) {
                    845:                        register struct FTAMcancel *ftcn = &fti -> fti_cancel;
                    846: 
                    847:                        ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
                    848:                                    ftcn -> ftcn_action);
                    849:                        FTCNFREE (ftcn);
                    850:                    }
                    851: 
                    852:                    return DONE;
                    853:                }
                    854:                break;
                    855: 
                    856:            case FTI_DATAEND: 
                    857:                return OK;
                    858: 
                    859:            case FTI_CANCEL: 
                    860:                {
                    861:                    register struct FTAMcancel *ftcn = &fti -> fti_cancel;
                    862:                
                    863:                    advise (NULLCP, "data transfer cancelled!");
                    864:                    ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
                    865:                            ftcn -> ftcn_action);
                    866:                    FTCNFREE (ftcn);
                    867: 
                    868:                    if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE, 
                    869:                                (struct FTAMdiagnostic *) 0, 0, fti)
                    870:                            == NOTOK) {
                    871:                        ftam_advise (fta, "F-CANCEL.RESPONSE");
                    872:                        return NOTOK;
                    873:                    }
                    874:                }
                    875:                return DONE;
                    876: 
                    877:            default: 
                    878:                adios (NULLCP, "unexpected indication type=%d",
                    879:                        fti -> fti_type);
                    880:        }
                    881:     }
                    882: }
                    883: 
                    884: /*  */
                    885: 
                    886: static int  ubffnx (fd, px, status)
                    887: int    fd;
                    888: register struct PSAPdata *px;
                    889: int    status;
                    890: {
                    891:     register int    i,
                    892:                    n;
                    893:     register PE            pe,
                    894:                   *pep;
                    895:     static int     cc;
                    896: 
                    897:     if (px == NULL) {
                    898:        switch (status) {
                    899:            case OK:
                    900:            default:
                    901:                cc = 0;
                    902:                if (verbose)
                    903:                    timer (cc, NULLCP);
                    904:                if (hash)
                    905:                    marks = BUFSIZ - 1;
                    906:                break;
                    907: 
                    908:            case DONE:
                    909:                if (verbose)
                    910:                    timer (cc, "received");
                    911:                break;
                    912:        }
                    913: 
                    914:        return OK;
                    915:     }
                    916: 
                    917:     for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) {
                    918:        if ((pe = *pep) == NULLPE)
                    919:            continue;
                    920: 
                    921:        switch (myvf - vfs) {
                    922:            case VFS_UBF:
                    923:            default:
                    924:                if (debug)
                    925:                    WATCHP (DOCS_FTAM__3__Datatype1, pe, 1);
                    926:                n = de2fd (fd, pe, 0, 0);
                    927:                break;
                    928: 
                    929:            case VFS_UTF:
                    930:                if (debug)
                    931:                    WATCHP (DOCS_FTAM__1__Datatype1, pe, 1);
                    932:                n = de2fd (fd, pe, 1, effector);
                    933:                break;
                    934:        }
                    935:        if (n == NOTOK)
                    936:            break;
                    937: 
                    938:        if (verbose || hash)
                    939:            cc += n;
                    940:        if (hash) {
                    941:            if (hash > 1)
                    942:                printf ("%d\r", cc);
                    943:            else
                    944:                for (; marks < cc; marks += BUFSIZ)
                    945:                    (void) putchar ('#');
                    946:            (void) fflush (stdout);
                    947:        }
                    948:     }
                    949: 
                    950:     PXFREE (px);
                    951: 
                    952:     return n;
                    953: }

unix.superglobalmegacorp.com

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