Annotation of 43BSDReno/contrib/isode-beta/ftam2/ftamd-trans.c, revision 1.1

1.1     ! root        1: /* ftamd-trans.c - FTAM responder -- transfer */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamd-trans.c,v 7.2 90/07/01 21:03:28 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/ftam2/RCS/ftamd-trans.c,v 7.2 90/07/01 21:03:28 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       ftamd-trans.c,v $
        !            12:  * Revision 7.2  90/07/01  21:03:28  mrose
        !            13:  * pepsy
        !            14:  * 
        !            15:  * Revision 7.1  90/01/16  20:43:01  mrose
        !            16:  * last check-out
        !            17:  * 
        !            18:  * Revision 7.0  89/11/23  21:54:33  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: #include <stdio.h>
        !            34: #include "FTAM-types.h"
        !            35: #include "ftamsystem.h"
        !            36: #if    defined(SYS5) && !defined(HPUX)
        !            37: #include <sys/times.h>
        !            38: #define        TMS
        !            39: #endif
        !            40: 
        !            41: /*    DATA */
        !            42: 
        !            43: static int  nbytes;
        !            44: 
        !            45: long   lseek ();
        !            46: 
        !            47: 
        !            48: /*    TRANSFER */
        !            49: 
        !            50: int    ftam_bulkbeginindication (ftg)
        !            51: struct FTAMgroup *ftg;
        !            52: {
        !            53:     int            state;
        !            54:     struct FTAMgroup    ftms;
        !            55:     struct FTAMgroup   *ftm = &ftms;
        !            56:     struct FTAMindication   ftis;
        !            57:     register struct FTAMindication *fti = &ftis;
        !            58: 
        !            59:     ftam_selection (ftg, ftm);
        !            60: 
        !            61:     if (ftm -> ftg_flags & FTG_SELECT)
        !            62:        state = ftm -> ftg_select.ftse_state;
        !            63:     else
        !            64:        state = ftm -> ftg_create.ftce_state;
        !            65:     if ((state != FSTATE_SUCCESS
        !            66:                || ((ftm -> ftg_flags & FTG_OPEN)
        !            67:                        && ftm -> ftg_open.ftop_state != FSTATE_SUCCESS))
        !            68:            && myfd != NOTOK) {
        !            69: #ifndef        BRIDGE
        !            70:        unlock ();
        !            71: #endif
        !            72:        (void) close (myfd);
        !            73:        myfd = NOTOK;
        !            74:     }
        !            75: 
        !            76:     if (FBulkBeginResponse (ftamfd, ftm, fti) == NOTOK)
        !            77:        ftam_adios (&fti -> fti_abort, "F-BULK-BEGIN.RESPONSE");
        !            78: 
        !            79:     FTGFREE (ftg);
        !            80: }
        !            81: 
        !            82: /*  */
        !            83: 
        !            84: /* we really pay the price here for not keeping more constraint set
        !            85:    information in the vfs structure...
        !            86: 
        !            87:    regular files have the unstructured constraint set
        !            88:        access context US
        !            89: 
        !            90:    directory files have the sequential flat constraint set
        !            91:        access context UA (is forced)
        !            92: 
        !            93:    Hence, when FADUs are transmitted, only data elements of type
        !            94: 
        !            95:        File-Contents-Data-Element
        !            96: 
        !            97:    are sent.
        !            98: */
        !            99: 
        !           100: 
        !           101: int    ftam_readwriteindication (ftrw)
        !           102: struct FTAMreadwrite *ftrw;
        !           103: {
        !           104:     int            result;
        !           105:     register struct FADUidentity *fa = &ftrw -> ftrw_identity;
        !           106:     struct FTAMdiagnostic   diags[NFDIAG];
        !           107:     struct FTAMdiagnostic *dp = diags;
        !           108:     struct FTAMindication   ftis;
        !           109:     register struct FTAMindication *fti = &ftis;
        !           110: 
        !           111:     mylocation = *fa;          /* struct copy */
        !           112:     mylevel = ftrw -> ftrw_level;
        !           113:     
        !           114: #ifdef BRIDGE
        !           115:     myoperation = ftrw -> ftrw_operation; 
        !           116:     if (ftp_type (myvf - vfs) == NOTOK
        !           117:            && myoperation == FA_OPS_READ
        !           118:            && (mycontext = ftrw -> ftrw_context) != myvf -> vf_context) {
        !           119: #else
        !           120:     if ((myoperation = ftrw -> ftrw_operation) == FA_OPS_READ
        !           121:            && (mycontext = ftrw -> ftrw_context) != myvf -> vf_context) {
        !           122: #endif
        !           123:        dp -> ftd_type = DIAG_PERM;
        !           124:        dp -> ftd_identifier = FS_ACC_CTXSUPRT;
        !           125:        dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           126:        dp -> ftd_delay = DIAG_NODELAY;
        !           127:        dp -> ftd_cc = 0;
        !           128:        dp++;
        !           129: 
        !           130:        goto do_cancel;
        !           131:     }
        !           132: 
        !           133:     switch (myvf - vfs) {
        !           134:        case VFS_UBF: 
        !           135:        case VFS_UTF: 
        !           136:        default: 
        !           137:            if (fa -> fa_type != FA_FIRSTLAST
        !           138:                    || fa -> fa_firstlast != FA_FIRST) {
        !           139:                dp -> ftd_type = DIAG_PERM;
        !           140:                dp -> ftd_identifier = FS_ACC_FADULOC;
        !           141:                dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
        !           142:                dp -> ftd_delay = DIAG_NODELAY;
        !           143:                dp -> ftd_cc = 0;
        !           144:                dp++;
        !           145: 
        !           146:                goto do_cancel;
        !           147:            }
        !           148:            break;
        !           149:     }
        !           150: 
        !           151:     switch (myoperation) {
        !           152:        case FA_OPS_READ:
        !           153:        default:
        !           154:            advise (LLOG_NOTICE, NULLCP, "read %s", myfile);
        !           155:            break;
        !           156: 
        !           157:        case FA_OPS_INSERT:     /* not valid on an FDF */
        !           158:            dp -> ftd_type = DIAG_PERM;
        !           159:            dp -> ftd_identifier = FS_ACC_INSERT;
        !           160:            dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           161:            dp -> ftd_delay = DIAG_NODELAY;
        !           162:            dp -> ftd_cc = 0;
        !           163:            dp++;
        !           164:            goto do_cancel;
        !           165: 
        !           166:        case FA_OPS_REPLACE:
        !           167: #ifdef BRIDGE
        !           168:            if ((myfd = ftp_write (myfile)) == NOTOK) {
        !           169: #else
        !           170:            if (statok && myst.st_size == 0)
        !           171:                goto replace;
        !           172: #ifdef SUNOS4
        !           173:            if (ftruncate (myfd, (off_t) 0) == NOTOK) {
        !           174: #else
        !           175:            if (ftruncate (myfd, 0) == NOTOK) {
        !           176: #endif
        !           177: #endif
        !           178: bad_operation: ;
        !           179:                dp -> ftd_type = DIAG_PERM;
        !           180:                dp -> ftd_identifier = myoperation == FA_OPS_REPLACE
        !           181:                                            ? FS_ACC_REPLACE : FS_ACC_INSERT;
        !           182:                dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           183:                dp -> ftd_delay = DIAG_NODELAY;
        !           184: #ifdef BRIDGE
        !           185:                (void) strcpy (dp -> ftd_data, ftp_error);
        !           186: #else
        !           187:                (void) strcpy (dp -> ftd_data, sys_errname (errno));
        !           188: #endif
        !           189:                dp -> ftd_cc = strlen (dp -> ftd_data);
        !           190:                dp++;
        !           191:                goto do_cancel;
        !           192:            }
        !           193: #ifndef        BRIDGE
        !           194: replace: ;
        !           195: #endif
        !           196:            advise (LLOG_NOTICE, NULLCP, "replace %s", myfile);
        !           197:            break;
        !           198: 
        !           199:        case FA_OPS_EXTEND:
        !           200: #ifdef BRIDGE
        !           201:            if ((myfd = ftp_append (myfile)) == NOTOK)
        !           202: #else
        !           203:            if (lseek (myfd, 0L, L_XTND) == (long) NOTOK)
        !           204: #endif
        !           205:                goto bad_operation;
        !           206:            advise (LLOG_NOTICE, NULLCP, "extend %s", myfile);
        !           207:            break;
        !           208:     }
        !           209: 
        !           210:     FTRWFREE (ftrw);
        !           211: 
        !           212:     timer (nbytes = 0, NULLCP);
        !           213:     if (myoperation != FA_OPS_READ)
        !           214:        return;
        !           215: 
        !           216:     switch (myvf - vfs) {
        !           217:        case VFS_UTF:
        !           218:        case VFS_UBF:
        !           219:        default:
        !           220:            result = uxfget (&dp);
        !           221:            break;
        !           222: 
        !           223:        case VFS_FDF:
        !           224:            result = fdfget (&dp);
        !           225:            break;
        !           226:     }
        !           227: 
        !           228:     if (result != NOTOK)
        !           229:        return;
        !           230: 
        !           231: do_cancel: ;
        !           232:     FTRWFREE (ftrw);
        !           233: 
        !           234:     if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags, dp - diags, fti)
        !           235:            == NOTOK)
        !           236:        ftam_adios (&fti -> fti_abort, "F-CANCEL-REQUEST");
        !           237: 
        !           238:     if (fti -> fti_type == FTI_CANCEL) {
        !           239:        register struct FTAMcancel *ftcn = &fti -> fti_cancel;
        !           240: 
        !           241:        advise (LLOG_NOTICE, NULLCP, "F-CANCEL.RESPONSE: %d",
        !           242:                    ftcn -> ftcn_action);
        !           243:        ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
        !           244:        FTCNFREE (ftcn);
        !           245:     }
        !           246: }
        !           247: 
        !           248: /*  */
        !           249: 
        !           250: static uxfget (diags)
        !           251: register struct FTAMdiagnostic **diags;
        !           252: {
        !           253:     register int    n;
        !           254:     int            bsize,
        !           255:            effector,
        !           256:            gd,
        !           257:            magic,
        !           258:            nc,
        !           259:            size;
        !           260:     PE     pe,
        !           261:            de;
        !           262:     register struct FTAMdiagnostic *dp = *diags;
        !           263:     struct FTAMindication   ftis;
        !           264:     register struct FTAMindication *fti = &ftis;
        !           265:     register struct FTAMabort *fta = &fti -> fti_abort;
        !           266:     register struct type_DOCS_FTAM__1__Parameters *p1;
        !           267:     register struct type_DOCS_FTAM__3__Parameters *p3;
        !           268:     FILE   *fp;
        !           269: #ifdef BRIDGE
        !           270:     char line[BUFSIZ];
        !           271: #endif
        !           272: 
        !           273: #ifdef BRIDGE
        !           274:     /* try opening file for ftp read */
        !           275:     if ((myfd = ftp_read (myfile)) == NOTOK){
        !           276:        dp -> ftd_type = DIAG_PERM;
        !           277:        dp -> ftd_identifier = FS_ACC_LCL;
        !           278:        dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           279:        dp -> ftd_delay = DIAG_NODELAY;
        !           280:        (void) strcpy (dp -> ftd_data, "failed file access on remote host");
        !           281:        dp -> ftd_cc = strlen (dp -> ftd_data);
        !           282:        dp++;
        !           283: 
        !           284:        *diags = dp;
        !           285:        return NOTOK;
        !           286:     }
        !           287: #endif
        !           288: 
        !           289:     effector = 1;
        !           290:     switch (myvf - vfs) {
        !           291:        case VFS_UTF: 
        !           292:            p1 = (struct type_DOCS_FTAM__1__Parameters *) myparam;
        !           293:            if ((gd = dup (myfd)) == NOTOK
        !           294:                    || (fp = fdopen (gd, "r")) == NULL) {
        !           295:                if (gd != NOTOK)
        !           296:                    (void) close (gd);
        !           297:                if (myfd != NOTOK){
        !           298: #ifdef BRIDGE
        !           299:                        (void) close (myfd);
        !           300:                        myfd = NOTOK;
        !           301:                        (void) ftp_reply ();
        !           302: #endif
        !           303:                }
        !           304:                goto no_mem;
        !           305:            }
        !           306: 
        !           307:            {
        !           308:                PElementID    id;
        !           309: 
        !           310:                if (p1 -> optionals
        !           311:                        & opt_DOCS_FTAM__1__Parameters_universal__class__number)
        !           312:                    id = (PElementID) p1 -> universal__class__number;
        !           313:                else
        !           314:                    id = PE_DEFN_GFXS;
        !           315: 
        !           316:                pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, id);
        !           317: 
        !           318:                switch (pe -> pe_id) {
        !           319:                    case PE_DEFN_GFXS:
        !           320:                        if (getenv ("HP-FTAM")) {
        !           321:                            effector = 1;
        !           322:                            break;
        !           323:                        }       /* else fall... */
        !           324:                    case PE_DEFN_PRTS:
        !           325:                    case PE_DEFN_VISS:
        !           326:                        effector = 0;
        !           327:                        break;
        !           328: 
        !           329:                    case PE_DEFN_T61S:
        !           330:                    case PE_DEFN_VTXS:
        !           331:                    case PE_DEFN_IA5S:
        !           332:                    case PE_DEFN_GENS:
        !           333:                        effector = 1;
        !           334:                        break;
        !           335: 
        !           336:                    default:
        !           337:                        break;
        !           338:                }
        !           339:            }
        !           340:            if ((magic = fadusize - MAGIC_OCTET1) < 0)
        !           341:                magic = 0;
        !           342:            break;
        !           343: 
        !           344:        case VFS_UBF:
        !           345:            p3 = (struct type_DOCS_FTAM__3__Parameters *) myparam;
        !           346:            /* and fall */
        !           347:        default:
        !           348:            fp = NULL;
        !           349: 
        !           350:            pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_OCTS);
        !           351:            if ((magic = fadusize - MAGIC_SINGLE) < 0)
        !           352:                magic = 0;
        !           353:            break;
        !           354:     }
        !           355:     if (pe == NULLPE)
        !           356:        goto no_mem;
        !           357:     pe -> pe_context = myvf -> vf_id;
        !           358: 
        !           359: #ifdef BRIDGE
        !           360:     bsize = BUFSIZ << 2;
        !           361:     size = magic >= bsize ? magic : bsize;
        !           362:     if (size > bsize)
        !           363:        size -= size % bsize;
        !           364: #else
        !           365: #ifndef        MAXBSIZE
        !           366:     bsize = BUFSIZ;
        !           367: #else
        !           368:     bsize = myst.st_blksize > 0 ? myst.st_blksize : BUFSIZ;
        !           369: #endif
        !           370:     size = (1024 <= magic && magic < bsize) ? magic : bsize;
        !           371: #endif
        !           372:     switch (myvf - vfs) {
        !           373:        case VFS_UTF:
        !           374:            if ((p1 -> optionals
        !           375:                        & opt_DOCS_FTAM__1__Parameters_maximum__string__length)
        !           376:                    && p1 -> maximum__string__length > 0)                   
        !           377:                size = p1 -> maximum__string__length;
        !           378:            break;
        !           379: 
        !           380:        case VFS_UBF:
        !           381:            if ((p3 -> optionals
        !           382:                        & opt_DOCS_FTAM__3__Parameters_maximum__string__length)
        !           383:                    && p3 -> maximum__string__length > 0)                   
        !           384:                size = p3 -> maximum__string__length;
        !           385:            /* and fall */
        !           386:        default:
        !           387:            break;
        !           388:     }
        !           389: 
        !           390:     if (debug)
        !           391:        advise (LLOG_DEBUG, NULLCP, "effector=%d id=0x%x size=%d",
        !           392:                effector, pe -> pe_id, size);
        !           393: 
        !           394:     if ((pe -> pe_prim = PEDalloc (pe -> pe_len = size)) == NULLPED) {
        !           395: no_mem: ;
        !           396:        dp -> ftd_type = DIAG_PERM;
        !           397:        dp -> ftd_identifier = FS_ACC_LCL;
        !           398:        dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           399:        dp -> ftd_delay = DIAG_NODELAY;
        !           400:        (void) strcpy (dp -> ftd_data, "out of memory");
        !           401:        dp -> ftd_cc = strlen (dp -> ftd_data);
        !           402:        dp++;
        !           403: 
        !           404: error_return: ;
        !           405:        (void) de2fadu (NULLPE, 0);
        !           406:        if (pe)
        !           407:            pe_free (pe);
        !           408:        if (fp)
        !           409:            (void) fclose (fp);
        !           410:        *diags = dp;
        !           411:        return NOTOK;
        !           412:     }
        !           413: 
        !           414:     for (;;) {
        !           415:        register char  *bp,
        !           416:                       *ep;
        !           417: 
        !           418:        for (ep = (bp = (char *) pe -> pe_prim) + size - (fp ? 2 : 0), nc = 0;
        !           419:                bp < ep; ) {
        !           420:            if (fp) {
        !           421:                register char *cp;
        !           422: 
        !           423: #ifdef BRIDGE
        !           424:                if (strlen (line) || fgets (line, BUFSIZ, fp)) {
        !           425:                    if ((strlen (line) + 1) < (ep - bp + 1)) {
        !           426:                        (void) strcpy (bp, line);
        !           427:                        line[0] = NULL;
        !           428:                    }
        !           429:                    else
        !           430:                        break;
        !           431:                }
        !           432:                else {
        !           433:                    n = (ferror (fp) && !feof (fp)) ? NOTOK : OK;
        !           434:                    break;
        !           435:                }
        !           436: #else
        !           437:                if (fgets (bp, ep - bp + 1, fp) == NULL) {
        !           438:                    n = (ferror (fp) && !feof (fp)) ? NOTOK : OK;
        !           439:                    break;
        !           440:                }
        !           441: #endif
        !           442:                cp = bp + strlen (bp) - 1;
        !           443:                if (!effector) {
        !           444:                    if (*cp == '\n') {
        !           445: #ifndef        BRIDGE
        !           446:                        *cp = NULL;
        !           447: #else
        !           448:                        if (cp > bp) {
        !           449:                            if (*--cp == '\r')
        !           450:                                *cp = NULL;
        !           451:                            else
        !           452:                                *++cp = NULL;
        !           453:                        }
        !           454:                        else
        !           455:                            *cp = NULL;
        !           456: #endif
        !           457:                        n = cp - bp;
        !           458:                        bp = cp;
        !           459:                    }
        !           460:                    else {                      /* XXX: losing! */
        !           461:                        n = cp - bp + 1;
        !           462:                        bp = cp + 1;
        !           463:                    }
        !           464:                }
        !           465:                else {
        !           466:                    if (*cp == '\n') {
        !           467: #ifndef        BRIDGE
        !           468:                        *cp++ = '\r';
        !           469: #endif
        !           470:                        *cp++ = '\n';
        !           471:                        n = cp - bp;
        !           472:                        bp = cp;
        !           473:                        nc++;
        !           474:                        continue;
        !           475:                    }
        !           476: 
        !           477:                    n = cp - bp + 1;
        !           478:                    bp = cp + 1;
        !           479:                }
        !           480:            }
        !           481:            else {
        !           482:                switch (n = read (myfd, bp, ep - bp)) {
        !           483:                    case NOTOK: 
        !           484:                    case OK: 
        !           485:                        break;
        !           486: 
        !           487:                    default: 
        !           488:                        bp += n;
        !           489:                        continue;
        !           490:                }
        !           491:            }
        !           492:            break;
        !           493:        }
        !           494:        if (n == NOTOK || (n = bp - (char *) pe -> pe_prim) == 0)
        !           495:            break;
        !           496:        pe -> pe_len = n;
        !           497: 
        !           498:        if (fp && !effector) {
        !           499:            if ((de = pe_cpy (pe)) == NULLPE)
        !           500:                goto no_mem;
        !           501:        }
        !           502:        else
        !           503:            de = pe;
        !           504: 
        !           505:        if (debug)
        !           506:            if (fp) {
        !           507:                WATCHP (DOCS_FTAM__1__Datatype1, de, 0);
        !           508:            }
        !           509:            else
        !           510:                WATCHP (DOCS_FTAM__3__Datatype1, de, 0);
        !           511: 
        !           512: 
        !           513:        switch (de2fadu (de, pe != de ? 1 : 0)) {
        !           514:            case NOTOK:
        !           515:                dp -> ftd_type = DIAG_PERM;
        !           516:                dp -> ftd_identifier = FS_ACC_LCL;
        !           517:                dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           518:                dp -> ftd_delay = DIAG_NODELAY;
        !           519:                dp -> ftd_cc = 0;
        !           520:                dp++;
        !           521:                goto error_return;
        !           522: 
        !           523:            case OK:
        !           524:            default:
        !           525:                nbytes += (n - nc), nc = 0;
        !           526:                continue;
        !           527: 
        !           528:            case DONE:
        !           529:                break;
        !           530:        }
        !           531:        break;
        !           532:     }
        !           533: 
        !           534:     pe_free (pe);
        !           535: 
        !           536:     if (fp)
        !           537:        (void) fclose (fp);
        !           538: 
        !           539:     if (n == DONE)
        !           540:        return DONE;
        !           541: 
        !           542:     if (n == NOTOK) {
        !           543:        dp -> ftd_type = DIAG_PERM;
        !           544:        dp -> ftd_identifier = FS_ACC_LCLDEV;
        !           545:        dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           546:        dp -> ftd_delay = DIAG_NODELAY;
        !           547:        (void) strcpy (dp -> ftd_data, sys_errname (errno));
        !           548:        dp -> ftd_cc = strlen (dp -> ftd_data);
        !           549:        dp++;
        !           550: 
        !           551:        *diags = dp;
        !           552: 
        !           553:        (void) de2fadu (NULLPE, 0);
        !           554:        return NOTOK;
        !           555:     }
        !           556: 
        !           557:     n = de2fadu (NULLPE, 1);
        !           558: 
        !           559:     if (n != DONE) {
        !           560:        timer (nbytes, "sent");
        !           561: 
        !           562:        if (FDataEndRequest (ftamfd, FACTION_SUCCESS,
        !           563:                             (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
        !           564:            ftam_adios (fta, "F-DATA-END.REQUEST");
        !           565:     }
        !           566: 
        !           567:     return n;
        !           568: }
        !           569: 
        !           570: /*  */
        !           571: 
        !           572: static fdfget (diags)
        !           573: register struct FTAMdiagnostic **diags;
        !           574: {
        !           575:     int            names,
        !           576:            len,
        !           577:            n;
        !           578:     char   *pp,
        !           579:            path[MAXPATHLEN];
        !           580:     PE     pe;
        !           581: #ifdef BRIDGE
        !           582:     int            dd;
        !           583:     FILE   *df;
        !           584:     char   *ptr,
        !           585:            line[BUFSIZ];
        !           586: #else
        !           587:     register struct dirent *d;
        !           588:     register DIR *dd;
        !           589: #endif
        !           590:     struct stat st;
        !           591:     register struct FTAMdiagnostic *dp = *diags;
        !           592:     struct FTAMindication   ftis;
        !           593:     register struct FTAMindication *fti = &ftis;
        !           594:     register struct FTAMabort *fta = &fti -> fti_abort;
        !           595:     register struct type_DOCS_NBS__9__Parameters *p9;
        !           596:     struct type_DOCS_NBS__9__Datatype1 *d9;
        !           597: 
        !           598:     if (strcmp (myfile, ".") == 0) {
        !           599:        pp = path;
        !           600:        *pp = NULL;
        !           601:        len = 0;
        !           602:     }
        !           603:     else 
        !           604: #ifdef apollo
        !           605:         if (strcmp (myfile, "/") == 0 || strcmp (myfile, "//") == 0) {
        !           606:             (void) sprintf (pp = path, "%s", myfile);
        !           607:             pp += (len = strlen (pp));
        !           608:         }
        !           609:         else
        !           610: #endif                
        !           611:     {
        !           612:        (void) sprintf (pp = path, "%s/", myfile);
        !           613:        pp += (len = strlen (pp));
        !           614:     }
        !           615: 
        !           616:     pe = NULLPE;
        !           617: 
        !           618: #ifdef BRIDGE
        !           619:     if ((dd = ftp_ls (myfile)) == NOTOK || (df = fdopen (dd,"r")) == NULL) {
        !           620: #else
        !           621:     if ((dd = opendir (myfile)) == NULL) {
        !           622: #endif
        !           623: no_mem: ;
        !           624:        dp -> ftd_type = DIAG_PERM;
        !           625:        dp -> ftd_identifier = FS_ACC_LCL;
        !           626:        dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           627:        dp -> ftd_delay = DIAG_NODELAY;
        !           628:        (void) strcpy (dp -> ftd_data, "out of memory");
        !           629:        dp -> ftd_cc = strlen (dp -> ftd_data);
        !           630:        dp++;
        !           631: 
        !           632: error_return: ;
        !           633:        (void) de2fadu (NULLPE, 0);
        !           634:        if (pe)
        !           635:            pe_free (pe);
        !           636: #ifdef BRIDGE
        !           637:        if (dd) {
        !           638:            (void) close (dd);
        !           639:            (void) ftp_reply ();
        !           640:         }
        !           641: #else
        !           642:        if (dd)
        !           643:            (void) closedir (dd);
        !           644: #endif
        !           645:        *diags = dp;
        !           646:        return NOTOK;
        !           647:     }
        !           648: 
        !           649: 
        !           650:     p9 = (struct type_DOCS_NBS__9__Parameters *) myparam;
        !           651:     if (fdf_p2names (ftamfd, p9, &names, fti) == NOTOK) {
        !           652:        register struct FTAMdiagnostic *d2 = fti -> fti_abort.fta_diags;
        !           653: 
        !           654:        dp = d2;        /* struct copy */
        !           655:        dp++;
        !           656:        goto error_return;
        !           657:     }
        !           658: 
        !           659:     n = OK;
        !           660: #ifdef BRIDGE
        !           661:     while (fgets(line, BUFSIZ, df)) {
        !           662: #else
        !           663:     for (errno = 0; d = readdir (dd); errno = 0) {
        !           664: #endif
        !           665:        struct FTAMattributes fas;
        !           666:        register struct FTAMattributes *fa = &fas;
        !           667: #ifndef        BRIDGE
        !           668:        register struct vfsmap *vf;
        !           669: #endif
        !           670: 
        !           671: #ifdef BRIDGE
        !           672:        if (ptr = rindex(line,'\r'))
        !           673:            *ptr = '\0';
        !           674: #endif
        !           675: 
        !           676:        if (debug)
        !           677: #ifdef BRIDGE
        !           678:            advise (LLOG_DEBUG, NULLCP, "len=%d name=\"%s\"",
        !           679:                        strlen(line), line);
        !           680: #else
        !           681:            advise (LLOG_DEBUG, NULLCP, "ino=%ld len=%d name=\"%s\"",
        !           682:                    d -> d_ino, strlen (d -> d_name), d -> d_name);
        !           683: #endif
        !           684: 
        !           685: #ifndef        BRIDGE
        !           686:        if (!d -> d_ino)
        !           687:            continue;
        !           688: #endif
        !           689: 
        !           690: #ifdef BRIDGE
        !           691:        if (len + strlen (line) >= MAXPATHLEN)
        !           692: #else
        !           693:        if (len + strlen (d -> d_name) >= MAXPATHLEN)
        !           694: #endif
        !           695:            continue;
        !           696: 
        !           697: #ifdef BRIDGE
        !           698:        (void) strcpy (pp, line);
        !           699: #else
        !           700:        (void) strcpy (pp, d -> d_name);
        !           701: #endif
        !           702: 
        !           703: #ifndef        BRIDGE
        !           704:        if (stat (path, &st) == NOTOK
        !           705:                || (vf = st2vfs (NOTOK, path, &st, NULLOID, ftamfd)) == NULL)
        !           706:            continue;
        !           707: #endif
        !           708: 
        !           709:        bzero ((char *) fa, sizeof *fa);
        !           710:        *diags = dp;
        !           711: #ifdef BRIDGE
        !           712:        (void) readattrs (names, fa, vfs[VFS_UTF].vf_oid, NULLPE, path, &st,
        !           713:                          diags);
        !           714: #else
        !           715:        (void) readattrs (names, fa, vf -> vf_oid, NULLPE, path, &st, diags);
        !           716: #endif
        !           717:        dp = *diags;
        !           718: 
        !           719:        if (fdf_attrs2d (ftamfd, fa, &d9, fti) == NOTOK) {
        !           720:            register struct FTAMdiagnostic *d2 = fti -> fti_abort.fta_diags;
        !           721: 
        !           722:            dp = d2;    /* struct copy */
        !           723:            dp++;
        !           724:            goto error_return;
        !           725:        }
        !           726: 
        !           727:        if (encode_DOCS_NBS__9__Datatype1 (&pe, 1, 0, NULLCP, d9) == NOTOK) {
        !           728:            dp -> ftd_type = DIAG_PERM;
        !           729:            dp -> ftd_identifier = FS_ACC_LCL;
        !           730:            dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           731:            dp -> ftd_delay = DIAG_NODELAY;
        !           732:            (void) sprintf (dp -> ftd_data, "error encoding Datatype1: %s",
        !           733:                            PY_pepy);
        !           734:            dp -> ftd_cc = strlen (dp -> ftd_data);
        !           735:            dp++;
        !           736: 
        !           737:            free_DOCS_NBS__9__Datatype1 (d9);
        !           738:            goto error_return;
        !           739:        }
        !           740:        pe -> pe_context = myvf -> vf_id;
        !           741: 
        !           742:        if (debug)
        !           743:            WATCHP (DOCS_NBS__9__Datatype1, pe, 0);
        !           744: 
        !           745:        n = de2fadu (pe, 1), pe = NULLPE;
        !           746:        switch (n) {
        !           747:            case NOTOK:
        !           748:                goto no_mem;
        !           749: 
        !           750:            case OK:
        !           751:            default:
        !           752:                continue;
        !           753: 
        !           754:            case DONE:
        !           755:                break;
        !           756:        }
        !           757:        break;
        !           758:     }
        !           759: 
        !           760: #ifdef BRIDGE
        !           761:     (void) fclose (df);
        !           762:     (void) close (dd);
        !           763:     (void) ftp_reply ();
        !           764: #else
        !           765:     if (errno != 0) {
        !           766:        dp -> ftd_type = DIAG_PERM;
        !           767:        dp -> ftd_identifier = FS_ACC_LCL;
        !           768:        dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           769:        dp -> ftd_delay = DIAG_NODELAY;
        !           770:        (void) sprintf (dp -> ftd_data, "%s: %s", myfile, sys_errname (errno));
        !           771:        dp -> ftd_cc = strlen (dp -> ftd_data);
        !           772:        dp++;
        !           773: 
        !           774:        goto error_return;
        !           775:        
        !           776:     }
        !           777:     (void) closedir (dd);
        !           778: #endif
        !           779: 
        !           780:     if (n == OK)
        !           781:        n = de2fadu (NULLPE, 1);
        !           782: 
        !           783:     switch (n) {
        !           784:        case DONE:
        !           785:            return DONE;
        !           786: 
        !           787:        case OK:
        !           788:        default:
        !           789:            if (FDataEndRequest (ftamfd, FACTION_SUCCESS,
        !           790:                        (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
        !           791:                ftam_adios (fta, "F-DATA-END.REQUEST");
        !           792:            return OK;
        !           793:     }
        !           794: }
        !           795: 
        !           796: /*  */
        !           797: 
        !           798: static int  de2fadu (pe, concat)
        !           799: PE     pe;
        !           800: int    concat;
        !           801: {
        !           802:     struct FTAMindication   ftis;
        !           803:     register struct FTAMindication *fti = &ftis;
        !           804:     register struct FTAMabort  *fta = &fti -> fti_abort;
        !           805:     static int ninfo = 0;
        !           806:     static int size = 0;
        !           807:     static PE info[NPDATA];
        !           808: 
        !           809:     if (pe == NULLPE) {
        !           810:        if (concat
        !           811:                && ninfo > 0
        !           812:                && FDataRequest (ftamfd, info, ninfo, fti) == NOTOK)
        !           813:            ftam_adios (fta, "F-DATA.REQUEST");
        !           814: 
        !           815:        while (ninfo > 0)
        !           816:            pe_free (info[--ninfo]);
        !           817:        size = 0;
        !           818: 
        !           819:        return OK;
        !           820:     }
        !           821: 
        !           822:     if (concat) {
        !           823:        int     flush,
        !           824:                n;
        !           825: 
        !           826:        if (size + (n = ps_get_abs (pe) + MAGIC_OCTET2) >= fadusize
        !           827:                && ninfo > 0) {
        !           828:            if (debug)
        !           829:                advise (LLOG_DEBUG, NULLCP,
        !           830:                        "de2fadu flushing on %d FADUs, estimated size %d/%d",
        !           831:                        ninfo, size, fadusize);
        !           832: 
        !           833:            (void) de2fadu (NULLPE, 1);
        !           834:            flush = 1;
        !           835:        }
        !           836:        else
        !           837:            flush = 0;
        !           838:        
        !           839:        info[ninfo++] = pe;
        !           840:        size += n;
        !           841: 
        !           842:        if (ninfo < NPDATA && size < fadusize) {
        !           843:            if (!flush)
        !           844:                return OK;
        !           845:        }
        !           846:        else {
        !           847:            if (FDataRequest (ftamfd, info, ninfo, fti) == NOTOK)
        !           848:                ftam_adios (fta, "F-DATA.REQUEST");
        !           849: 
        !           850:            while (ninfo > 0)
        !           851:                pe_free (info[--ninfo]);
        !           852:            size = 0;
        !           853:        }
        !           854:     }
        !           855:     else
        !           856:        if (FDataRequest (ftamfd, &pe, 1, fti) == NOTOK)
        !           857:            ftam_adios (fta, "F-DATA.REQUEST");
        !           858: 
        !           859:     if (FWaitRequest (ftamfd, OK, fti) == NOTOK) {
        !           860:        if (fta -> fta_peer
        !           861:                || fta -> fta_action != FACTION_TRANS
        !           862:                || fta -> fta_ndiag < 1
        !           863:                || fta -> fta_diags[0].ftd_type != DIAG_TRANS
        !           864:                || fta -> fta_diags[0].ftd_identifier != FS_PRO_TIMEOUT)
        !           865:            ftam_adios (fta, "F-WAIT.REQUEST");
        !           866: 
        !           867:        return OK;
        !           868:     }
        !           869: 
        !           870:     if (fti -> fti_type == FTI_CANCEL) {
        !           871:        register struct FTAMcancel *ftcn = &fti -> fti_cancel;
        !           872: 
        !           873:        advise (LLOG_NOTICE, NULLCP, "F-CANCEL.INDICATION: %d",
        !           874:                ftcn -> ftcn_action);
        !           875:        ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
        !           876:        FTCNFREE (ftcn);
        !           877: 
        !           878:        if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE, 
        !           879:                    (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
        !           880:            ftam_adios (fta, "F-CANCEL.RESPONSE");
        !           881:     }
        !           882: 
        !           883:     return DONE;
        !           884: }
        !           885: 
        !           886: /*  */
        !           887: 
        !           888: int    ftam_dataindication (px)
        !           889: register struct PSAPdata *px;
        !           890: {
        !           891:     register int    i;
        !           892:     int            effector,
        !           893:            n;
        !           894:     register PE     pe,
        !           895:                   *pep;
        !           896:     struct FTAMdiagnostic   diags[NFDIAG];
        !           897:     register struct FTAMdiagnostic *dp = diags;
        !           898:     struct FTAMindication   ftis;
        !           899:     register struct FTAMindication *fti = &ftis;
        !           900: 
        !           901:     effector = 1;
        !           902:     switch (myvf - vfs) {
        !           903:        case VFS_UBF:
        !           904:        default:
        !           905:            break;
        !           906: 
        !           907:        case VFS_UTF:
        !           908:            {
        !           909:                PElementID    id;
        !           910:                register struct type_DOCS_FTAM__1__Parameters *p1 =
        !           911:                            (struct type_DOCS_FTAM__1__Parameters *) myparam;
        !           912: 
        !           913:                if (p1 -> optionals
        !           914:                        & opt_DOCS_FTAM__1__Parameters_universal__class__number)
        !           915:                    id = (PElementID) p1 -> universal__class__number;
        !           916:                else
        !           917:                    id = PE_DEFN_GFXS;
        !           918:                switch (id) {
        !           919:                    case PE_DEFN_GFXS:
        !           920:                        if (getenv ("HP-FTAM")) {
        !           921:                            effector = 1;
        !           922:                            break;
        !           923:                        }       /* else fall... */
        !           924:                    case PE_DEFN_PRTS:
        !           925:                    case PE_DEFN_VISS:
        !           926:                        effector = 0;
        !           927:                        break;
        !           928: 
        !           929:                    case PE_DEFN_T61S:
        !           930:                    case PE_DEFN_VTXS:
        !           931:                    case PE_DEFN_IA5S:
        !           932:                    case PE_DEFN_GENS:
        !           933:                        effector = 1;
        !           934:                        break;
        !           935: 
        !           936:                    default:
        !           937:                        break;
        !           938:                }
        !           939:            }
        !           940:            break;
        !           941:     }
        !           942: 
        !           943:     for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) {
        !           944:        if ((pe = *pep) == NULLPE)
        !           945:            continue;
        !           946: 
        !           947:        switch (myvf - vfs) {
        !           948:            case VFS_UBF:
        !           949:            default:
        !           950:                if (debug)
        !           951:                    WATCHP (DOCS_FTAM__3__Datatype1, pe, 1);
        !           952:                n = de2fd (myfd, pe, 0, 0);
        !           953:                break;
        !           954: 
        !           955:            case VFS_UTF:
        !           956:                if (debug)
        !           957:                    WATCHP (DOCS_FTAM__1__Datatype1, pe, 1);
        !           958:                n = de2fd (myfd, pe, 1, effector);
        !           959:                break;
        !           960:        }
        !           961: 
        !           962:        if (n != NOTOK) {
        !           963:            nbytes += n;
        !           964:            continue;
        !           965:        }
        !           966: 
        !           967:        dp -> ftd_type = DIAG_PERM;
        !           968:        switch (errno) {
        !           969:            case ENOSPC: 
        !           970:                dp -> ftd_identifier = FS_ACC_LCLSPACE;
        !           971:                dp -> ftd_cc = 0;
        !           972:                break;
        !           973: 
        !           974:            case EIO: 
        !           975:            case ENXIO: 
        !           976:                dp -> ftd_identifier = FS_ACC_LCLDEV;
        !           977:                dp -> ftd_cc = 0;
        !           978:                break;
        !           979: 
        !           980:            default: 
        !           981:                dp -> ftd_identifier = FS_ACC_WRITE;
        !           982:                (void) strcpy (dp -> ftd_data, sys_errname (errno));
        !           983:                dp -> ftd_cc = strlen (dp -> ftd_data);
        !           984:                break;
        !           985:        }
        !           986:        dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
        !           987:        dp -> ftd_delay = DIAG_NODELAY;
        !           988:        dp++;
        !           989: 
        !           990:        if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags, dp - diags,
        !           991:                            fti) == NOTOK)
        !           992:            ftam_adios (&fti -> fti_abort, "F-CANCEL-REQUEST");
        !           993: 
        !           994:        if (fti -> fti_type == FTI_CANCEL) {
        !           995:            register struct FTAMcancel *ftcn = &fti -> fti_cancel;
        !           996: 
        !           997:            advise (LLOG_NOTICE, NULLCP, "F-CANCEL.RESPONSE: %d",
        !           998:                    ftcn -> ftcn_action);
        !           999:            ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
        !          1000:            FTCNFREE (ftcn);
        !          1001:        }
        !          1002:        break;
        !          1003:     }
        !          1004: 
        !          1005:     PXFREE (px);
        !          1006: }
        !          1007: 
        !          1008: /*  */
        !          1009: 
        !          1010: /* ARGSUSED */
        !          1011: 
        !          1012: int    ftam_dataendindication (ftda)
        !          1013: struct FTAMdataend *ftda;
        !          1014: {
        !          1015:     timer (nbytes, "received");
        !          1016: 
        !          1017: #ifndef        SYS5
        !          1018:     if (ftda -> ftda_action == FACTION_SUCCESS)
        !          1019:        (void) fsync (myfd);
        !          1020: #endif
        !          1021: }
        !          1022: 
        !          1023: /*  */
        !          1024: 
        !          1025: int    ftam_cancelindication (ftcn)
        !          1026: register struct FTAMcancel *ftcn;
        !          1027: {
        !          1028:     struct FTAMindication   ftis;
        !          1029:     register struct FTAMindication *fti = &ftis;
        !          1030: 
        !          1031:     advise (LLOG_NOTICE, NULLCP, "F-CANCEL.INDICATION: %d",
        !          1032:            ftcn -> ftcn_action);
        !          1033:     ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
        !          1034:     FTCNFREE (ftcn);
        !          1035: 
        !          1036:     if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE,
        !          1037:                (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
        !          1038:        ftam_adios (&fti -> fti_abort, "F-CANCEL.RESPONSE");
        !          1039: }
        !          1040: 
        !          1041: /*  */
        !          1042: 
        !          1043: /* ARGSUSED */
        !          1044: 
        !          1045: int    ftam_transendindication (ftre)
        !          1046: struct FTAMtransend *ftre;
        !          1047: {
        !          1048:     struct FTAMindication   ftis;
        !          1049:     register struct FTAMindication *fti = &ftis;
        !          1050: 
        !          1051:     if (FTransEndResponse (ftamfd, FACTION_SUCCESS, NULLPE, 
        !          1052:                (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
        !          1053:        ftam_adios (&fti -> fti_abort, "F-TRANSFER-END.RESPONSE");
        !          1054: }
        !          1055: 
        !          1056: /*  */
        !          1057: 
        !          1058: int    ftam_bulkendindication (ftg)
        !          1059: struct FTAMgroup *ftg;
        !          1060: {
        !          1061:     struct FTAMgroup    ftms;
        !          1062:     struct FTAMgroup   *ftm = &ftms;
        !          1063:     struct FTAMindication   ftis;
        !          1064:     register struct FTAMindication *fti = &ftis;
        !          1065: 
        !          1066:     ftam_selection (ftg, ftm);
        !          1067: 
        !          1068:     if (myfd != NOTOK) {
        !          1069: #ifdef BRIDGE
        !          1070:        (void) close (myfd);
        !          1071:        (void) ftp_reply ();
        !          1072: #else
        !          1073:        unlock ();
        !          1074:        (void) close (myfd);
        !          1075: #endif
        !          1076:        myfd = NOTOK;
        !          1077:     }
        !          1078: 
        !          1079:     if (FBulkEndResponse (ftamfd, ftm, fti) == NOTOK)
        !          1080:        ftam_adios (&fti -> fti_abort, "F-BULK-END.RESPONSE");
        !          1081: 
        !          1082:     FTGFREE (ftg);
        !          1083: }
        !          1084: 
        !          1085: /*  */
        !          1086: 
        !          1087: #ifndef        NBBY
        !          1088: #define        NBBY    8
        !          1089: #endif
        !          1090: 
        !          1091: 
        !          1092: #ifndef        TMS
        !          1093: timer (cc, action)
        !          1094: int     cc;
        !          1095: char   *action;
        !          1096: {
        !          1097:     long    ms;
        !          1098:     float   bs;
        !          1099:     struct timeval  stop,
        !          1100:                     td;
        !          1101:     static struct timeval   start;
        !          1102: 
        !          1103:     if (cc == 0) {
        !          1104:        (void) gettimeofday (&start, (struct timezone *) 0);
        !          1105:        return;
        !          1106:     }
        !          1107:     else
        !          1108:        (void) gettimeofday (&stop, (struct timezone  *) 0);
        !          1109: 
        !          1110:     tvsub (&td, &stop, &start);
        !          1111:     ms = (td.tv_sec * 1000) + (td.tv_usec / 1000);
        !          1112:     bs = (((float) cc * NBBY * 1000) / (float) (ms ? ms : 1)) / NBBY;
        !          1113: 
        !          1114:     advise (LLOG_NOTICE, NULLCP,
        !          1115:            "%d bytes %s in %d.%02d seconds (%.2f Kbytes/s)",
        !          1116:            cc, action, td.tv_sec, td.tv_usec / 10000, bs / 1024);
        !          1117: }
        !          1118: 
        !          1119: 
        !          1120: static  tvsub (tdiff, t1, t0)
        !          1121: register struct timeval *tdiff,
        !          1122:                        *t1,
        !          1123:                        *t0;
        !          1124: {
        !          1125: 
        !          1126:     tdiff -> tv_sec = t1 -> tv_sec - t0 -> tv_sec;
        !          1127:     tdiff -> tv_usec = t1 -> tv_usec - t0 -> tv_usec;
        !          1128:     if (tdiff -> tv_usec < 0)
        !          1129:        tdiff -> tv_sec--, tdiff -> tv_usec += 1000000;
        !          1130: }
        !          1131: 
        !          1132: #else
        !          1133: #ifndef        HZ
        !          1134: #define        HZ      60
        !          1135: #endif
        !          1136: 
        !          1137: 
        !          1138: long   times ();
        !          1139: 
        !          1140: 
        !          1141: static timer (cc, action)
        !          1142: int    cc;
        !          1143: char   *action;
        !          1144: {
        !          1145:     long    ms;
        !          1146:     float   bs;
        !          1147:     long    stop,
        !          1148:            td,
        !          1149:            secs,
        !          1150:            msecs;
        !          1151:     struct tms tm;
        !          1152:     static long start;
        !          1153: 
        !          1154:     if (cc == 0) {
        !          1155:        start = times (&tm);
        !          1156:        return;
        !          1157:     }
        !          1158:     else
        !          1159:        stop = times (&tm);
        !          1160: 
        !          1161:     td = stop - start;
        !          1162:     secs = td / HZ, msecs = (td % HZ) * 1000 / HZ;
        !          1163:     ms = (secs * 1000) +  msecs;
        !          1164:     bs = (((float) cc * NBBY * 1000) / (float) (ms ? ms : 1)) / NBBY;
        !          1165:     
        !          1166:     advise (LLOG_NOTICE, NULLCP,
        !          1167:            "%d bytes %s in %d.%02d seconds (%.2f Kbytes/s)",
        !          1168:            cc, action, secs, msecs / 10, bs / 1024);
        !          1169: }
        !          1170: #endif

unix.superglobalmegacorp.com

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