Annotation of 43BSDTahoe/new/xns/examples/archive/xnsrestore.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *rcsid = "$Header: xnsrestore.c,v 1.1 87/03/17 16:27:26 ed Exp $";
                      3: #endif lint
                      4: 
                      5: /*
                      6:  * Copyright (c) 1986, 1987 Xerox Corporation.
                      7:  */
                      8: 
                      9: /* $Log:       xnsrestore.c,v $
                     10:  * Revision 1.1  87/03/17  16:27:26  ed
                     11:  * Initial revision
                     12:  * 
                     13:  * 
                     14:  */
                     15: 
                     16: #include <stdio.h>
                     17: #include <sys/time.h>
                     18: #include <sys/param.h>
                     19: #include <sys/stat.h>
                     20: #include <netns/ns.h>
                     21: #include <netns/sp.h>
                     22: #include <xnscourier/Filing4.h>
                     23: #include <xnscourier/except.h>
                     24: #include <xnscourier/CH.h>
                     25: #include <xnscourier/filetypes.h>
                     26: #define XNS_TIME_DIFFERENCE    2177452800      /* [(1970-1901) years * 365 days/year + 17 leap days */
                     27:                                                /* * 24 hours/day * 60 minutes/hour * 60 seconds/minute */
                     28: 
                     29: #define ROOT_DIRECTORY "/"
                     30: 
                     31: CourierConnection *connected;
                     32: Clearinghouse2_ObjectName hostobjname;
                     33: Authentication2_Verifier verifier;
                     34: 
                     35: /* the following 3 items make up the current session */
                     36: Filing4_Session session;       /* the current session */
                     37: Clearinghouse2_ObjectName username;
                     38: Filing4_Handle rootHandle;
                     39: char cur_dir[512]= 0;
                     40: char cur_pathname[512]= 0;
                     41: char cur_name[512]= 0;
                     42: 
                     43: static Filing4_ControlSequence nullControls = {0,0};
                     44: 
                     45: /* global data used to communicate with BDT procedures
                     46:  */
                     47: extern GetAttributeSequences(), 
                     48:        listproc(), isdirproc(), storeproc();
                     49: 
                     50: char *AttrToString();
                     51: Boolean AttrToBoolean();
                     52: LongCardinal AttrToLongCardinal();
                     53: Cardinal AttrToCardinal();
                     54: 
                     55: static (*ProcEachSeq)();
                     56: static FILE *fin= NULL;
                     57: FILE *lfile= NULL;
                     58: 
                     59: Boolean files_found= FALSE;
                     60: Boolean verbose= FALSE;
                     61: Boolean is_a_directory= FALSE;
                     62: char *logfile= 0;
                     63: 
                     64: char *ctime();
                     65: long time();
                     66: char *service;
                     67: extern int errno;
                     68: 
                     69: main(argc, argv)
                     70: int argc;
                     71: char *argv[];
                     72: {
                     73:        char *remotefile;
                     74:        char *localfile;
                     75:        int i;
                     76:        CourierConnection *hookup();
                     77:        int opt;
                     78:        extern int optind;
                     79:        extern char *optarg;
                     80: 
                     81:        static char *options= "vl:";
                     82:        static char *usage= "Usage: %s [-v] [-l log-file] local-file remote-file\n";
                     83: 
                     84:        if ( argc < 3 ) {
                     85:                fprintf(stderr, usage, argv[0]);
                     86:                exit(1);
                     87:        }
                     88: 
                     89:        while ((opt= getopt(argc, argv, options)) != EOF) 
                     90:                switch (opt) {
                     91:                        case 'l' :
                     92:                                logfile= optarg;
                     93:                                break;
                     94: 
                     95:                        case 'v' :
                     96:                                verbose++;
                     97:                                break;
                     98: 
                     99:                        default:
                    100:                                fprintf(stderr, "Invalid command option -%c\n", opt);
                    101:                                exit(1);
                    102:                }
                    103: 
                    104:        localfile= argv[optind];
                    105:        optind++;
                    106:        if ( getserviceandfile(argv[optind], &service, &remotefile) == 0 ) {
                    107:                fprintf(stderr, "Invalid name %s\n", argv[optind]);
                    108:                exit(1);
                    109:        }
                    110:        DURING {
                    111:                if ( (connected= hookup(service)) == (CourierConnection *)0 ) {
                    112:                                fprintf(stderr, "\nCan't connect to %s\n", service);
                    113:                                exit(1);
                    114:                }
                    115:                login(0,0);
                    116: 
                    117:                deserializefile(localfile, remotefile);
                    118: 
                    119:        } HANDLER {
                    120:                FilingErrMsg(Exception.Code, Exception.Message);
                    121:        } END_HANDLER;
                    122: 
                    123:        return(0);
                    124: }
                    125: 
                    126: getserviceandfile(name, srvcptr, fileptr)
                    127: char *name;
                    128: char **srvcptr, **fileptr;
                    129: {
                    130:        char *sptr, *fptr;
                    131:        char *index(), *rindex();
                    132: 
                    133:        /*
                    134:         * look for Xerox forms first:
                    135:         *      [host]filename
                    136:         */
                    137: 
                    138:        if ( (sptr= index(name, '[')) != 0 ) {
                    139:                if ( (fptr= index(sptr, ']')) != 0 ) {
                    140:                        *fptr= '\0';
                    141:                        *srvcptr= sptr + 1;
                    142:                        *fileptr= fptr + 1;
                    143:                        return(1);
                    144:                } else
                    145:                        return(0);
                    146:        }
                    147: 
                    148:        /*
                    149:         *      (host)filename
                    150:         */
                    151: 
                    152:        if ( (sptr= index(name, '(')) != 0 ) {
                    153:                if ( (fptr= index(sptr, ')')) != 0 ) {
                    154:                        *fptr= '\0';
                    155:                        *srvcptr= sptr + 1;
                    156:                        *fileptr= fptr + 1;
                    157:                        return(1);
                    158:                } else
                    159:                        return(0);
                    160:        }
                    161: 
                    162:        /*
                    163:         * look for XNS style with trailing : delimiter
                    164:         * (assumes no : in file name, use alternate spec instead)
                    165:         *      object:domain:organization:filename
                    166:         *              domain & organization are optional
                    167:         */
                    168: 
                    169:        if ( (fptr= rindex(name, ':')) != 0 ) {
                    170:                *fptr= '\0';
                    171:                *srvcptr= name;
                    172:                *fileptr= fptr + 1;
                    173:                return(1);
                    174:        } else
                    175:                return(0);
                    176: }
                    177: 
                    178: copyhandle(dest,src)
                    179:        Filing4_Handle dest,src;
                    180: {
                    181:        if (dest == (Unspecified *) 0) {
                    182:                fprintf(stderr,"Oops.  dest is null in copyhandle\n");
                    183:                exit(1);
                    184:        }
                    185:        dest[0] = src[0];
                    186:        dest[1] = src[1];
                    187: }
                    188: 
                    189: getfilehandle(filename, handle)
                    190:        char *filename;
                    191:        Filing4_Handle handle;
                    192: {
                    193:        Filing4_Attribute pathattr[1];
                    194:        Filing4_AttributeSequence attrseq;
                    195:        Filing4_OpenResults openresult;
                    196:        Filing4_OpenResults openresult2;
                    197: 
                    198:        if (filename == (char *)0 || *filename == '\000' || (strcmp(filename, "/") == 0) ) {
                    199:                copyhandle(handle,rootHandle);
                    200:                return;
                    201:        }
                    202: 
                    203:        attrseq.length = 1;
                    204:        attrseq.sequence = pathattr;
                    205:        pathattr[0].type = Filing4_pathname;
                    206:        copyhandle(handle, Filing4_nullHandle);
                    207: #ifdef XEROXFSCOMPATIBILITY
                    208:        if ( filename[0] == '/')
                    209:                StringToAttr(filename+1, &pathattr[0]);
                    210:        else
                    211:                StringToAttr(filename, &pathattr[0]);
                    212: #else XEROXFSCOMPATIBILITY
                    213:        StringToAttr(filename, &pathattr[0]);
                    214: #endif XEROXFSCOMPATIBILITY
                    215:        alarm(0);
                    216:        openresult2 = Filing4_Open(connected, NULL, attrseq,
                    217:                                  handle, nullControls,
                    218:                                  session);
                    219:        copyhandle(handle, openresult2.file);
                    220: }
                    221: 
                    222: getdirhandle(filename, handle)
                    223:        char *filename;
                    224:        Filing4_Handle handle;
                    225: {
                    226:        Filing4_Attribute pathattr[1];
                    227:        Filing4_AttributeSequence attrseq;
                    228:        Filing4_OpenResults openresult;
                    229:        Filing4_OpenResults openresult2;
                    230:        char *rindex();
                    231:        char *slash;
                    232: 
                    233:        if (filename == (char *)0 || *filename == '\000' || (strcmp(filename, "/") == 0) ) {
                    234:                strcpy(cur_pathname, "/");
                    235:                strcpy(cur_name, "/");
                    236:                copyhandle(handle,rootHandle);
                    237:                return;
                    238:        } else if ( filename[0] == '/' ) {
                    239:                strcpy(cur_pathname, filename);
                    240:        } else {
                    241:                strcpy(cur_pathname, cur_dir);
                    242:                if ( strcmp(cur_pathname, "/") != 0 )
                    243:                        strcat(cur_pathname, "/");
                    244:                strcat(cur_pathname, filename); 
                    245:        }
                    246: 
                    247:        if ( (slash= rindex(cur_pathname,'/')) == NULL )
                    248:                strcpy(cur_name, cur_pathname);
                    249:        else
                    250:                strcpy(cur_name, slash+1);
                    251: 
                    252:        if ( slash == cur_pathname) {
                    253:                copyhandle(handle, rootHandle);
                    254:                return;
                    255:        }
                    256: 
                    257:        attrseq.length = 1;
                    258:        attrseq.sequence = pathattr;
                    259:        pathattr[0].type = Filing4_pathname;
                    260:        copyhandle(handle, Filing4_nullHandle);
                    261:        *slash= '\0';           /* separate pathname from name */
                    262: #ifdef XEROXFSCOMPATIBILITY
                    263:        if ( cur_pathname[0] == '/' )
                    264:                StringToAttr(cur_pathname+1, &pathattr[0]);
                    265:        else
                    266:                StringToAttr(cur_pathname, &pathattr[0]);
                    267: #else XEROXFSCOMPATIBILITY
                    268:        StringToAttr(cur_pathname, &pathattr[0]);
                    269: #endif XEROXFSCOMPATIBILITY
                    270:        *slash= '/';            /* and put back */
                    271:        alarm(0);
                    272:        openresult2 = Filing4_Open(connected, NULL, attrseq,
                    273:                                  handle, nullControls, session);
                    274:        copyhandle(handle, openresult2.file);
                    275: }
                    276: 
                    277: freefilehandle(handle)
                    278:        Filing4_Handle handle;
                    279: {
                    280:        if (handle[0] == Filing4_nullHandle[0] &&
                    281:            handle[1] == Filing4_nullHandle[1])
                    282:                return;         /* don't free nullHandle */
                    283:        if (handle[0] == rootHandle[0] &&
                    284:            handle[1] == rootHandle[1])
                    285:                return;         /* don't free root directory */
                    286:        alarm(0);
                    287:        Filing4_Close(connected, NULL, handle, session);
                    288: }
                    289: 
                    290: CourierConnection *
                    291: hookup(name)
                    292:        char *name;
                    293: {
                    294:        register struct ns_addr *hostaddr;
                    295:        extern struct ns_addr *getXNSaddr();
                    296:        Clearinghouse2_ObjectName defaultobjname;
                    297:        static char hnamebuf[128];
                    298:        CourierConnection *cconn;
                    299: 
                    300:        CH_NameDefault(&defaultobjname);
                    301:        hostobjname = CH_StringToName(name, &defaultobjname);
                    302:        if ((hostaddr = CH_LookupAddrDN( hostobjname, 0, hnamebuf, 128))) {
                    303:                /* should check here to be sure host is a file service */
                    304:                hostaddr->x_port = htons(5); /* ?? */
                    305:                cconn = CourierOpen(hostaddr);
                    306:                /* reset objname to flush wildcards */
                    307:                /* clear_Clearinghouse2_ThreePartName(&hostobjname); */
                    308:                hostobjname = CH_StringToName(hnamebuf, &defaultobjname);
                    309:        }
                    310:        return(cconn);
                    311: }
                    312: 
                    313: 
                    314: login(name,pwd)
                    315:        char *pwd;
                    316:        char *name;
                    317: {
                    318:        Filing4_Credentials credentials;
                    319:        Filing4_LogonResults logonresult;
                    320:        Filing4_AttributeSequence attrseq;
                    321:        Filing4_OpenResults openresult;
                    322: 
                    323: 
                    324:        if ( name != 0 )
                    325:                username = CH_StringToName(name,&hostobjname);
                    326: 
                    327:        if ( name == 0 && pwd == 0 ) {
                    328:                GetSimpleCredsAndVerifier(&username, 0, 
                    329:                                        &credentials, &verifier);
                    330:        } else {
                    331:                MakeSimpleCredsAndVerifier(&username,pwd,
                    332:                                        &credentials, &verifier);
                    333:        }
                    334:        logonresult= Filing4_Logon(connected, NULL, hostobjname,
                    335:                                        credentials, verifier);
                    336:        session = logonresult.session;
                    337: 
                    338:        attrseq.length= 0;
                    339:        attrseq.sequence= 0;
                    340:        openresult= Filing4_Open(connected, NULL, attrseq,
                    341:                                 Filing4_nullHandle, nullControls,
                    342:                                 session);
                    343:        copyhandle(rootHandle, openresult.file);
                    344:        strcpy(cur_dir, ROOT_DIRECTORY);
                    345: }
                    346: 
                    347: logout()
                    348: {
                    349:        Filing4_Logoff(connected, NULL, session);
                    350:        clear_Filing4_Session(&session);
                    351: }
                    352: 
                    353: 
                    354: deserializefile(local, remote)
                    355:        char *local;
                    356:        char *remote;
                    357: {
                    358:        FILE *fopen();
                    359:        Filing4_Handle remotehandle; /* note: an array */
                    360:        Filing4_Handle dirhandle; /* note: an array */
                    361:        Filing4_Handle listhandle; /* note: an array */
                    362:        Filing4_DeserializeResults results;
                    363:        Filing4_AttributeSequence attrseq;
                    364:        Filing4_Attribute attrvals[50];
                    365:        Filing4_AttributeTypeSequence typeseq;
                    366:        Filing4_AttributeType tsvals[10];
                    367:        Filing4_ScopeSequence scopeseq;
                    368:        Filing4_Scope scope;
                    369:        Filing4_ScopeSequence lscopeseq;
                    370:        Filing4_Scope lscope;
                    371:        int i;
                    372:        char *name, *rindex();
                    373:        long date;
                    374:        Boolean piping= FALSE;
                    375: 
                    376:        name= '\0';
                    377: 
                    378:        scopeseq.sequence= &scope; lscopeseq.sequence= &lscope;
                    379:        attrseq.sequence= attrvals;
                    380: 
                    381:        if ( strcmp(local, "-") == 0 ) {
                    382:                fin= stdin;
                    383:                piping= TRUE;
                    384:        } else {
                    385:                if ( (fin= fopen(local, "r")) == NULL ) {
                    386:                        perror("Cannot open local file ");
                    387:                        return(1);
                    388:                }
                    389:                if ( (name= rindex(local, '/')) == 0 ) {
                    390:                        name= local;
                    391:                } else {
                    392:                        name++;
                    393:                }
                    394:        }
                    395: 
                    396:        getdirhandle(remote, dirhandle);
                    397: 
                    398:        scopeseq.length= 1;
                    399:        scope.designator= Filing4_filter;
                    400:        scope.Filing4_filter_case.designator= Filing4_matches;
                    401:        scope.Filing4_filter_case.Filing4_matches_case.attribute.type= Filing4_name;
                    402:        StringToAttr(cur_name,&scope.Filing4_filter_case.Filing4_matches_case.attribute);
                    403: 
                    404:        typeseq.length = 2;  typeseq.sequence = tsvals;
                    405:        typeseq.sequence[0] = Filing4_name;
                    406:        typeseq.sequence[1] = Filing4_isDirectory;
                    407: 
                    408:        is_a_directory= FALSE;
                    409: 
                    410:        ProcEachSeq = isdirproc;
                    411:        Filing4_List(connected, GetAttributeSequences, dirhandle,
                    412:                                     typeseq, scopeseq,
                    413:                                     BulkData1_immediateSink, session);
                    414: 
                    415:        if ( files_found ) {
                    416:                if ( is_a_directory ) {
                    417:                        if ( piping ) {
                    418:                                fprintf(stderr, "Must specify file name when pinput is from stdin\n");
                    419:                                return(1);
                    420:                        }
                    421:                        freefilehandle(dirhandle);
                    422:                        getfilehandle(remote, dirhandle);
                    423:                        strcat(cur_pathname, "/");
                    424:                        strcat(cur_pathname, name);
                    425:                } else {
                    426:                        name= cur_name;
                    427:                }
                    428:        } else {
                    429:                name= cur_name;
                    430:        }
                    431: 
                    432:        attrseq.length= 1;
                    433:        attrvals[0].type= Filing4_name;
                    434:        StringToAttr(name, &attrvals[0]);
                    435: 
                    436:        if ( AddExtendedDeserializeAttributes(fin, &attrseq) != -1 ) {
                    437:                fprintf(stderr, "Cannot determine extended attributes\n");
                    438:                fclose(fin);
                    439:                return(1);
                    440:        }
                    441: 
                    442:        if ( verbose ) {
                    443:                fprintf(stdout, "   Restoring %s\n", cur_pathname);
                    444:        }
                    445: 
                    446:        results= Filing4_Deserialize(connected, storeproc, dirhandle,
                    447:                                 attrseq, nullControls,
                    448:                                 BulkData1_immediateSink, session);
                    449: 
                    450:        if ( logfile ) {
                    451:                if ( (lfile= fopen(logfile, "w")) != NULL ) {
                    452:                        scopeseq.length= 1;
                    453:                        scope.designator= Filing4_filter;
                    454:                        scope.Filing4_filter_case.designator= Filing4_matches;
                    455:                        scope.Filing4_filter_case.Filing4_matches_case.attribute.type= Filing4_name;
                    456:                        StringToAttr(name,&scope.Filing4_filter_case.Filing4_matches_case.attribute);
                    457:        
                    458:                        typeseq.length = 2;  typeseq.sequence = tsvals;
                    459:                        typeseq.sequence[0] = Filing4_pathname;
                    460:                        typeseq.sequence[1] = Filing4_isDirectory;
                    461:        
                    462:                        is_a_directory= FALSE;
                    463:        
                    464:                        ProcEachSeq = isdirproc;
                    465:                        Filing4_List(connected, GetAttributeSequences, dirhandle,
                    466:                                             typeseq, scopeseq,
                    467:                                             BulkData1_immediateSink, session);
                    468: 
                    469:                        /*
                    470:                         * for a directory, we list all files...
                    471:                         * for non-directory, just list it...
                    472:                         */
                    473:                        if ( is_a_directory ) {
                    474:                                copyhandle(listhandle, results.file);
                    475:                                lscopeseq.length= 1;
                    476:                                lscope.designator= Filing4_depth;
                    477:                                lscope.Filing4_depth_case= Filing4_allDescendants;
                    478:                        } else {
                    479:                                copyhandle(listhandle, dirhandle);
                    480:                                lscopeseq.length= 1;
                    481:                                lscope.designator= Filing4_filter;
                    482:                                lscope.Filing4_filter_case.designator= Filing4_matches;
                    483:                                lscope.Filing4_filter_case.Filing4_matches_case.attribute.type= Filing4_name;
                    484:                                StringToAttr(name,&lscope.Filing4_filter_case.Filing4_matches_case.attribute);
                    485:        
                    486:                        }
                    487: 
                    488:                        typeseq.length = 4;
                    489:                        typeseq.sequence[0] = Filing4_pathname;
                    490:                        typeseq.sequence[1] = Filing4_type;
                    491:                        typeseq.sequence[2] = Filing4_createdOn;
                    492:                        typeseq.sequence[3] = Filing4_modifiedOn;
                    493: 
                    494:                        date= time(0);
                    495:                        fprintf(lfile, "\n\n\tRestore of %s\n\tPerformed on %s\n\n\n", cur_pathname, ctime(&date));
                    496:                        fprintf(lfile, "\tFiles restored as follows:\n\n");
                    497:                        fprintf(lfile, "    Create Date\t\t Modification Date\t    Type\t\t\t\t\t\tName\n\n");
                    498:        
                    499:                        ProcEachSeq = listproc;
                    500:                        Filing4_List(connected, GetAttributeSequences, listhandle,
                    501:                                             typeseq, lscopeseq,
                    502:                                             BulkData1_immediateSink, session);
                    503:                        fclose(lfile);
                    504:                }
                    505:        }
                    506: 
                    507:        freefilehandle(results.file);
                    508:        freefilehandle(dirhandle);
                    509: }
                    510: 
                    511: listproc(attr)
                    512:        Filing4_AttributeSequence attr;
                    513: {
                    514:        int i;
                    515:        char *thisname, *typetostring();
                    516:        char createstr[30], modstr[30];
                    517:        LongCardinal thistype, createdate, moddate;
                    518:        Filing4_AttributeType t;
                    519: 
                    520:        files_found= TRUE;
                    521:        createdate= moddate= time(0);
                    522: 
                    523:        for (i = 0; i < attr.length; i++) {
                    524:                t = attr.sequence[i].type;
                    525:                if (t == Filing4_pathname) {
                    526:                        thisname = AttrToString(&attr.sequence[i]);
                    527:                } else if (t == Filing4_type) {
                    528:                        thistype = AttrToLongCardinal(&attr.sequence[i]);
                    529:                } else if (t == Filing4_createdOn) {
                    530:                        createdate= AttrToLongCardinal(&attr.sequence[i]);
                    531:                        createdate= createdate - XNS_TIME_DIFFERENCE;
                    532:                        strcpy(createstr, ctime(&createdate));
                    533:                        createstr[24]= '\0';
                    534:                } else if (t == Filing4_modifiedOn) {
                    535:                        moddate= AttrToLongCardinal(&attr.sequence[i]);
                    536:                        moddate= moddate - XNS_TIME_DIFFERENCE;
                    537:                        strcpy(modstr, ctime(&moddate));
                    538:                        modstr[24]= '\0';
                    539:                }
                    540:        }
                    541: 
                    542:        fprintf(lfile, "%s\t%s\t%-16s\t%s\n", createstr+4, modstr+4, typetostring(thistype), thisname);
                    543:        clear_String(&thisname);
                    544: }
                    545: 
                    546: isdirproc(attr)
                    547:        Filing4_AttributeSequence attr;
                    548: {
                    549:        int i;
                    550:        Filing4_AttributeType t;
                    551:        char *thisname;
                    552: 
                    553:        files_found= TRUE;
                    554: 
                    555:        for (i = 0; i < attr.length; i++) {
                    556:                t = attr.sequence[i].type;
                    557:                if (t == Filing4_isDirectory) {
                    558:                        is_a_directory = AttrToBoolean(&attr.sequence[i]);
                    559:                } else if (t == Filing4_name) {
                    560:                        thisname= AttrToString(&attr.sequence[i]);
                    561:                        strcpy(cur_name, thisname);
                    562:                        clear_String(&thisname);
                    563:                }
                    564:        }
                    565: 
                    566: }
                    567: 
                    568: #define MAXPACKS 20
                    569: static
                    570: GetAttributeSequences(conn)
                    571:        CourierConnection *conn;
                    572: {
                    573:        int count, i;
                    574:        Unspecified buffer[MAXWORDS*MAXPACKS], *bp, *bufend;
                    575:        Filing4_StreamOfAttributeSequence attrs;
                    576:        
                    577:        files_found= FALSE;
                    578: 
                    579:        bufend = buffer;
                    580:        bp = buffer+((MAXWORDS-1)*MAXPACKS);    /* end of available space */
                    581:        while ((count = BDTread(conn, (char*)bufend, 
                    582:                                MAXWORDS*sizeof(Unspecified))) > 0) {
                    583:                bufend += count/sizeof(Unspecified);
                    584:                if (bufend > bp) {
                    585:                        fprintf(stderr,"BDT read too big to fit\n");
                    586:                        BDTabort(conn);
                    587:                        /* should clear out stuff here if we knew how much */
                    588:                }
                    589:        }
                    590:        bp = buffer;
                    591:        while (bp < bufend) {
                    592:                bp += internalize_Filing4_StreamOfAttributeSequence(&attrs,bp);
                    593:                if (0 == (int) attrs.designator) {
                    594:                   for (i=0; i < attrs.nextSegment_case.segment.length; i++) {
                    595:                        (*ProcEachSeq)(
                    596:                                attrs.nextSegment_case.segment.sequence[i]);
                    597:                   }
                    598:                   free(attrs.nextSegment_case.segment.sequence);
                    599:                } else {
                    600:                   for (i = 0; i < attrs.lastSegment_case.length; i++) {
                    601:                        (*ProcEachSeq)(
                    602:                                attrs.lastSegment_case.sequence[i]);
                    603:                   }
                    604:                   free(attrs.lastSegment_case.sequence);
                    605:                   return;
                    606:                }
                    607:        }
                    608: }
                    609: 
                    610: storeproc(conn)
                    611:        CourierConnection *conn;
                    612: {
                    613:        int count, ocount, ch;
                    614:        char buffer[SPPMAXDATA];
                    615:        char *bp;
                    616: 
                    617:        errno = ocount = 0;
                    618:        clearerr(fin);
                    619: 
                    620:        while ( ((count= fread(buffer, sizeof(char), SPPMAXDATA, fin)) != 0)
                    621:                 && (ocount= BDTwrite (conn, buffer, count)) > 0) {
                    622:                        ;
                    623:        }
                    624:        if ( count < 0 ) {
                    625:                BDTabort(conn);
                    626:                perror("netout");
                    627:                exit(1);
                    628:        } else if ( ferror(fin) ) {
                    629:                BDTabort(conn);
                    630:                perror("fread");
                    631:                exit(1);
                    632:        } else {
                    633:                BDTclosewrite(conn);
                    634:        }
                    635: }
                    636: 

unix.superglobalmegacorp.com

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