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

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

unix.superglobalmegacorp.com

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