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

1.1       root        1: /* ftamsbr.c - FTAM subroutines */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamsbr.c,v 7.1 90/07/01 21:03:31 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/ftam2/RCS/ftamsbr.c,v 7.1 90/07/01 21:03:31 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       ftamsbr.c,v $
                     12:  * Revision 7.1  90/07/01  21:03:31  mrose
                     13:  * pepsy
                     14:  * 
                     15:  * Revision 7.0  89/11/23  21:54:37  mrose
                     16:  * Release 6.0
                     17:  * 
                     18:  */
                     19: 
                     20: /*
                     21:  *                               NOTICE
                     22:  *
                     23:  *    Acquisition, use, and distribution of this module and related
                     24:  *    materials are subject to the restrictions of a license agreement.
                     25:  *    Consult the Preface in the User's Manual for the full terms of
                     26:  *    this agreement.
                     27:  *
                     28:  */
                     29: 
                     30: 
                     31: #include <ctype.h>
                     32: #include <stdio.h>
                     33: #include "ftamsbr.h"
                     34: 
                     35: #ifdef BRIDGE
                     36: extern int vfs_fdf;
                     37: #endif
                     38: 
                     39: extern struct vfsmap vfs[];
                     40: 
                     41: /*  */
                     42: 
                     43: #ifdef BRIDGE
                     44: /* ARGSUSED */
                     45: #endif
                     46: 
                     47: struct vfsmap *st2vfs (fd, file, st, proposed, ftamfd)
                     48: int    fd;
                     49: char   *file;
                     50: struct stat *st;
                     51: OID    proposed;
                     52: int    ftamfd;
                     53: {
                     54: #ifndef        BRIDGE
                     55:     register int    fmt;
                     56:     register struct vfsmap *lf;
                     57: #endif
                     58:     register struct vfsmap *vf;
                     59: 
                     60: #ifndef        BRIDGE
                     61:     fmt = st -> st_mode & S_IFMT;
                     62: #else
                     63: /* Return the suggested TYPE or Unstructured Text type for FTP bridge */
                     64: /* if during ftp_exist got multiple listing, return directory type */
                     65:     if (ftp_directory)
                     66:        return &vfs[vfs_fdf];
                     67: #endif
                     68: 
                     69:     if (proposed) {
                     70:        for (vf = vfs; vf -> vf_entry; vf++)
                     71:            if (vf -> vf_oid && oid_cmp (vf -> vf_oid, proposed) == 0) {
                     72: #ifdef BRIDGE
                     73:                return vf;
                     74:            }
                     75: #else
                     76:                if ((vf -> vf_flags & VF_OK) && vf -> vf_mode == fmt) {
                     77:                    if (vf -> vf_peek
                     78:                            && (*vf -> vf_peek) (vf, fd, file, st, ftamfd)
                     79:                                        == NOTOK)
                     80:                        break;
                     81: 
                     82:                    return vf;
                     83:                }
                     84: 
                     85:                break;
                     86:            }
                     87: 
                     88:        if (!vf -> vf_entry)
                     89:            return NULL;
                     90: #endif
                     91:     }
                     92: #ifndef        BRIDGE
                     93:     else {
                     94:        for (lf = vfs; lf -> vf_entry; lf++)
                     95:            continue;
                     96:        lf--;
                     97: 
                     98:        for (vf = lf; vf >= vfs; vf--)
                     99:            if ((vf -> vf_flags & VF_OK) && vf -> vf_mode == fmt) {
                    100:                if (vf -> vf_peek
                    101:                        && (*vf -> vf_peek) (vf, fd, file, st, ftamfd) != DONE)
                    102:                    continue;
                    103: 
                    104:                return vf;
                    105:            }
                    106: 
                    107:        for (vf = lf; vf >= vfs; vf--)
                    108:            if ((vf -> vf_flags & VF_OK)
                    109:                    && vf -> vf_mode == fmt
                    110:                    && vf -> vf_simplify != VFS_XXX)
                    111:                break;
                    112:        if (vf < vfs)
                    113:            return NULL;
                    114:     }
                    115: 
                    116: /* let's hope there aren't any simplification loops! */
                    117: 
                    118:     while (vf -> vf_simplify != VFS_XXX) {
                    119:        vf = &vfs[vf -> vf_simplify];
                    120: 
                    121:        if (vf -> vf_flags & VF_OK) {
                    122:            if (vf -> vf_peek)
                    123:                (void) (*vf -> vf_peek) (vf, fd, file, st, ftamfd);
                    124:            return vf;
                    125:        }
                    126:     }
                    127: 
                    128:     return NULL;
                    129: #else
                    130:     return &vfs[ftp_default];
                    131: #endif
                    132: }
                    133: 
                    134: /*  */
                    135: 
                    136: int    binarycheck (param, data)
                    137: caddr_t param;
                    138: char   *data;
                    139: {
                    140:     register struct type_DOCS_FTAM__3__Parameters *p3 =
                    141:                        (struct type_DOCS_FTAM__3__Parameters *) param;
                    142: 
                    143:     if (p3 -> optionals
                    144:              & opt_DOCS_FTAM__3__Parameters_maximum__string__length) {
                    145:        if (getenv ("UNISYS-FTAM"))
                    146:            p3 -> maximum__string__length = 0;
                    147:        else
                    148:            p3 -> optionals &=
                    149:                        ~opt_DOCS_FTAM__3__Parameters_maximum__string__length;
                    150:     }
                    151: 
                    152:     if ((p3 -> optionals
                    153:                & opt_DOCS_FTAM__3__Parameters_string__significanz)
                    154:            && p3 -> string__significanz
                    155:                    == int_DOCS_string__significanz_fixed) {
                    156:        (void) strcpy (data,
                    157:                       "filestore does not support fixed-length strings");
                    158:        return NOTOK;
                    159:     }
                    160:     
                    161: 
                    162:     return OK;
                    163: }
                    164: 
                    165: /*  */
                    166: 
                    167: int    textcheck (param, data)
                    168: caddr_t param;
                    169: char   *data;
                    170: {
                    171:     register struct type_DOCS_FTAM__1__Parameters *p1 =
                    172:                        (struct type_DOCS_FTAM__1__Parameters *) param;
                    173: 
                    174:     if (!(p1 -> optionals
                    175:              & opt_DOCS_FTAM__1__Parameters_universal__class__number)) {
                    176:        p1 -> optionals |= opt_DOCS_FTAM__1__Parameters_universal__class__number;
                    177:        p1 -> universal__class__number = PE_DEFN_GENS;
                    178:     }
                    179:     switch (p1 -> universal__class__number) {
                    180:        case PE_DEFN_GFXS:
                    181:        case PE_DEFN_IA5S:
                    182:        case PE_DEFN_GENS:
                    183:            break;
                    184: 
                    185:        default:
                    186:            (void) sprintf (data,
                    187:                            "filestore does not support strings of universal class number %d",
                    188:                            p1 -> universal__class__number);
                    189:            return NOTOK;
                    190:     }
                    191: 
                    192:     if (p1 -> optionals
                    193:              & opt_DOCS_FTAM__1__Parameters_maximum__string__length) {
                    194:        if (getenv ("UNISYS-FTAM")) {
                    195:            p1 -> maximum__string__length = 0;
                    196:        }
                    197:        else
                    198:            p1 -> optionals &=
                    199:                        ~opt_DOCS_FTAM__1__Parameters_maximum__string__length;
                    200:     }
                    201: 
                    202:     if ((p1 -> optionals
                    203:                & opt_DOCS_FTAM__1__Parameters_string__significance)
                    204:            && p1 -> string__significance
                    205:                    == int_DOCS_string__significance_fixed) {
                    206:        (void) strcpy (data,
                    207:                       "filestore does not support fixed-length strings");
                    208:        return NOTOK;
                    209:     }
                    210:     
                    211: 
                    212:     return OK;
                    213: }
                    214: 
                    215: /*  */
                    216: 
                    217: /* ARGSUSED */
                    218: 
                    219: int    binarypeek (vf, fd, file, st, ftamfd)
                    220: register struct vfsmap *vf;
                    221: int    fd;
                    222: char   *file;
                    223: struct stat *st;
                    224: int    ftamfd;
                    225: {
                    226:     static struct type_DOCS_FTAM__3__Parameters p3s;
                    227:     register struct type_DOCS_FTAM__3__Parameters *p3 = &p3s;
                    228: 
                    229:     if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
                    230:        fre_obj (vf -> vf_parameter, _ZDOCS_mod.md_dtab[vf -> vf_number],
                    231:                 &_ZDOCS_mod);
                    232: 
                    233:     vf -> vf_parameter = (caddr_t) p3, vf -> vf_flags &= ~VF_PARM;
                    234: 
                    235:     p3 -> optionals = 0;
                    236: 
                    237:     if (getenv ("UNISYS-FTAM")) {
                    238:        p3 -> optionals |=opt_DOCS_FTAM__3__Parameters_maximum__string__length;
                    239:        p3 -> maximum__string__length = 0;
                    240:     }
                    241: 
                    242:     p3 -> optionals |= opt_DOCS_FTAM__3__Parameters_string__significanz;
                    243:     p3 -> string__significanz = int_DOCS_string__significanz_not__significant;
                    244: 
                    245:     return DONE;
                    246: }
                    247: 
                    248: /*  */
                    249: 
                    250: /* Various textual repetories.  In addition to the prohibited characters, on
                    251:    UNIX we disallow CRs.  This avoids funny CR-LF mappings. */
                    252: 
                    253: /* Here's the assumptions we make for whether format-effectors are used:
                    254: 
                    255:        PrintableString -       no
                    256:        TeletexString   -       yes
                    257:        VideotexString  -       yes (?)
                    258:        IA5String       -       yes
                    259:        GraphicString   -       no (?)
                    260:        VisibleString   -       no (?)
                    261:        GeneralString   -       yes (?)
                    262: 
                    263: */
                    264: 
                    265: 
                    266: #define        isIA5(c)        (isprint (c) || (isspace (c) && (c) != '\r'))
                    267: 
                    268: 
                    269: /* ARGSUSED */
                    270: 
                    271: int    textpeek (vf, fd, file, st, ftamfd)
                    272: register struct vfsmap *vf;
                    273: int    fd;
                    274: char   *file;
                    275: struct stat *st;
                    276: int    ftamfd;
                    277: {
                    278: #ifndef        BRIDGE
                    279:     int     gd,
                    280:            n;
                    281:     register char *cp;
                    282:     char    buffer[BLKSIZE];
                    283:     long    pos;
                    284: #endif
                    285:     static struct type_DOCS_FTAM__1__Parameters p1s;
                    286:     register struct type_DOCS_FTAM__1__Parameters *p1 = &p1s;
                    287: 
                    288:     if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
                    289:        fre_obj (vf -> vf_parameter, _ZDOCS_mod.md_dtab[vf -> vf_number],
                    290:                 &_ZDOCS_mod);
                    291: 
                    292:     vf -> vf_parameter = (caddr_t) p1, vf -> vf_flags &= ~VF_PARM;
                    293: 
                    294:     p1 -> optionals = 0;
                    295: 
                    296:     p1 -> optionals |= opt_DOCS_FTAM__1__Parameters_universal__class__number;
                    297:     p1 -> universal__class__number = PE_DEFN_GENS;
                    298: 
                    299:     if (getenv ("UNISYS-FTAM")) {
                    300:        p1 -> optionals |=opt_DOCS_FTAM__1__Parameters_maximum__string__length;
                    301:        p1 -> maximum__string__length = 0;
                    302:     }
                    303: 
                    304:     p1 -> optionals |= opt_DOCS_FTAM__1__Parameters_string__significance;
                    305:     switch (p1 -> universal__class__number) {
                    306:        case PE_DEFN_GFXS:
                    307:            if (getenv ("HP-FTAM")) {
                    308:                p1 -> string__significance =
                    309:                                int_DOCS_string__significance_not__significant;
                    310:                break;
                    311:            }   /* else fall... */
                    312:        case PE_DEFN_PRTS:
                    313:        case PE_DEFN_VISS:
                    314:            p1 -> string__significance =
                    315:                                int_DOCS_string__significance_variable;
                    316:            break;
                    317: 
                    318:        case PE_DEFN_T61S:
                    319:        case PE_DEFN_VTXS:
                    320:        case PE_DEFN_IA5S:
                    321:        case PE_DEFN_GENS:
                    322:            p1 -> string__significance =
                    323:                                int_DOCS_string__significance_not__significant;
                    324:            break;
                    325:     }
                    326: 
                    327: #ifndef        BRIDGE
                    328:     if ((gd = fd) == NOTOK
                    329:            && (file == NULLCP || (gd = open (file, O_RDONLY)) == NOTOK))
                    330:        return OK;
                    331: 
                    332:     if (fd != NOTOK) {
                    333:        pos = lseek (gd, 0L, L_INCR);
                    334:        (void) lseek (gd, 0L, L_SET);
                    335:     }
                    336: #ifndef        MAXBSIZE
                    337:     n = read (gd, buffer, sizeof buffer);
                    338: #else
                    339:     n = 0 < st -> st_blksize && st -> st_blksize <= sizeof buffer 
                    340:                ? st -> st_blksize : sizeof buffer;
                    341:     n = read (gd, buffer, n);
                    342: #endif
                    343:     if (fd != NOTOK && pos != -1L)
                    344:        (void) lseek (gd, pos, L_SET);
                    345: 
                    346:     if (fd == NOTOK)
                    347:        (void) close (gd);
                    348: 
                    349:     for (cp = buffer + n - 1; cp >= buffer; cp--)
                    350:        if (!isIA5 (*cp))
                    351:            return NOTOK;
                    352:     return DONE;
                    353: #else
                    354:     return OK;
                    355: #endif
                    356: }
                    357: 
                    358: /*  */
                    359: 
                    360: /* ARGSUSED */
                    361: 
                    362: int    fdfpeek (vf, fd, file, st, ftamfd)
                    363: register struct vfsmap *vf;
                    364: int    fd;
                    365: char   *file;
                    366: struct stat *st;
                    367: int    ftamfd;
                    368: {
                    369:     struct type_DOCS_NBS__9__Parameters *p9;
                    370:     struct FTAMindication ftis;
                    371: 
                    372:     if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
                    373:        fre_obj (vf -> vf_parameter, _ZDOCS_mod.md_dtab[vf -> vf_number],
                    374:                 &_ZDOCS_mod);
                    375: 
                    376:     vf -> vf_parameter = NULLCP, vf -> vf_flags &= ~VF_PARM;
                    377: 
                    378:     if (fdf_names2p (ftamfd, FA_RDATTR, &p9, &ftis) == NOTOK)
                    379:        return NOTOK;
                    380: 
                    381:     vf -> vf_parameter = (caddr_t) p9;
                    382: 
                    383:     return DONE;
                    384: }
                    385: 
                    386: /*  */
                    387: 
                    388: /* If text, then need to worry about ESCape sequences for the various
                    389:    repetoires (thank you, Digital!)  For now, we'll recognize G0 and G1 from
                    390:    the 8859-1 (latin) alphabet.  Note that when sending a file, we do not
                    391:    generate escape sequences...
                    392:  */
                    393: 
                    394: 
                    395: int    de2fd (fd, pe, text, effector)
                    396: int    fd;
                    397: PE     pe;
                    398: int    text,
                    399:        effector;
                    400: {
                    401:     register int    i,
                    402:                    n;
                    403:                register char  *bp,
                    404:                               *cp,
                    405:                               *ep;
                    406:     register PE            p;
                    407: 
                    408:     if (pe -> pe_form == PE_FORM_CONS) {
                    409:            for (p = pe -> pe_cons, n = 0; p; p = p -> pe_next, n += i)
                    410:                if ((i = de2fd (fd, p, text, 1)) == NOTOK)
                    411:                    return NOTOK;
                    412:        goto outside;
                    413:     }
                    414: 
                    415:     if (!text) {
                    416:        n = pe -> pe_len;
                    417:        if (write (fd, (char *) pe -> pe_prim, n) != n)
                    418:            return NOTOK;
                    419:        goto outside;
                    420:     }
                    421: 
                    422:     n = 0;
                    423:     cp = (char *) pe -> pe_prim;
                    424:     for (ep = (bp = cp) + pe -> pe_len; bp < ep;)
                    425:        switch (*bp) {
                    426: #ifndef        BRIDGE
                    427:             case '\r':
                    428:                if (!effector) {
                    429:                    bp++;
                    430:                    break;
                    431:                }
                    432:                *bp++ = '\n';
                    433:                i = bp - cp;
                    434:                if (write (fd, cp, i) != i)
                    435:                    return NOTOK;
                    436:                cp = ++bp, n += i;
                    437:                break;
                    438: #endif
                    439: 
                    440:            case 033:
                    441:                switch (*++bp) {
                    442:                    case 0x28:  /* G0: 02/08 04/02 */
                    443:                        if (*++bp == 0x42) {
                    444:                            register char *dp;
                    445: 
                    446: write_it: ;
                    447:                            dp = bp - 2;
                    448:                            if ((i = (dp - cp)) > 0
                    449:                                    && write (fd, cp, i) != i)
                    450:                                return NOTOK;
                    451:                            cp = ++bp, n += i;
                    452:                        }
                    453:                        else
                    454:                            bp--;
                    455:                        break;
                    456: 
                    457:                    case 0x2d:  /* G1: 02/13 04/01 */
                    458:                        if (*++bp == 0x41)
                    459:                            goto write_it;
                    460:                        else
                    461:                            bp--;
                    462:                        break;
                    463: 
                    464:                    default:    /* unknown, pass it on... */
                    465:                        break;
                    466:                }
                    467:                break;
                    468: 
                    469:            default:
                    470:                bp++;
                    471:                break;
                    472:        }
                    473: 
                    474:     if (i = bp - cp) {
                    475:        if (write (fd, cp, i) != i)
                    476:            return NOTOK;
                    477: 
                    478:        n += i;
                    479:     }
                    480: 
                    481: outside: ;
                    482:     if (text && !effector) {
                    483: #ifndef        BRIDGE
                    484:        if (write (fd, "\n", 1) != 1)
                    485: #else
                    486:        if (write (fd, "\r\n", 2) != 2)
                    487: #endif
                    488:            return NOTOK;
                    489:     }
                    490: 
                    491:     return n;
                    492: }
                    493: 
                    494: /*  */
                    495: 
                    496: /* right from MH's sbr/path.c... */
                    497: 
                    498: #define        CWD     "./"
                    499: #define        NCWD    (sizeof CWD - 1)
                    500: #define        DOT     "."
                    501: #define        DOTDOT  ".."
                    502: #define        PWD     "../"
                    503: #define        NPWD    (sizeof PWD - 1)
                    504: 
                    505: 
                    506: int    compath (f)
                    507: register char  *f;
                    508: {
                    509:     register char  *cp,
                    510:                    *dp;
                    511: 
                    512:     if (*f != '/')
                    513:        return;
                    514: 
                    515:     for (cp = f; *cp;)
                    516:        if (*cp == '/') {
                    517:            switch (*++cp) {
                    518:                case NULL: 
                    519:                    if (--cp > f)
                    520:                        *cp = NULL;
                    521:                    break;
                    522: 
                    523:                case '/': 
                    524: #ifdef apollo
                    525:                     if ((f+1) == cp) {
                    526:                        cp++;
                    527:                        continue;
                    528:                     }
                    529: #endif                    
                    530:                    for (dp = cp; *dp == '/'; dp++)
                    531:                        continue;
                    532:                    (void) strcpy (cp--, dp);
                    533:                    continue;
                    534: 
                    535:                case '.': 
                    536:                    if (strcmp (cp, DOT) == 0) {
                    537:                        if (cp > f + 1)
                    538:                            cp--;
                    539:                        *cp = NULL;
                    540:                        break;
                    541:                    }
                    542:                    if (strcmp (cp, DOTDOT) == 0) {
                    543:                        for (cp -= 2; cp > f; cp--)
                    544:                            if (*cp == '/')
                    545:                                break;
                    546:                        if (cp <= f)
                    547:                            cp = f + 1;
                    548:                        *cp = NULL;
                    549:                        break;
                    550:                    }
                    551:                    if (strncmp (cp, PWD, NPWD) == 0) {
                    552:                        for (dp = cp - 2; dp > f; dp--)
                    553:                            if (*dp == '/')
                    554:                                break;
                    555:                        if (dp <= f)
                    556:                            dp = f;
                    557:                        (void) strcpy (dp, cp + NPWD - 1);
                    558:                        cp = dp;
                    559:                        continue;
                    560:                    }
                    561:                    if (strncmp (cp, CWD, NCWD) == 0) {
                    562:                        (void) strcpy (cp - 1, cp + NCWD - 1);
                    563:                        cp--;
                    564:                        continue;
                    565:                    }
                    566:                    continue;
                    567: 
                    568:                default: 
                    569:                    cp++;
                    570:                    continue;
                    571:            }
                    572:            break;
                    573:        }
                    574:        else
                    575:            cp++;
                    576: }

unix.superglobalmegacorp.com

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