Annotation of 43BSDTahoe/new/xns/examples/remotetool/xnsremote.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *rcsid = "$Header: xnsremote.c,v 1.3 87/04/01 08:23:53 ed Exp $";
        !             3: #endif lint
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 1986, 1987 Xerox Corporation.
        !             7:  */
        !             8: 
        !             9: /* $Log:       xnsremote.c,v $
        !            10:  * Revision 1.3  87/04/01  08:23:53  ed
        !            11:  * Changed for new MakeSecondaryCreds call.
        !            12:  * 
        !            13:  * Revision 1.2  87/03/25  10:55:53  ed
        !            14:  * Don't reset usefiling in login.
        !            15:  * 
        !            16:  * Revision 1.1  87/03/17  16:29:19  ed
        !            17:  * Initial revision
        !            18:  * 
        !            19:  * 
        !            20:  */
        !            21: 
        !            22: #include <stdio.h>
        !            23: #include <sys/time.h>
        !            24: #include <sys/param.h>
        !            25: #include <sys/stat.h>
        !            26: #include <netns/ns.h>
        !            27: #include <netns/sp.h>
        !            28: #include <xnscourier/FilingSubset1.h>
        !            29: #include <xnscourier/Filing4.h>
        !            30: #include <xnscourier/except.h>
        !            31: #undef __Clearinghouse2                        /* Filing4.h defs this */
        !            32: #include <xnscourier/CH.h>
        !            33: #include <xnscourier/filetypes.h>
        !            34: 
        !            35: #ifdef PRINTOPTION
        !            36: #ifndef XNSPRINT
        !            37: #define XNSPRINT       "/usr/new/xnsprint"
        !            38: #endif XNSPRINT
        !            39: 
        !            40: #ifndef MAHA
        !            41: #define MAHA           "/usr/new/maha"
        !            42: #endif MAHA
        !            43: #endif PRINTOPTION
        !            44: 
        !            45: #define ROOT_DIRECTORY "/"
        !            46: 
        !            47: CourierConnection *connected;
        !            48: Clearinghouse3_ObjectName hostobjname;
        !            49: Authentication3_Verifier verifier;
        !            50: 
        !            51: /* the following 3 items make up the current session */
        !            52: FilingSubset1_Session session; /* the current session */
        !            53: Clearinghouse3_ObjectName username;
        !            54: FilingSubset1_Handle rootHandle;
        !            55: char cur_dir[512]= 0;
        !            56: char cur_pathname[512]= 0;
        !            57: char cur_name[512]= 0;
        !            58: 
        !            59: static FilingSubset1_ControlSequence nullControls = {0,0};
        !            60: static FilingSubset1_ScopeSequence nullScope = {0,0};
        !            61: 
        !            62: /* global data used to communicate with BDT procedures
        !            63:  */
        !            64: extern GetAttributeSequences(), 
        !            65:        listproc(), retrieveproc();
        !            66: 
        !            67: char *AttrToString();
        !            68: Boolean AttrToBoolean();
        !            69: LongCardinal AttrToLongCardinal();
        !            70: Cardinal AttrToCardinal();
        !            71: 
        !            72: static (*ProcEachSeq)();
        !            73: static FILE *fout= stdout;
        !            74: 
        !            75: Boolean files_found= FALSE;
        !            76: Boolean filing_subset= TRUE;
        !            77: Boolean usefiling= TRUE;
        !            78: Boolean verbose= FALSE;
        !            79: 
        !            80: LongCardinal typevalue= 0;
        !            81: char *service, *pager;
        !            82: extern int errno;
        !            83: char thru_options[512];
        !            84: 
        !            85: struct name_entry {
        !            86:        char *pathname;
        !            87:        LongCardinal type;
        !            88: } ;
        !            89: 
        !            90: static struct name_entry *name_list= 0;
        !            91: static int name_count= 0;
        !            92: static int name_size= 0;
        !            93: #define MAX_NAMES      10
        !            94: 
        !            95: main(argc, argv)
        !            96: int argc;
        !            97: char *argv[];
        !            98: {
        !            99:        char *file, *rightbrkt;
        !           100:        char oldservice[100];
        !           101:        char *index(), *getenv();
        !           102:        int i;
        !           103:        CourierConnection *hookup();
        !           104:        int opt;
        !           105:        extern int optind;
        !           106:        extern char *optarg;
        !           107: 
        !           108: #ifdef PRINTOPTION
        !           109:        static char *options= "fvP:";
        !           110:        static char *usage= "Usage: %s [-f] [-v] [-P printer] file1 ... filen\n";
        !           111: #else PRINTOPTION
        !           112:        static char *options= "fvs";
        !           113:        static char *usage= "Usage: %s [-f] [-v] [-s] file1 ... filen\n";
        !           114: #endif PRINTOPTION
        !           115: 
        !           116:        if ( argc < 1 ) {
        !           117:                fprintf(stderr, usage, argv[0]);
        !           118:                exit(1);
        !           119:        }
        !           120: 
        !           121: #ifndef PRINTOPTION
        !           122:        pager= getenv("PAGER");
        !           123: #endif PRINTOPTION
        !           124: 
        !           125:        strcpy(thru_options, "");
        !           126: 
        !           127:        while ((opt= getopt(argc, argv, options)) != EOF) 
        !           128:                switch (opt) {
        !           129:                        case 'v':
        !           130:                                verbose++;
        !           131:                                break;
        !           132: 
        !           133:                        case 'f':
        !           134:                                usefiling= 0;
        !           135:                                break;
        !           136: 
        !           137: #ifdef PRINTOPTION
        !           138:                        case 'P' :
        !           139:                                strcat(thru_options, " -P ");
        !           140:                                strcat(thru_options, optarg);
        !           141:                                break;
        !           142: #else PRINTOPTION
        !           143:                        case 's' :
        !           144:                                pager= '\0';    /* override pager */
        !           145:                                break;
        !           146: #endif PRINTOPTION
        !           147:                        default:
        !           148:                                fprintf(stderr, "Invalid command option -%c\n", opt);
        !           149:                                exit(1);
        !           150:                }
        !           151: 
        !           152:        for ( ; optind < argc ; optind++ ) {
        !           153:                if ( getserviceandfile(argv[optind], &service, &file) == 0 ) {
        !           154:                        fprintf(stderr, "Invalid name %s\n", argv[optind]);
        !           155:                        exit(1);
        !           156:                }
        !           157:                DURING {
        !           158:                        if ( strcmp(oldservice, service) != 0 ) {
        !           159:                                if ( (connected= hookup(service)) == (CourierConnection *)0 ) {
        !           160:                                        fprintf(stderr, "\nCan't connect to %s\n", service);
        !           161:                                        continue;
        !           162:                                }
        !           163:                                login(0,0);
        !           164:                                strcpy(oldservice, service);
        !           165:                        }
        !           166: 
        !           167:                        getfile(file);
        !           168: 
        !           169:                } HANDLER {
        !           170:                        FilingErrMsg(Exception.Code, Exception.Message);
        !           171: #ifndef PRINTOPTION
        !           172:                        if ( fout != stdout )
        !           173:                                pclose(fout);
        !           174: #endif PRINTOPTION
        !           175:                } END_HANDLER;
        !           176: 
        !           177:        }
        !           178: 
        !           179:        return(0);
        !           180: }
        !           181: 
        !           182: getserviceandfile(name, srvcptr, fileptr)
        !           183: char *name;
        !           184: char **srvcptr, **fileptr;
        !           185: {
        !           186:        char *sptr, *fptr;
        !           187:        char *index(), *rindex();
        !           188: 
        !           189:        /*
        !           190:         * look for Xerox forms first:
        !           191:         *      [host]filename
        !           192:         */
        !           193: 
        !           194:        if ( (sptr= index(name, '[')) != 0 ) {
        !           195:                if ( (fptr= index(sptr, ']')) != 0 ) {
        !           196:                        *fptr= '\0';
        !           197:                        *srvcptr= sptr + 1;
        !           198:                        *fileptr= fptr + 1;
        !           199:                        return(1);
        !           200:                } else
        !           201:                        return(0);
        !           202:        }
        !           203: 
        !           204:        /*
        !           205:         *      (host)filename
        !           206:         */
        !           207: 
        !           208:        if ( (sptr= index(name, '(')) != 0 ) {
        !           209:                if ( (fptr= index(sptr, ')')) != 0 ) {
        !           210:                        *fptr= '\0';
        !           211:                        *srvcptr= sptr + 1;
        !           212:                        *fileptr= fptr + 1;
        !           213:                        return(1);
        !           214:                } else
        !           215:                        return(0);
        !           216:        }
        !           217: 
        !           218:        /*
        !           219:         * look for XNS style with trailing : delimiter
        !           220:         * (assumes no : in file name, use alternate spec instead)
        !           221:         *      object:domain:organization:filename
        !           222:         *              domain & organization are optional
        !           223:         */
        !           224: 
        !           225:        if ( (fptr= rindex(name, ':')) != 0 ) {
        !           226:                *fptr= '\0';
        !           227:                *srvcptr= name;
        !           228:                *fileptr= fptr + 1;
        !           229:                return(1);
        !           230:        } else
        !           231:                return(0);
        !           232: }
        !           233: 
        !           234: copyhandle(dest,src)
        !           235:        FilingSubset1_Handle dest,src;
        !           236: {
        !           237:        if (dest == (Unspecified *) 0) {
        !           238:                fprintf(stderr,"Oops.  dest is null in copyhandle\n");
        !           239:                exit(1);
        !           240:        }
        !           241:        dest[0] = src[0];
        !           242:        dest[1] = src[1];
        !           243: }
        !           244: 
        !           245: getfilehandle(filename, handle)
        !           246:        char *filename;
        !           247:        FilingSubset1_Handle handle;
        !           248: {
        !           249:        FilingSubset1_Attribute pathattr[1];
        !           250:        FilingSubset1_AttributeSequence attrseq;
        !           251:        FilingSubset1_OpenResults openresult;
        !           252:        Filing4_OpenResults openresult2;
        !           253: 
        !           254:        if (filename == (char *)0 || *filename == '\000' || (strcmp(filename, "/") == 0) ) {
        !           255:                if ( filing_subset )
        !           256:                        copyhandle(handle,FilingSubset1_nullHandle);
        !           257:                else
        !           258:                        copyhandle(handle,rootHandle);
        !           259:                return;
        !           260:        }
        !           261: 
        !           262:        attrseq.length = 1;
        !           263:        attrseq.sequence = pathattr;
        !           264:        pathattr[0].type = FilingSubset1_pathname;
        !           265:        copyhandle(handle, FilingSubset1_nullHandle);
        !           266: #ifdef XEROXFSCOMPATIBILITY
        !           267:        if ( filename[0] == '/')
        !           268:                StringToAttr(filename+1, &pathattr[0]);
        !           269:        else
        !           270:                StringToAttr(filename, &pathattr[0]);
        !           271: #else XEROXFSCOMPATIBILITY
        !           272:        StringToAttr(filename, &pathattr[0]);
        !           273: #endif XEROXFSCOMPATIBILITY
        !           274:        alarm(0);
        !           275:        if ( filing_subset ) {
        !           276:                openresult = FilingSubset1_Open(connected, NULL, attrseq,
        !           277:                                          handle, nullControls,
        !           278:                                          session);
        !           279:                copyhandle(handle, openresult.file);
        !           280:        } else {
        !           281:                openresult2 = Filing4_Open(connected, NULL, attrseq,
        !           282:                                          handle, nullControls,
        !           283:                                          session);
        !           284:                copyhandle(handle, openresult2.file);
        !           285:        } 
        !           286: }
        !           287: 
        !           288: getdirhandle(filename, handle)
        !           289:        char *filename;
        !           290:        FilingSubset1_Handle handle;
        !           291: {
        !           292:        FilingSubset1_Attribute pathattr[1];
        !           293:        FilingSubset1_AttributeSequence attrseq;
        !           294:        FilingSubset1_OpenResults openresult;
        !           295:        Filing4_OpenResults openresult2;
        !           296:        char *rindex();
        !           297:        char *slash;
        !           298: 
        !           299:        if (filename == (char *)0 || *filename == '\000' || (strcmp(filename, "/") == 0) ) {
        !           300:                strcpy(cur_pathname, "/");
        !           301:                strcpy(cur_name, "/");
        !           302:                if ( filing_subset )
        !           303:                        copyhandle(handle,FilingSubset1_nullHandle);
        !           304:                else
        !           305:                        copyhandle(handle,rootHandle);
        !           306:                return;
        !           307:        } else if ( filename[0] == '/' ) {
        !           308:                strcpy(cur_pathname, filename);
        !           309:        } else {
        !           310:                strcpy(cur_pathname, cur_dir);
        !           311:                if ( strcmp(cur_pathname, "/") != 0 )
        !           312:                        strcat(cur_pathname, "/");
        !           313:                strcat(cur_pathname, filename); 
        !           314:        }
        !           315: 
        !           316:        if ( (slash= rindex(cur_pathname,'/')) == NULL )
        !           317:                strcpy(cur_name, cur_pathname);
        !           318:        else
        !           319:                strcpy(cur_name, slash+1);
        !           320: 
        !           321:        if ( filing_subset ) {
        !           322:                copyhandle(handle, FilingSubset1_nullHandle);
        !           323:        } else {
        !           324:                if ( slash == cur_pathname) {
        !           325:                        copyhandle(handle, rootHandle);
        !           326:                        return;
        !           327:                }
        !           328: 
        !           329:                attrseq.length = 1;
        !           330:                attrseq.sequence = pathattr;
        !           331:                pathattr[0].type = FilingSubset1_pathname;
        !           332:                copyhandle(handle, FilingSubset1_nullHandle);
        !           333:                *slash= '\0';           /* separate pathname from name */
        !           334: #ifdef XEROXFSCOMPATIBILITY
        !           335:                if ( cur_pathname[0] == '/' )
        !           336:                        StringToAttr(cur_pathname+1, &pathattr[0]);
        !           337:                else
        !           338:                        StringToAttr(cur_pathname, &pathattr[0]);
        !           339: #else XEROXFSCOMPATIBILITY
        !           340:                StringToAttr(cur_pathname, &pathattr[0]);
        !           341: #endif XEROXFSCOMPATIBILITY
        !           342:                *slash= '/';            /* and put back */
        !           343:                alarm(0);
        !           344:                if ( filing_subset ) {
        !           345:                        openresult = FilingSubset1_Open(connected, NULL, attrseq,
        !           346:                                                  handle, nullControls,
        !           347:                                                  session);
        !           348:                        copyhandle(handle, openresult.file);
        !           349:                } else {
        !           350:                        openresult2 = Filing4_Open(connected, NULL, attrseq,
        !           351:                                                  handle, nullControls,
        !           352:                                                  session);
        !           353:                        copyhandle(handle, openresult2.file);
        !           354:                }
        !           355:        }
        !           356: }
        !           357: 
        !           358: freefilehandle(handle)
        !           359:        FilingSubset1_Handle handle;
        !           360: {
        !           361:        if (handle[0] == FilingSubset1_nullHandle[0] &&
        !           362:            handle[1] == FilingSubset1_nullHandle[1])
        !           363:                return;         /* don't free nullHandle */
        !           364:        if (handle[0] == rootHandle[0] &&
        !           365:            handle[1] == rootHandle[1])
        !           366:                return;         /* don't free root directory */
        !           367:        alarm(0);
        !           368:        if ( filing_subset )
        !           369:                FilingSubset1_Close(connected, NULL, handle, session);
        !           370:        else
        !           371:                Filing4_Close(connected, NULL, handle, session);
        !           372: }
        !           373: 
        !           374: CourierConnection *
        !           375: hookup(name)
        !           376:        char *name;
        !           377: {
        !           378:        register struct ns_addr *hostaddr;
        !           379:        extern struct ns_addr *getXNSaddr();
        !           380:        Clearinghouse3_ObjectName defaultobjname;
        !           381:        static char hnamebuf[128];
        !           382:        CourierConnection *cconn;
        !           383: 
        !           384:        CH_NameDefault(&defaultobjname);
        !           385:        hostobjname = CH_StringToName(name, &defaultobjname);
        !           386:        if ((hostaddr = CH_LookupAddrDN( hostobjname, 0, hnamebuf, 128))) {
        !           387:                /* should check here to be sure host is a file service */
        !           388:                hostaddr->x_port = htons(5); /* ?? */
        !           389:                cconn = CourierOpen(hostaddr);
        !           390:                /* reset objname to flush wildcards */
        !           391:                /* clear_Clearinghouse3_ThreePartName(&hostobjname); */
        !           392:                hostobjname = CH_StringToName(hnamebuf, &defaultobjname);
        !           393:        }
        !           394:        return(cconn);
        !           395: }
        !           396: 
        !           397: 
        !           398: login(name,pwd)
        !           399:        char *pwd;
        !           400:        char *name;
        !           401: {
        !           402:        FilingSubset1_Credentials credentials;
        !           403:        FilingSubset1_LogonResults logonresult;
        !           404:        FilingSubset1_LogonResults *resultptr= &logonresult;
        !           405:        Filing4_LogonResults logonresult2;
        !           406:        FilingSubset1_AttributeSequence attrseq;
        !           407:        FilingSubset1_OpenResults openresult;
        !           408:        Filing4_OpenResults openresult2;
        !           409: 
        !           410: 
        !           411:        if ( name != 0 )
        !           412:                username = CH_StringToName(name,&hostobjname);
        !           413: 
        !           414:        if ( usefiling ) {
        !           415:                filing_subset= FALSE;
        !           416:                if ( name == 0 && pwd == 0 ) {
        !           417:                        GetSimpleCredsAndVerifier(&username, 0, 
        !           418:                                                        &credentials.primary, &verifier);
        !           419:                } else {
        !           420:                        MakeSimpleCredsAndVerifier(&username,pwd,
        !           421:                                                &credentials.primary, &verifier);
        !           422:                }
        !           423:                logonresult2= Filing4_Logon(connected, NULL, hostobjname,
        !           424:                                                credentials.primary, verifier);
        !           425:                resultptr= (FilingSubset1_LogonResults *) &logonresult2;
        !           426:                
        !           427:        } else {
        !           428:                if ( name == 0 && pwd == 0 ) {
        !           429:                        GetSimpleCredsAndVerifier(&username, 0, &credentials.primary, &verifier);
        !           430:                        MakeSecondaryCreds(hostobjname.object, 0, 0, &credentials.secondary);
        !           431:                } else {
        !           432:                        MakeSimpleCredsAndVerifier(0, pwd, &credentials.primary, &verifier);
        !           433:                        MakeSecondaryCreds(hostobjname.object, name, pwd, &credentials.secondary);
        !           434:                }
        !           435:                filing_subset= TRUE;
        !           436:                DURING 
        !           437:                        logonresult = FilingSubset1_Logon(connected, NULL, hostobjname,
        !           438:                                            credentials, verifier);
        !           439:                HANDLER {
        !           440:                        switch (Exception.Code) {
        !           441:                        case REJECT_ERROR:
        !           442:                                filing_subset= FALSE;
        !           443:                                logonresult2= Filing4_Logon(connected, NULL, hostobjname,
        !           444:                                                        credentials.primary, verifier);
        !           445:                                resultptr= (FilingSubset1_LogonResults *) &logonresult2;
        !           446:                                break;
        !           447:                        default:
        !           448:                                RERAISE;
        !           449:                        }
        !           450:                } END_HANDLER;
        !           451:        }
        !           452: 
        !           453:        if ( filing_subset )
        !           454:                session = resultptr->session;
        !           455:        else
        !           456:                session = resultptr->session;
        !           457: 
        !           458:        attrseq.length= 0;
        !           459:        attrseq.sequence= 0;
        !           460:        if ( filing_subset ) {
        !           461:                openresult= FilingSubset1_Open(connected, NULL, attrseq,
        !           462:                                         FilingSubset1_nullHandle, nullControls,
        !           463:                                         session);
        !           464:                copyhandle(rootHandle, openresult.file);
        !           465:        } else {
        !           466:                openresult2= Filing4_Open(connected, NULL, attrseq,
        !           467:                                         FilingSubset1_nullHandle, nullControls,
        !           468:                                         session);
        !           469:                copyhandle(rootHandle, openresult2.file);
        !           470:        }
        !           471:        strcpy(cur_dir, ROOT_DIRECTORY);
        !           472: }
        !           473: 
        !           474: logout()
        !           475: {
        !           476:        if ( filing_subset )
        !           477:                FilingSubset1_Logoff(connected, NULL, session);
        !           478:        else
        !           479:                Filing4_Logoff(connected, NULL, session);
        !           480:        clear_FilingSubset1_Session(&session);
        !           481: }
        !           482: 
        !           483: 
        !           484: getfile(remote)
        !           485:        char *remote;
        !           486: {
        !           487:        FILE *popen();
        !           488:        FilingSubset1_Handle remotehandle; /* note: an array */
        !           489:        FilingSubset1_Handle dirhandle; /* note: an array */
        !           490:        FilingSubset1_AttributeTypeSequence typeseq;
        !           491:        FilingSubset1_AttributeType tsvals[10];
        !           492:        FilingSubset1_ScopeSequence scopeseq;
        !           493:        FilingSubset1_Scope scope;
        !           494:        char pcmd[500];
        !           495:        int i;
        !           496:        register struct name_entry *entry;
        !           497: 
        !           498:        name_count= 0;
        !           499:        name_size= MAX_NAMES;
        !           500:        if ( (name_list= (struct name_entry *) malloc(sizeof(struct name_entry) * name_size)) == 0 ) {
        !           501:                perror("getfile: ");
        !           502:                return;
        !           503:        }
        !           504: 
        !           505:        typeseq.length = 0;  typeseq.sequence = tsvals;
        !           506:        scopeseq.length= 1; scopeseq.sequence= &scope;
        !           507:        scope.designator= FilingSubset1_filter;
        !           508:        scope.FilingSubset1_filter_case.designator= FilingSubset1_matches;
        !           509:        if ( filing_subset )
        !           510:                scope.FilingSubset1_filter_case.FilingSubset1_matches_case.attribute.type= FilingSubset1_pathname;
        !           511:        else
        !           512:                scope.FilingSubset1_filter_case.FilingSubset1_matches_case.attribute.type= FilingSubset1_name;
        !           513: 
        !           514:        copyhandle(remotehandle, FilingSubset1_nullHandle);
        !           515:        getdirhandle(remote, dirhandle);
        !           516: 
        !           517:        if ( filing_subset )
        !           518:                StringToAttr(cur_pathname,&scope.FilingSubset1_filter_case.FilingSubset1_matches_case.attribute);
        !           519:        else
        !           520:                StringToAttr(cur_name,&scope.FilingSubset1_filter_case.FilingSubset1_matches_case.attribute);
        !           521: 
        !           522:        typeseq.length = 2;
        !           523:        typeseq.sequence[0] = FilingSubset1_pathname;
        !           524:        typeseq.sequence[1] = FilingSubset1_type;
        !           525: 
        !           526:        ProcEachSeq = listproc;
        !           527:        if ( filing_subset )
        !           528:                FilingSubset1_List(connected, GetAttributeSequences, dirhandle,
        !           529:                             typeseq, scopeseq,
        !           530:                             BulkData1_immediateSink, session);
        !           531:        else
        !           532:                Filing4_List(connected, GetAttributeSequences, dirhandle,
        !           533:                             typeseq, scopeseq,
        !           534:                             BulkData1_immediateSink, session);
        !           535: 
        !           536: 
        !           537:        if ( !files_found ) {
        !           538:                fprintf(stderr, "\n(%s)%s not found\n", service, remote);
        !           539:        } else {
        !           540:                for ( i= 0 ; i < name_count ; i++ ) {
        !           541:                        entry= &name_list[i];
        !           542: #ifdef PRINTOPTION
        !           543:                        if ( (entry->type != FilingSubset1_tText) && (entry->type != TYPE_VPMailNote) &&
        !           544:                                        (entry->type != TYPE_Interpress) ) {
        !           545:                                fprintf(stderr, "\n\n\n\nInvalid file type (%d)\n\n\n\n", entry->type);
        !           546:                                clear_String(&entry->pathname);
        !           547:                                continue;
        !           548:                        }
        !           549: 
        !           550:                        if ( entry->type == TYPE_Interpress ) {
        !           551:                                sprintf(pcmd, "%s -q -b \"(%s)%s\"%s -", XNSPRINT, service, entry->pathname, thru_options);
        !           552:                        } else {
        !           553:                                sprintf(pcmd, "%s -b \"(%s)%s\"%s", MAHA, service, entry->pathname, thru_options);
        !           554:                        }
        !           555: 
        !           556:                        if ( (fout= popen(pcmd, "w")) == NULL ) {
        !           557:                                perror("popen: ");
        !           558:                                exit(1);
        !           559:                        }
        !           560: 
        !           561:                        if (verbose) {
        !           562:                                fprintf(stderr, "\n\printing (%s)%s...\n\n",service,entry->pathname);
        !           563:                        }
        !           564: #else PRINTOPTION
        !           565:                        if ( entry->type != FilingSubset1_tText ) {
        !           566:                                fprintf(stderr, "\n\n\nCan only view text files.\n\n\n");
        !           567:                                clear_String(&entry->pathname);
        !           568:                                continue;
        !           569:                        }
        !           570: 
        !           571:                        if ( pager == NULL || *pager == '\0' ) {
        !           572:                                fout= stdout;
        !           573:                        } else {
        !           574:                                sprintf(pcmd, "%s%s", pager, thru_options);
        !           575:                                if ( (fout= popen(pcmd, "w")) == NULL )
        !           576:                                        fout= stdout;
        !           577:                        }
        !           578: 
        !           579:                        if (verbose) {
        !           580:                                fprintf(stderr, "\n\n\n\nretrieving (%s)%s...\n\n\n\n",service,entry->pathname);
        !           581:                        }
        !           582: #endif PRINTOPTION
        !           583: 
        !           584:                        typevalue= entry->type;
        !           585: 
        !           586:                        getfilehandle(entry->pathname, remotehandle);   /* get file handle */
        !           587:                        if ( filing_subset ) {
        !           588:                                FilingSubset1_Retrieve(connected, retrieveproc, remotehandle,
        !           589:                                                 BulkData1_immediateSink, session);
        !           590:                        } else {
        !           591:                                Filing4_Retrieve(connected, retrieveproc, remotehandle,
        !           592:                                                 BulkData1_immediateSink, session);
        !           593:                        }
        !           594: 
        !           595:                        freefilehandle(remotehandle);
        !           596: #ifdef PRINTOPTION
        !           597:                        pclose(fout);
        !           598: #else PRINTOPTION
        !           599:                        if ( fout != stdout )
        !           600:                                pclose(fout);
        !           601: #endif PRINTOPTION
        !           602: 
        !           603:                        clear_String(&entry->pathname);
        !           604:                }
        !           605:        } 
        !           606: 
        !           607:        free(name_list);
        !           608:        freefilehandle(dirhandle);
        !           609: 
        !           610: }
        !           611: 
        !           612: listproc(attr)
        !           613:        FilingSubset1_AttributeSequence attr;
        !           614: {
        !           615:        int i;
        !           616:        FilingSubset1_AttributeType t;
        !           617:        struct name_entry *entry;
        !           618: 
        !           619:        files_found= TRUE;
        !           620: 
        !           621: /*
        !           622:  *     Xerox file servers will return all versions of the requested file in
        !           623:  *     ascending version order. We assume that the last version will be the
        !           624:  *     highest and remember that name so that the retrieve will pull the
        !           625:  *     highest version of the file. If we request just the file with no
        !           626:  *     version, the server will return the oldest version (not what I would
        !           627:  *     expect...)
        !           628:  */
        !           629: 
        !           630:        if ( name_count > name_size ) {
        !           631:                name_size += MAX_NAMES;
        !           632:                name_list= (struct name_entry *) realloc(name_list,
        !           633:                                sizeof(struct name_entry) * name_size);
        !           634:        }
        !           635: 
        !           636:        entry= &name_list[name_count];
        !           637:        for (i = 0; i < attr.length; i++) {
        !           638:                t = attr.sequence[i].type;
        !           639:                if (t == FilingSubset1_name || t == FilingSubset1_pathname) {
        !           640:                        entry->pathname = AttrToString(&attr.sequence[i]);
        !           641:                } else if (t == FilingSubset1_type) {
        !           642:                        entry->type = AttrToLongCardinal(&attr.sequence[i]);
        !           643:                }
        !           644:        }
        !           645:        name_count++;
        !           646: }
        !           647: 
        !           648: 
        !           649: #define MAXPACKS 20
        !           650: static
        !           651: GetAttributeSequences(conn)
        !           652:        CourierConnection *conn;
        !           653: {
        !           654:        int count, i;
        !           655:        Unspecified buffer[MAXWORDS*MAXPACKS], *bp, *bufend;
        !           656:        FilingSubset1_StreamOfAttributeSequence attrs;
        !           657:        
        !           658:        files_found= FALSE;
        !           659: 
        !           660:        bufend = buffer;
        !           661:        bp = buffer+((MAXWORDS-1)*MAXPACKS);    /* end of available space */
        !           662:        while ((count = BDTread(conn, (char*)bufend, 
        !           663:                                MAXWORDS*sizeof(Unspecified))) > 0) {
        !           664:                bufend += count/sizeof(Unspecified);
        !           665:                if (bufend > bp) {
        !           666:                        fprintf(stderr,"BDT read too big to fit\n");
        !           667:                        BDTabort(conn);
        !           668:                        /* should clear out stuff here if we knew how much */
        !           669:                }
        !           670:        }
        !           671:        bp = buffer;
        !           672:        while (bp < bufend) {
        !           673:                bp += internalize_FilingSubset1_StreamOfAttributeSequence(&attrs,bp);
        !           674:                if (0 == (int) attrs.designator) {
        !           675:                   for (i=0; i < attrs.nextSegment_case.segment.length; i++) {
        !           676:                        (*ProcEachSeq)(
        !           677:                                attrs.nextSegment_case.segment.sequence[i]);
        !           678:                   }
        !           679:                   free(attrs.nextSegment_case.segment.sequence);
        !           680:                } else {
        !           681:                   for (i = 0; i < attrs.lastSegment_case.length; i++) {
        !           682:                        (*ProcEachSeq)(
        !           683:                                attrs.lastSegment_case.sequence[i]);
        !           684:                   }
        !           685:                   free(attrs.lastSegment_case.sequence);
        !           686:                   return;
        !           687:                }
        !           688:        }
        !           689: }
        !           690: 
        !           691: int
        !           692: getBDTch(conn,bpp)
        !           693:        CourierConnection *conn;
        !           694:        u_char **bpp;
        !           695: {
        !           696:        static u_char buffer[SPPMAXDATA];
        !           697:        static int count;
        !           698: 
        !           699:        if (*bpp == NULL) {*bpp = buffer; count = 0;}
        !           700:        if (*bpp >= buffer+count) {
        !           701:                count=BDTread(conn,buffer,sizeof(buffer));
        !           702:                *bpp = buffer;
        !           703:        }
        !           704:        if (count <= 0) return(EOF);
        !           705:        else return(*((*bpp)++));
        !           706:                
        !           707: }
        !           708: 
        !           709: retrieveproc(conn)
        !           710:        CourierConnection *conn;
        !           711: {
        !           712:        int count, ocount, ch;
        !           713:        char buffer[SPPMAXDATA];
        !           714:        int charset, charset16;
        !           715:        char *bp;
        !           716: 
        !           717:        errno = ocount = 0;
        !           718:        fflush(fout);
        !           719: 
        !           720:        switch (typevalue) {
        !           721:        default :
        !           722:                fprintf(stderr, "Unsupported file type\n");
        !           723:                BDTabort(conn);
        !           724:                break;
        !           725: 
        !           726:        case TYPE_Interpress :
        !           727:                while ((count = BDTread(conn, buffer, sizeof(buffer))) > 0) {
        !           728:                        if ((ocount = write (fileno(fout), buffer, count)) < 0) {
        !           729:                                perror("write");
        !           730:                                BDTabort(conn);
        !           731:                                break;
        !           732:                        }
        !           733:                }
        !           734:                if (count < 0) perror("netin");
        !           735:                break;
        !           736: 
        !           737:        case TYPE_VPMailNote :
        !           738:        case TYPE_A :
        !           739:                charset = 0; charset16 = 0; bp = NULL;
        !           740:                while ((ch = getBDTch(conn,&bp)) != EOF) {
        !           741:                        if (ch == '\377') {
        !           742:                                ch = getBDTch(conn,&bp);
        !           743:                                if (ch == '\377') charset16 = 1;
        !           744:                                else charset = ch;
        !           745:                                continue;
        !           746:                        }
        !           747:                        if (charset16) {
        !           748:                                charset = ch;
        !           749:                                ch = getBDTch(conn,&bp);
        !           750:                        }
        !           751:                        switch (charset) {
        !           752:                        case 0: /* normal character set -- minimal xlation */
        !           753:                                if (ch == '\r') {
        !           754:                                        int nextch;
        !           755: 
        !           756:                                        putc('\n',fout);
        !           757:                                        if ( (nextch = getBDTch(conn,&bp)) != '\n'){
        !           758:                                            if (nextch == '\r')
        !           759:                                                putc('\n',fout);
        !           760:                                            else if ( nextch != EOF )
        !           761:                                                putc(nextch,fout);
        !           762:                                            else
        !           763:                                                continue;
        !           764:                                        }
        !           765:                                        break;
        !           766:                                }
        !           767:                                else if (ch == ','+0200) ch = '_';
        !           768:                                /* more mapping here */
        !           769:                                putc(ch,fout);
        !           770:                                break;
        !           771:                        default:
        !           772:                                break; /* ignore */
        !           773:                        }
        !           774:                }
        !           775:                /* if (count < 0) perror("netin"); */
        !           776:                break;
        !           777:        }
        !           778: }
        !           779: 

unix.superglobalmegacorp.com

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