Annotation of 43BSDTahoe/new/xns/examples/filing_common/filingd.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *rcsid = "$Header: filingd.c,v 1.6 87/05/14 11:33:26 ed Exp $";
        !             3: #endif lint
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 1986, 1987 Xerox Corporation.
        !             7:  */
        !             8: 
        !             9: /* $Log:       filingd.c,v $
        !            10:  * Revision 1.6  87/05/14  11:33:26  ed
        !            11:  * Open: don't set cur_dir_handle unless directory is opened.
        !            12:  * 
        !            13:  * Revision 1.5  87/05/05  14:46:31  ed
        !            14:  * Don't close connection in continuance_expiration if BDT in progress.
        !            15:  * 
        !            16:  * Revision 1.4  87/04/16  15:30:29  ed
        !            17:  * Fixed lingering Subset bugs.
        !            18:  * 
        !            19:  * Revision 1.3  87/03/31  14:22:53  ed
        !            20:  * Initialize got_matches in get_filter.
        !            21:  * 
        !            22:  * Revision 1.2  87/03/31  09:05:15  ed
        !            23:  * New procedures: Create, ChangeAttributes(name only), Copy, Move,
        !            24:  *             Replace, Serialize, Deserialize.
        !            25:  * Added conditional disabling of root logins.
        !            26:  * Support for GetAttributes (allAttributeTypes).
        !            27:  * Support for filter of type all.
        !            28:  * 
        !            29:  * Revision 1.1  87/01/14  11:25:59  ed
        !            30:  * Initial revision
        !            31:  * 
        !            32:  */
        !            33: 
        !            34: #include <stdio.h>
        !            35: #include <sys/types.h>
        !            36: #include <netns/ns.h>
        !            37: #include <netns/sp.h>
        !            38: #ifdef FILING4
        !            39: #include "filingV4.h"
        !            40: #include "clearinghouseV2.h"
        !            41: #include "authenticationV2.h"
        !            42: #endif FILING4
        !            43: #ifdef FILING5
        !            44: #include "filingV5.h"
        !            45: #include "clearinghouseV2.h"
        !            46: #include "authenticationV2.h"
        !            47: #endif FILING5
        !            48: #ifdef FILING6
        !            49: #include "filingV6.h"
        !            50: #include "clearinghouseV3.h"
        !            51: #include "authenticationV3.h"
        !            52: #endif FILING6
        !            53: #ifdef FILINGSUBSET1
        !            54: #include "filingsubsetV1.h"
        !            55: #include "clearinghouseV3.h"
        !            56: #include "authenticationV3.h"
        !            57: #endif FILINGSUBSET1
        !            58: #include <xnscourier/filing_server.h>
        !            59: #include <xnscourier/CH.h>
        !            60: #include <xnscourier/filetypes.h>
        !            61: 
        !            62: #define SERVICE_ROOT   "/"                     /* root directory for service */
        !            63: 
        !            64: #ifdef DEBUG
        !            65: FILE *msgs= 0;
        !            66: #endif DEBUG
        !            67: 
        !            68: session_handle SessionHandle= 0;
        !            69: file_handle RootHandle= { FILE_OPEN, SERVICE_ROOT, 0, 0, 0, TRUE, 0, 0, NULL };
        !            70: extern CourierConnection *_serverConnection;   /* current connection */
        !            71: 
        !            72:        /*
        !            73:         * The continuance value is slightly lower than the 90 second
        !            74:         * value in lookahead.c. This should insure that the client will
        !            75:         * send a Continue before this service stops looking for the next
        !            76:         * procedure call.
        !            77:         */
        !            78: Cardinal continuance= 80;                      /* continuance value in seconds */
        !            79: 
        !            80: Boolean BDTabort_expected= FALSE;              /* should BDT attn be sent */
        !            81: 
        !            82: #ifdef FILETOOLCOMPATIBILITY
        !            83: file_handle *cur_dir_handle= &RootHandle;
        !            84: #endif FILETOOLCOMPATIBILITY
        !            85: 
        !            86: 
        !            87: FILING_LogonResults
        !            88: FILING_Logon(ServerConnection, BDTProc, service_name, user_credentials, user_verifier)
        !            89: CourierConnection *ServerConnection;
        !            90: int (*BDTProc)();
        !            91: CLEARINGHOUSE_ObjectName service_name;
        !            92: FILING_Credentials user_credentials;
        !            93: FILING_Verifier user_verifier;
        !            94: {
        !            95:        FILING_LogonResults result;
        !            96:        AUTHENTICATION_ThreePartName chs_name;
        !            97:        session_handle *session_ptr;
        !            98:        Unspecified *bp, buffer[SPPMAXDATA];
        !            99:        char user[40];
        !           100:        char pass[40];
        !           101:        Cardinal credentials_type;
        !           102:        Cardinal len;
        !           103:        char *lowercase();
        !           104: #if FILING4 | FILING5
        !           105:        char *rindex();
        !           106:        char *ptr;
        !           107: #endif FILING4 | FILING5
        !           108: 
        !           109:        BDTabort_expected= FALSE;
        !           110: 
        !           111: #ifdef DEBUG
        !           112:        if (msgs == 0) {
        !           113:                char logfile[50];
        !           114:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !           115:                msgs= fopen(logfile,"w");
        !           116:        }
        !           117:        fprintf(msgs,"Logon\n");
        !           118: #endif DEBUG
        !           119: 
        !           120: #if FILING4 | FILING5
        !           121:        if (user_credentials.type != AUTHENTICATION_simpleCredentials) {
        !           122:                ReturnAuthenticationError(AUTHENTICATION_inappropriateCredentials);
        !           123:                /* NOT REACHED */
        !           124:        } else {
        !           125:                CLEARINGHOUSE_externalize_Item(&user_credentials.value, buffer);
        !           126:                bp= buffer;
        !           127:                bp += internalize_Cardinal(&len, bp);
        !           128:                AUTHENTICATION_internalize_SimpleCredentials(&chs_name, bp);
        !           129: #ifdef DEBUG
        !           130:                fprintf(msgs,"chs_name= %s:%s:%s\n",chs_name.object,chs_name.domain,chs_name.organization);
        !           131: #endif DEBUG
        !           132:        }
        !           133: 
        !           134: #ifdef ROOTNOTALLOWED
        !           135:        /*
        !           136:         * We don't allow root access from the file server
        !           137:         */
        !           138: 
        !           139:        if ( strcmp(lowercase(chs_name.object), "root") == 0 ) {
        !           140:                ReturnAuthenticationError(AUTHENTICATION_credentialsInvalid);
        !           141:                /* NOT REACHED */
        !           142:        }
        !           143: #endif ROOTNOTALLOWED
        !           144: 
        !           145:        /*
        !           146:         * Assumption (for Filing4/Filing5 implementation):
        !           147:         * may receive fully specified Clearinghouse name, so we should try
        !           148:         * to strip off last name (look for last space) assuming there is a
        !           149:         * similary named account on this service. If the user credentials
        !           150:         * pass network authentiction, then we will not check passwords on
        !           151:         * this service (in fact, we can't since the verifier is hashed).
        !           152:         * It is assumed that the name will be found in /etc/passwd and 
        !           153:         * everything will work regardless of password checking.
        !           154:         */
        !           155: 
        !           156:        if ( (ptr= rindex(chs_name.object, ' ')) == 0 ) {
        !           157:                strcpy(user, chs_name.object);
        !           158:        } else {
        !           159:                ptr++;
        !           160:                strcpy(user, ptr);
        !           161:        }
        !           162: 
        !           163:        if ( !Auth_CredCheck(user_credentials, user_verifier) ) {
        !           164:                ReturnAuthenticationError(AUTHENTICATION_credentialsInvalid);
        !           165:                /* NOT REACHED */
        !           166:        }
        !           167: #else FILING4 | FILING5
        !           168:        /*
        !           169:         * assumption (for FILING6 and FILINGSUBSET1):
        !           170:         * no primary credentials are ok
        !           171:         * simple primary credentials will be validated with Authentication
        !           172:         * strong credentials will be ignored
        !           173:         *
        !           174:         * secondary credentials must contain userName and userPassword
        !           175:         * which are assumed to be Unix name and password
        !           176:         */
        !           177: 
        !           178:        if (user_credentials.primary.type == AUTHENTICATION_simpleCredentials) {
        !           179:                if ( !Auth_CredCheck(user_credentials.primary, user_verifier) ) {
        !           180:                        ReturnAuthenticationError(FILING_primaryCredentialsInvalid);
        !           181:                        /* NOT REACHED */
        !           182:                }
        !           183:        }
        !           184: 
        !           185:        if ( get_name_and_pwd(&user_credentials.secondary, user, pass) != -1 ) {
        !           186:                ReturnAuthenticationError(FILING_secondaryCredentialsRequired);
        !           187:                /* NOT REACHED */
        !           188:        }
        !           189: 
        !           190: #ifdef ROOTNOTALLOWED
        !           191:        /*
        !           192:         * We don't allow root access from the file server
        !           193:         */
        !           194: 
        !           195:        if ( strcmp(lowercase(user), "root") == 0 ) {
        !           196:                ReturnAuthenticationError(AUTHENTICATION_credentialsInvalid);
        !           197:                /* NOT REACHED */
        !           198:        }
        !           199: #endif ROOTNOTALLOWED
        !           200: 
        !           201: #endif FILING4 | FILING5
        !           202: 
        !           203: #ifdef DEBUG
        !           204:        fprintf(msgs, "user= %s\n", user);
        !           205: #endif DEBUG
        !           206: 
        !           207:        if ( verifyandposition_user(user, pass) != -1 ) {
        !           208:                /* NOT REACHED */
        !           209:        }
        !           210: 
        !           211:        session_ptr= &SessionHandle;
        !           212:        SessionHandle.state= SESSION_OPEN;
        !           213:        SessionHandle.verifier= user_verifier.sequence[0];
        !           214: 
        !           215: #ifdef DEBUG
        !           216: /*     fprintf(msgs,"handle= %x, ver= %x\n",session_ptr,session_ptr->verifier);
        !           217: */
        !           218: #endif DEBUG
        !           219: 
        !           220:        copyhandle(result.session.token, &session_ptr);
        !           221:        result.session.verifier.length= sizeof(AUTHENTICATION_SimpleVerifier) / sizeof(Cardinal);
        !           222:        result.session.verifier.sequence= Allocate(sizeof(AUTHENTICATION_SimpleVerifier));
        !           223:        result.session.verifier.sequence[0]= user_verifier.sequence[0];
        !           224: 
        !           225:        set_continuance_timer();
        !           226: #ifdef DEBUG
        !           227:        fprintf(msgs, "out of logon\n");
        !           228: #endif DEBUG
        !           229:        return(result);
        !           230: 
        !           231: }
        !           232: 
        !           233: copyhandle(dest, src)
        !           234: Unspecified *dest, *src;
        !           235: {
        !           236:        if ( dest == (Unspecified *)0 ) {
        !           237: #ifdef DEBUG
        !           238:                fprintf(msgs, "Oops, dest is null in copyhandle\n");
        !           239: #else DEBUG
        !           240:                fprintf(stderr, "Oops, dest is null in copyhandle\n");
        !           241: #endif DEBUG
        !           242:                exit(1);
        !           243:        }
        !           244: 
        !           245:        dest[0]= src[0];
        !           246:        dest[1]= src[1];
        !           247: }
        !           248: 
        !           249: 
        !           250: void FILING_Logoff(ServerConnection, BDTProc, session)
        !           251: CourierConnection *ServerConnection;
        !           252: int (*BDTProc)();
        !           253: FILING_Session session;
        !           254: {
        !           255:        session_handle *session_ptr;
        !           256: 
        !           257:        BDTabort_expected= FALSE;
        !           258: 
        !           259:        if ( verify_session(session) != -1 ) {
        !           260:                /* NOT REACHED */
        !           261:        }
        !           262: 
        !           263:        copyhandle(&session_ptr,session.token);
        !           264: 
        !           265: #ifdef SOMEDAY
        !           266:        if ( session_ptr->state == SESSION_IN_USE ) {
        !           267:                ReturnServiceError(FILING_sessionInUse);
        !           268:        } 
        !           269: #endif SOMEDAY
        !           270: 
        !           271:        session_ptr->state= SESSION_CLOSED;
        !           272:        reset_continuance_timer();
        !           273: 
        !           274:        return;
        !           275: }
        !           276: 
        !           277: 
        !           278: FILING_OpenResults FILING_Open(ServerConnection, BDTProc, attributes,  directory, controls, session)
        !           279: CourierConnection *ServerConnection;
        !           280: int ( *BDTProc)();
        !           281: FILING_AttributeSequence attributes;
        !           282: FILING_Handle directory;
        !           283: FILING_ControlSequence controls;
        !           284: FILING_Session session;
        !           285: {
        !           286:        FILING_OpenResults results;
        !           287:        file_handle *handle;
        !           288: 
        !           289: #ifdef FILETOOLCOMPATIBILITY
        !           290:        file_handle *dir_handle;
        !           291: #endif FILETOOLCOMPATIBILITY
        !           292: 
        !           293:        BDTabort_expected= FALSE;
        !           294: 
        !           295: #ifdef DEBUG
        !           296:        if (msgs == 0) {
        !           297:                char logfile[50];
        !           298:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !           299:                msgs= fopen(logfile,"w");
        !           300:        }
        !           301:        fprintf(msgs,"Open\n");
        !           302:        fflush(msgs);
        !           303: #endif DEBUG
        !           304: 
        !           305:        if ( verify_session(session) != -1 ) {
        !           306:                /* NOT REACHED */
        !           307:        }
        !           308: 
        !           309: #ifndef FILETOOLCOMPATIBILITY
        !           310:        if ( is_nullControls(controls) != -1 ) {
        !           311:                ReturnControlTypeError(FILING_disallowed,0);
        !           312:                /* NOT REACHED */
        !           313:        }
        !           314: 
        !           315:        if ( is_nullHandle(directory) != -1 ) {
        !           316:                ReturnHandleError(FILING_invalid);
        !           317:                /* NOT REACHED */
        !           318:        }
        !           319: #endif FILETOOLCOMPATIBILITY
        !           320:  
        !           321:        if ( (handle= (file_handle *)malloc(sizeof(file_handle))) == NULL ) {
        !           322:                ReturnUndefinedError(0);
        !           323:                /* NOT REACHED */       
        !           324:        }
        !           325: 
        !           326: #ifdef DEBUG
        !           327:        fprintf(msgs,"Open-- file handle= %x\n",handle);
        !           328:        fflush(msgs);
        !           329: #endif DEBUG
        !           330: 
        !           331:        if ( (handle->pathname= (char *)malloc(MAX_FILE_NAME_LENGTH)) == NULL ) {
        !           332:                ReturnUndefinedError(0);
        !           333:                /* NOT REACHED */       
        !           334:        }
        !           335: 
        !           336: #ifdef FILETOOLCOMPATIBILITY
        !           337:        copyhandle(&dir_handle,directory);
        !           338: 
        !           339:        if ( dir_handle != 0 ) {
        !           340:                if ( dir_handle->state != FILE_OPEN ) {
        !           341:                        ReturnHandleError(FILING_invalid);
        !           342:                        /* NOT REACHED */
        !           343:                }
        !           344: 
        !           345:                if ( dir_handle->isdirectory != TRUE ) {
        !           346:                        ReturnHandleError(FILING_directoryRequired);
        !           347:                        /* NOT REACHED */
        !           348:                }
        !           349: 
        !           350:                if ( access_file(dir_handle) != -1 ) {
        !           351:                        /* NOT REACHED */
        !           352:                }
        !           353: 
        !           354:                strcpy(handle->pathname,dir_handle->pathname);
        !           355:                if ( strcmp(handle->pathname, "/") != 0 )
        !           356:                        strcat(handle->pathname,"/");
        !           357:        } else {
        !           358:                strcpy(handle->pathname, SERVICE_ROOT);
        !           359:        }
        !           360: #else FILETOOLCOMPATIBILITY
        !           361:        strcpy(handle->pathname, SERVICE_ROOT);
        !           362: #endif FILETOOLCOMPATIBILITY
        !           363: 
        !           364:        if ( verify_open_attributes(attributes, handle) != -1 ) {
        !           365:                /* NOT REACHED */
        !           366:        }
        !           367: 
        !           368:        if ( stat_file(handle) != -1 ) {
        !           369:                /* NOT REACHED */
        !           370:        }
        !           371: 
        !           372:        handle->state= FILE_OPEN;
        !           373:        handle->file_desc= NULL;
        !           374:        handle->createdon= handle->modifiedon= 0;
        !           375: 
        !           376:        copyhandle(results.file,&handle);
        !           377: 
        !           378: #ifdef FILETOOLCOMPATIBILITY
        !           379:        if ( handle->isdirectory == TRUE )
        !           380:                cur_dir_handle= handle;
        !           381: #endif FILETOOLCOMPATIBILITY
        !           382: 
        !           383:        reset_continuance_timer();
        !           384: 
        !           385:        return(results);
        !           386: }
        !           387: 
        !           388: verify_session(session)
        !           389: FILING_Session session;
        !           390: {
        !           391:        session_handle *session_ptr;
        !           392: 
        !           393:        copyhandle(&session_ptr, session.token);
        !           394: 
        !           395:        if ( session_ptr == 0  ||
        !           396:                        (session_ptr->state != SESSION_OPEN) ) {
        !           397:                ReturnSessionError(FILING_tokenInvalid);
        !           398:                /* NOT REACHED */
        !           399:        }
        !           400: 
        !           401:        if ( session_ptr->verifier != *(session.verifier.sequence) ) {
        !           402:                ReturnAuthenticationError(AUTHENTICATION_verifierInvalid);
        !           403:                /* NOT REACHED */
        !           404:        }
        !           405: 
        !           406:        return(-1);
        !           407: 
        !           408: }
        !           409: 
        !           410: is_nullControls(controls)
        !           411: FILING_ControlSequence controls;
        !           412: {
        !           413: 
        !           414:        if ( controls.length != 0 && controls.sequence != 0 ) {
        !           415:                return(0);
        !           416:        }
        !           417: 
        !           418:        return(-1);
        !           419: }
        !           420: 
        !           421: is_nullHandle(handle)
        !           422: FILING_Handle handle;
        !           423: {
        !           424:        if ( handle[0] != 0 && handle[1] != 0 ) {
        !           425:                return(0);
        !           426:        }
        !           427: 
        !           428:        return(-1);
        !           429: }
        !           430: 
        !           431: verify_open_attributes(attr, handle)
        !           432: FILING_AttributeSequence attr;
        !           433: file_handle *handle;
        !           434: {
        !           435:        int i;
        !           436:        FILING_AttributeType t;
        !           437:        int got_parentID, got_pathname, got_type, got_version;
        !           438:        char *pathname;
        !           439:        Unspecified *parentid;
        !           440:        FILING_Version version;
        !           441:        char *AttrToString();
        !           442:        Unspecified *AttrToFileID();
        !           443:        LongCardinal AttrToLongCardinal();
        !           444: 
        !           445: #ifdef FILETOOLCOMPATIBILITY
        !           446:        int got_name, got_fileID;
        !           447:        char *name;
        !           448:        Unspecified *fileid;
        !           449: #endif FILETOOLCOMPATIBILITY
        !           450: 
        !           451: #ifdef DEBUG
        !           452:        fprintf(msgs,"verify_open_attribute %d attributes       ",attr.length);
        !           453: #endif DEBUG
        !           454: 
        !           455:        got_parentID= got_pathname= got_type= got_version= 0;
        !           456: 
        !           457: #ifdef FILETOOLCOMPATIBILITY
        !           458:        got_name= got_fileID= 0;
        !           459: #endif FILETOOLCOMPATIBILITY
        !           460: 
        !           461: #ifdef FILETOOLCOMPATIBILITY
        !           462:        if ( attr.length == 0 ) {
        !           463:                return;
        !           464:        }
        !           465: #endif FILETOOLCOMPATIBILITY
        !           466: 
        !           467:        for ( i= 0 ; i < attr.length ; i++ ) {
        !           468:                t= attr.sequence[i].type;
        !           469: 
        !           470:                if ( t == FILING_parentID ) {
        !           471: #ifdef DEBUG
        !           472:                        fprintf(msgs,"parentID  ");
        !           473: #endif DEBUG
        !           474:                        if ( got_parentID ) {
        !           475:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           476:                                /* NOT REACHED */
        !           477:                        }
        !           478:                        got_parentID++;
        !           479: 
        !           480:                        parentid= AttrToFileID(&attr.sequence[i]);
        !           481:                        if ( !is_nullID(parentid) ) {
        !           482:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !           483:                                /* NOT REACHED */
        !           484:                        }
        !           485:                        continue;
        !           486:                } 
        !           487:                if ( t == FILING_pathname ) {
        !           488: #ifdef DEBUG
        !           489:                        fprintf(msgs,"pathname  ");
        !           490: #endif DEBUG
        !           491:                        if ( got_pathname ) {
        !           492:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           493:                                /* NOT REACHED */
        !           494:                        }
        !           495:                        got_pathname++;
        !           496: 
        !           497:                        pathname= AttrToString(&attr.sequence[i]);
        !           498:                        if ( check_pathname(pathname) != -1 ) {
        !           499:                                /* NOT REACHED */
        !           500:                        }
        !           501:                        continue;
        !           502:                }                       
        !           503:                if ( t == FILING_type ) {
        !           504: #ifdef DEBUG
        !           505:                        fprintf(msgs,"type  ");
        !           506: #endif DEBUG
        !           507:                        if ( got_type ) {
        !           508:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           509:                                /* NOT REACHED */
        !           510:                        }
        !           511:                        got_type++;
        !           512: 
        !           513:                        handle->type= AttrToLongCardinal(&attr.sequence[i]);
        !           514: #ifndef EXTENSIONS
        !           515:                        if ( (handle->type != FILING_tText) &&
        !           516:                                        (handle->type != FILING_tUnspecified) ) {
        !           517:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !           518:                                /* NOT REACHED */
        !           519:                        }
        !           520: #endif EXTENSIONS
        !           521:                        continue;
        !           522:                }
        !           523:                if ( t == FILING_version ) {
        !           524: #ifdef DEBUG
        !           525:                        fprintf(msgs,"version  ");
        !           526: #endif DEBUG
        !           527:                        if ( got_version ) {
        !           528:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           529:                                /* NOT REACHED */
        !           530:                        }
        !           531:                        got_version++;
        !           532: 
        !           533:                        version= AttrToCardinal(&attr.sequence[i]);
        !           534:                        if ( version != FILING_highestVersion && version != FILING_lowestVersion ) {
        !           535:                                        ReturnAttributeValueError(FILING_unimplemented, t);
        !           536:                                        /* NOT REACHED */
        !           537: 
        !           538:                        }
        !           539:                        continue;
        !           540:                }
        !           541: 
        !           542: #ifdef FILETOOLCOMPATIBILITY
        !           543:                if ( t == FILING_name ) {
        !           544: #ifdef DEBUG
        !           545:                        fprintf(msgs, "name  ");
        !           546: #endif DEBUG
        !           547:                        if ( got_name ) {
        !           548:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           549:                                /* NOT REACHED */
        !           550:                        }
        !           551:                        got_name++;
        !           552: 
        !           553:                        name= AttrToString(&attr.sequence[i]);
        !           554:                        continue;
        !           555:                }
        !           556: 
        !           557:                if ( t == FILING_fileID ) {
        !           558: #ifdef DEBUG
        !           559:                        fprintf(msgs, "fileID  ");
        !           560: #endif DEBUG
        !           561:                        if ( got_fileID ) {
        !           562:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           563:                                /* NOT REACHED */
        !           564:                        }
        !           565:                        got_fileID++;
        !           566: 
        !           567:                        fileid= AttrToFileID(&attr.sequence[i]);
        !           568:                        if ( is_nullID(fileid) == -1 ) {
        !           569:                                ReturnAttributeValueError(FILING_disallowed, t);
        !           570:                                /* NOT REACHED */
        !           571:                        }
        !           572:                        strcpy(handle->pathname, cur_dir_handle->pathname);
        !           573:                        if ( get_name_from_fileID(handle, fileid) != -1 ) {
        !           574:                                /* NOT REACHED */
        !           575:                        }
        !           576:                        continue;
        !           577:                }
        !           578: #else FILETOOLCOMPATIBILITY
        !           579:                if ( t == FILING_fileID ) {
        !           580:                        ReturnAttributeTypeError(FILING_unimplemented, t);
        !           581:                        /* NOT REACHED */
        !           582:                }
        !           583: 
        !           584:                if ( t == FILING_name ) {
        !           585:                        ReturnAttributeTypeError(FILING_unimplemented, t);
        !           586:                        /* NOT REACHED */
        !           587:                }
        !           588: #endif FILETOOLCOMPATIBILITY
        !           589: 
        !           590:                if ( ( t < 0 ) || (t > FILING_subtreeSizeLimit) ) {
        !           591:                        ReturnAttributeTypeError(FILING_illegal, t);
        !           592:                        /* NOT REACHED */
        !           593:                }
        !           594: 
        !           595:                ReturnAttributeTypeError(FILING_disallowed, t);
        !           596:        }
        !           597: 
        !           598: #ifdef FILETOOLCOMPATIBILITY
        !           599:        if ( !got_pathname && !got_name) {
        !           600:                if ( !got_fileID ) {
        !           601:                        handle->pathname= SERVICE_ROOT;
        !           602:                }
        !           603:        } else  if ( !got_pathname )  {
        !           604:                strcat(handle->pathname,name);
        !           605:        } else {
        !           606:                if ( *pathname == '/' )
        !           607:                        strcat(handle->pathname, pathname+1);
        !           608:                else
        !           609:                        strcat(handle->pathname,pathname);
        !           610:                Deallocate(&pathname);
        !           611:        }
        !           612: 
        !           613: #else FILETOOLCOMPATIBILITY
        !           614:        if ( !got_pathname ) {
        !           615:                handle->pathname= SERVICE_ROOT;
        !           616:        } else {
        !           617:                if ( *pathname == '/' )
        !           618:                        strcat(handle->pathname, pathname+1);
        !           619:                else
        !           620:                        strcat(handle->pathname, pathname);
        !           621:                Deallocate(&pathname);
        !           622:        }
        !           623: #endif FILETOOLCOMPATIBILITY
        !           624: 
        !           625:        if ( !got_type )
        !           626:                handle->type= -1;
        !           627: 
        !           628:        return(-1);
        !           629: }
        !           630: 
        !           631: is_nullID(fileid)
        !           632: Unspecified *fileid;
        !           633: {
        !           634:        int i;
        !           635: 
        !           636:        for ( i= 0 ; i < 6 ; i++ ) {
        !           637:                if ( fileid[i] != 0 )
        !           638:                        return(0);
        !           639:        }
        !           640: 
        !           641:        return(-1);
        !           642: }
        !           643: 
        !           644: 
        !           645: void FILING_Close(ServerConnection, BDTProc, file, session)
        !           646: CourierConnection *ServerConnection;
        !           647: int ( *BDTProc)();
        !           648: FILING_Handle file;
        !           649: FILING_Session session;
        !           650: {
        !           651:        file_handle *handle;
        !           652: 
        !           653:        BDTabort_expected= FALSE;
        !           654: 
        !           655: #ifdef DEBUG
        !           656:        if (msgs == 0) {
        !           657:                char logfile[50];
        !           658:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !           659:                msgs= fopen(logfile,"w");
        !           660:        }
        !           661:        fprintf(msgs, "Close\n");
        !           662: #endif DEBUG
        !           663: 
        !           664:        if ( verify_session(session) != -1 ) {
        !           665:                /* NOT REACHED */
        !           666:        }
        !           667: 
        !           668:        if ( is_nullHandle(file) == -1 ) {
        !           669:                ReturnHandleError(FILING_nullDisallowed);
        !           670:                /* NOT REACHED */
        !           671:        }
        !           672: 
        !           673:        copyhandle(&handle,file);
        !           674: #ifdef DEBUG
        !           675:        fprintf(msgs, "closing %x\n",handle);
        !           676: #endif DEBUG
        !           677: 
        !           678:        if ( handle->state != FILE_OPEN ) {
        !           679:                ReturnHandleError(FILING_invalid);
        !           680:                /* NOT REACHED */
        !           681:        }
        !           682: 
        !           683:        if ( access_file(handle) != -1 ) {
        !           684:                /* NOT REACHED */
        !           685:        }
        !           686: 
        !           687:        close_file(handle);                             /* do it now */
        !           688: 
        !           689:        if ( handle->createdon != 0 )                   /* set date if needed */
        !           690:                set_create_time(handle);
        !           691: 
        !           692:        handle->state= FILE_CLOSED;
        !           693:        handle->pathname= (char *)0;
        !           694: 
        !           695: #ifdef FILETOOLCOMPATIBILITY
        !           696:        if ( handle == cur_dir_handle )
        !           697:                cur_dir_handle= &RootHandle;
        !           698: #endif FILETOOLCOMPATIBILITY
        !           699: 
        !           700:        free(handle);
        !           701:        reset_continuance_timer();
        !           702: 
        !           703:        return;
        !           704: }
        !           705: 
        !           706: 
        !           707: FILING_CreateResults FILING_Create(ServerConnection, BDTProc, directory, attributes, controls, session)
        !           708: CourierConnection *ServerConnection;
        !           709: int ( *BDTProc)();
        !           710: FILING_Handle directory;
        !           711: FILING_AttributeSequence attributes;
        !           712: FILING_ControlSequence controls;
        !           713: FILING_Session session;
        !           714: {
        !           715: #ifdef EXTENSIONS
        !           716:        FILING_CreateResults results;
        !           717:        file_handle *handle, *dir_handle;
        !           718: 
        !           719: #ifdef DEBUG
        !           720:        if (msgs == 0) {
        !           721:                char logfile[50];
        !           722:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !           723:                msgs= fopen(logfile,"w");
        !           724:        }
        !           725:        fprintf(msgs, "Create  ");
        !           726: #endif DEBUG
        !           727: 
        !           728:        BDTabort_expected= TRUE;
        !           729: 
        !           730:        if ( verify_session(session) != -1 ) {
        !           731:                /* NOT REACHED */
        !           732:        }
        !           733: 
        !           734: #ifndef FILETOOLCOMPATIBILITY
        !           735:        if ( is_nullControls(controls) != -1) {
        !           736:                ReturnControlTypeError(FILING_disallowed, 0);
        !           737:                /* NOT REACHED */
        !           738:        }
        !           739: #endif FILETOOLCOMPATIBILITY
        !           740: 
        !           741:        if ( (handle= (file_handle *)malloc(sizeof(file_handle))) == NULL ) {
        !           742:                ReturnUndefinedError(0);
        !           743:                /* NOT REACHED */
        !           744:        }
        !           745: 
        !           746:        if ( (handle->pathname= (char *)malloc(MAX_FILE_NAME_LENGTH)) == NULL ) {
        !           747:                ReturnUndefinedError(0);
        !           748:                /* NOT REACHED */
        !           749:        }
        !           750: 
        !           751: #ifdef DEBUG
        !           752:        fprintf(msgs, "create handle= %x\n",handle);
        !           753: #endif DEBUG
        !           754: 
        !           755: #ifdef FILETOOLCOMPATIBILITY
        !           756:        copyhandle(&dir_handle,directory);
        !           757: 
        !           758:        if ( dir_handle == 0 ) {
        !           759:                dir_handle= &RootHandle;
        !           760:                strcpy(handle->pathname, SERVICE_ROOT);
        !           761:        } else {
        !           762:                if ( dir_handle->state != FILE_OPEN ) {
        !           763:                        ReturnHandleError(FILING_invalid);
        !           764:                        /* NOT REACHED */
        !           765:                }
        !           766: 
        !           767:                if ( access_file(dir_handle) != -1 ) {
        !           768:                        /* NOT REACHED */
        !           769:                }
        !           770: 
        !           771:                if ( dir_handle->isdirectory != TRUE ) {
        !           772:                        ReturnHandleError(FILING_directoryRequired);
        !           773:                        /* NOT REACHED */
        !           774:                }
        !           775: 
        !           776:                strcpy(handle->pathname,dir_handle->pathname);
        !           777:                if ( strcmp(handle->pathname, "/") != 0 )
        !           778:                        strcat(handle->pathname,"/");
        !           779:        } 
        !           780: #else FILETOOLCOMPATIBILITY
        !           781:        strcpy(handle->pathname, SERVICE_ROOT);
        !           782: #endif FILETOOLCOMPATIBILITY
        !           783: 
        !           784:        if ( verify_create_attributes(attributes, handle) != -1 ) {
        !           785:                /* NOT REACHED */
        !           786:        }
        !           787: 
        !           788: #ifdef DEBUG
        !           789:        fprintf(msgs, "creating '%s'\n", handle->pathname);
        !           790: #endif DEBUG
        !           791: 
        !           792:        if ( handle->isdirectory == TRUE ) {
        !           793:                if ( create_directory(handle) != -1 ) {
        !           794:                        /* NOT REACHED */
        !           795:                }
        !           796:        } else {
        !           797:                if ( create_file(handle) != -1 ) {
        !           798:                        /* NOT REACHED */
        !           799:                }
        !           800:        }
        !           801: 
        !           802:        close_file(handle);
        !           803: 
        !           804:        handle->state= FILE_OPEN;
        !           805:        handle->file_desc= NULL;
        !           806: 
        !           807:        copyhandle(results.file, &handle);
        !           808:        reset_continuance_timer();
        !           809: 
        !           810:        return(results);
        !           811: #else EXTENSIONS
        !           812:        NoSuchProcedureValue("Filing", 4);
        !           813: #endif EXTENSIONS
        !           814: }
        !           815: 
        !           816: #ifdef EXTENSIONS
        !           817: verify_create_attributes(attr, handle)
        !           818: FILING_AttributeSequence attr;
        !           819: file_handle *handle;
        !           820: {
        !           821:        int i;
        !           822:        FILING_AttributeType t;
        !           823:        int got_accesslist, got_childrenuniquelynamed, got_createdon, got_datasize;
        !           824:        int got_defaultaccesslist, got_isdirectory, got_istemporary, got_ordering;
        !           825:        int got_pathname, got_subtreesizelimit, got_type, got_version;
        !           826:        char *pathname;
        !           827:        FILING_Version version;
        !           828:        Boolean childrenuniquelynamed, istemporary;
        !           829:        Cardinal ordering;              
        !           830:        Cardinal subtreesizelimit;
        !           831:        char *AttrToString();
        !           832:        Unspecified *AttrToFileID();
        !           833:        LongCardinal AttrToLongCardinal();
        !           834: 
        !           835: #ifdef FILETOOLCOMPATIBILITY
        !           836:        int got_name;
        !           837:        char *name;
        !           838: #endif FILETOOLCOMPATIBILITY
        !           839: 
        !           840: #ifdef DEBUG
        !           841:        fprintf(msgs,"%d create attributes      ",attr.length);
        !           842: #endif DEBUG
        !           843: 
        !           844:        if ( attr.length <= 0 ) {
        !           845:                ReturnAttributeTypeError(FILING_illegal, 0);
        !           846:                /* NOT REACHED */
        !           847:        }
        !           848: 
        !           849:        got_accesslist= got_childrenuniquelynamed= got_createdon= 0;
        !           850:        got_datasize= got_defaultaccesslist= got_isdirectory= 0;
        !           851:        got_istemporary= got_ordering= got_pathname= 0;
        !           852:        got_subtreesizelimit= got_type= got_version= 0;
        !           853: 
        !           854: #ifdef FILETOOLCOMPATIBILITY
        !           855:        got_name= 0;
        !           856: #endif FILETOOLCOMPATIBILITY
        !           857: 
        !           858: 
        !           859:        for ( i= 0 ; i < attr.length ; i++ ) {
        !           860:                t= attr.sequence[i].type;
        !           861: #ifdef DEBUG
        !           862:                fprintf(msgs, "%d ",t);
        !           863: #endif DEBUG
        !           864:                if ( t == FILING_createdOn ) {
        !           865: #ifdef DEBUG
        !           866:                        fprintf(msgs,"createdOn  ");
        !           867: #endif DEBUG
        !           868:                        if ( got_createdon ) {
        !           869:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           870:                                /* NOT REACHED */
        !           871:                        }
        !           872:                        got_createdon++;
        !           873: 
        !           874:                        handle->createdon= AttrToLongCardinal(&attr.sequence[i]);
        !           875:                        continue;
        !           876:                }
        !           877: 
        !           878:                if ( t == FILING_dataSize ) {
        !           879: #ifdef DEBUG
        !           880:                        fprintf(msgs,"dataSize  ");
        !           881: #endif DEBUG
        !           882:                        if ( got_datasize ) {
        !           883:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           884:                                /* NOT REACHED */
        !           885:                        }
        !           886:                        got_datasize++;
        !           887: 
        !           888:                        handle->datasize= AttrToLongCardinal(&attr.sequence[i]);
        !           889:                        continue;
        !           890:                }
        !           891: 
        !           892:                if ( t == FILING_isDirectory ) {
        !           893: #ifdef DEBUG
        !           894:                        fprintf(msgs,"isDirectory  ");
        !           895: #endif DEBUG
        !           896:                        if ( got_isdirectory ) {
        !           897:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           898:                                /* NOT REACHED */
        !           899:                        }
        !           900: 
        !           901:                        got_isdirectory++;
        !           902: 
        !           903:                        handle->isdirectory= AttrToBoolean(&attr.sequence[i]);
        !           904:                        continue;
        !           905:                }
        !           906: 
        !           907:                if ( t == FILING_pathname ) {
        !           908: #ifdef DEBUG
        !           909:                        fprintf(msgs,"pathname  ");
        !           910: #endif DEBUG
        !           911:                        if ( got_pathname ) {
        !           912:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           913:                                /* NOT REACHED */
        !           914:                        }
        !           915:                        got_pathname++;
        !           916: 
        !           917:                        pathname= AttrToString(&attr.sequence[i]);
        !           918:                        if ( check_pathname(pathname) != -1 ) {
        !           919:                                /* NOT REACHED */
        !           920:                        }
        !           921:                        continue;
        !           922:                }                       
        !           923:                if ( t == FILING_type ) {
        !           924: #ifdef DEBUG
        !           925:                        fprintf(msgs,"type  ");
        !           926: #endif DEBUG
        !           927:                        if ( got_type ) {
        !           928:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           929:                                /* NOT REACHED */
        !           930:                        }
        !           931:                        got_type++;
        !           932: 
        !           933:                        handle->type= AttrToLongCardinal(&attr.sequence[i]);
        !           934:                        continue;
        !           935:                }
        !           936:                if ( t == FILING_version ) {
        !           937: #ifdef DEBUG
        !           938:                        fprintf(msgs,"version  ");
        !           939: #endif DEBUG
        !           940:                        if ( got_version ) {
        !           941:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           942:                                /* NOT REACHED */
        !           943:                        }
        !           944:                        got_version++;
        !           945: 
        !           946:                        version= AttrToCardinal(&attr.sequence[i]);
        !           947:                        if ( version != FILING_highestVersion ) {
        !           948:                                        ReturnAttributeValueError(FILING_unimplemented, t);
        !           949:                                        /* NOT REACHED */
        !           950: 
        !           951:                        }
        !           952:                        continue;
        !           953:                }
        !           954: 
        !           955: #ifdef FILETOOLCOMPATIBILITY
        !           956:                if ( t == FILING_name ) {
        !           957: #ifdef DEBUG
        !           958:                        fprintf(msgs, "name  ");
        !           959: #endif DEBUG
        !           960:                        if ( got_name ) {
        !           961:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           962:                                /* NOT REACHED */
        !           963:                        }
        !           964:                        got_name++;
        !           965: 
        !           966:                        name= AttrToString(&attr.sequence[i]);
        !           967:                        continue;
        !           968:                }
        !           969: #endif FILETOOLCOMPATIBILITY
        !           970: 
        !           971: #ifdef SOMEDAY
        !           972:                if ( t == FILING_accessList ) {
        !           973:                        if ( got_accesslist ) {
        !           974:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           975:                                /* NOT REACHED */
        !           976:                        }
        !           977: 
        !           978:                        got_accesslist++;
        !           979: 
        !           980:                        if ( FALSE ) {
        !           981:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !           982:                                /* NOT REACHED */
        !           983:                        }
        !           984: 
        !           985:                        continue;
        !           986:                }
        !           987: #endif SOMEDAY
        !           988: 
        !           989:                if ( t == FILING_childrenUniquelyNamed ) {
        !           990:                        if ( got_childrenuniquelynamed ) {
        !           991:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !           992:                                /* NOT REACHED */
        !           993:                        }
        !           994: 
        !           995:                        got_childrenuniquelynamed++;
        !           996: 
        !           997:                        childrenuniquelynamed= AttrToBoolean(&attr.sequence[i]);
        !           998:                        if ( childrenuniquelynamed != TRUE ) {
        !           999:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1000:                                /* NOT REACHED */
        !          1001:                        }
        !          1002: 
        !          1003:                        continue;
        !          1004:                }
        !          1005: 
        !          1006: 
        !          1007: #ifdef SOMEDAY
        !          1008:                if ( t == FILING_defaultAccessList ) {
        !          1009:                        if ( got_defaultaccesslist ) {
        !          1010:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1011:                                /* NOT REACHED */
        !          1012:                        }
        !          1013: 
        !          1014:                        got_defaultaccesslist++;
        !          1015: 
        !          1016:                        if ( FALSE ) {
        !          1017:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1018:                                /* NOT REACHED */
        !          1019:                        }
        !          1020: 
        !          1021:                        continue;
        !          1022:                }
        !          1023: #endif SOMEDAY
        !          1024: 
        !          1025:                if ( t == FILING_isTemporary ) {
        !          1026:                        if ( got_istemporary ) {
        !          1027:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1028:                                /* NOT REACHED */
        !          1029:                        }
        !          1030: 
        !          1031:                        got_istemporary++;
        !          1032: 
        !          1033:                        istemporary= AttrToBoolean(&attr.sequence[i]);
        !          1034:                        if ( istemporary != FALSE ) {
        !          1035:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1036:                                /* NOT REACHED */
        !          1037:                        }
        !          1038: 
        !          1039:                        continue;
        !          1040:                }
        !          1041: 
        !          1042:                if ( t == FILING_ordering ) {
        !          1043:                        if ( got_ordering ) {
        !          1044:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1045:                                /* NOT REACHED */
        !          1046:                        }
        !          1047: 
        !          1048:                        got_ordering++;
        !          1049: 
        !          1050:                        if ( FALSE ) {
        !          1051:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1052:                                /* NOT REACHED */
        !          1053:                        }
        !          1054: 
        !          1055:                        continue;
        !          1056:                }
        !          1057: 
        !          1058:                if ( t == FILING_subtreeSizeLimit ) {
        !          1059:                        if ( got_subtreesizelimit ) {
        !          1060:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1061:                                /* NOT REACHED */
        !          1062:                        }
        !          1063: 
        !          1064:                        got_subtreesizelimit++;
        !          1065: 
        !          1066:                        subtreesizelimit= AttrToCardinal(&attr.sequence[i]);
        !          1067:                        if ( subtreesizelimit != FILING_nullSubtreeSizeLimit ) {
        !          1068:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1069:                                /* NOT REACHED */
        !          1070:                        }
        !          1071: 
        !          1072:                        continue;
        !          1073:                }
        !          1074: 
        !          1075:                if ( (t == FILING_fileID) || (t == FILING_modifiedBy) ||
        !          1076:                                (t == FILING_modifiedOn) || 
        !          1077:                                (t == FILING_numberOfChildren) || (t == FILING_parentID) ||
        !          1078:                                (t == FILING_readBy) || (t == FILING_readOn) ||
        !          1079:                                (t == FILING_storedSize) || (t == FILING_subtreeSize) ) {
        !          1080:                        ReturnAttributeTypeError(FILING_disallowed, t);
        !          1081:                }
        !          1082: 
        !          1083:                if ( t < 0 ) {
        !          1084:                        ReturnAttributeTypeError(FILING_illegal, t);
        !          1085:                        /* NOT REACHED */
        !          1086:                }
        !          1087: 
        !          1088:                if ( handle->type != TYPE_VP ) {
        !          1089:                        if ( (t == FILING_checksum) || (t == FILING_createdBy) ||
        !          1090:                                                (t == FILING_position) )
        !          1091:                                ReturnAttributeTypeError(FILING_unimplemented, t);
        !          1092:                        else
        !          1093:                                ReturnAttributeTypeError(FILING_disallowed, t);
        !          1094:                }
        !          1095:        }
        !          1096: 
        !          1097: #ifdef DEBUG
        !          1098:        fprintf(msgs, "\n");
        !          1099: #endif DEBUG
        !          1100: 
        !          1101: #ifdef FILETOOLCOMPATIBILITY
        !          1102:        if ( !got_pathname && !got_name) {
        !          1103:                handle->pathname= SERVICE_ROOT;
        !          1104:        } else  if ( !got_pathname )  {
        !          1105:                strcat(handle->pathname,name);
        !          1106:        } else {
        !          1107:                if ( *pathname == '/' )
        !          1108:                        strcat(handle->pathname, pathname+1);
        !          1109:                else
        !          1110:                        strcat(handle->pathname,pathname);
        !          1111:                Deallocate(&pathname);
        !          1112:        }
        !          1113: 
        !          1114: #else FILETOOLCOMPATIBILITY
        !          1115:        if ( !got_pathname ) {
        !          1116:                ReturnAttributeTypeError(FILING_missing, t);
        !          1117:                /* NOT REACHED */
        !          1118:        } else {
        !          1119:                if ( *pathname == '/' )
        !          1120:                        strcat(handle->pathname, pathname+1);
        !          1121:                else
        !          1122:                        strcat(handle->pathname, pathname);
        !          1123:                Deallocate(&pathname);
        !          1124:        }
        !          1125: #endif FILETOOLCOMPATIBILITY
        !          1126: 
        !          1127:        if ( !got_type )
        !          1128:                handle->type= FILING_tUnspecified;
        !          1129: 
        !          1130:        if ( !got_createdon )
        !          1131:                handle->createdon= 0;
        !          1132: 
        !          1133:        if ( !got_isdirectory ) {
        !          1134:                if ( handle->type == FILING_tDirectory )
        !          1135:                        handle->isdirectory= TRUE;
        !          1136:                else
        !          1137:                        handle->isdirectory= FALSE;
        !          1138:        } else {
        !          1139:                if ( ((handle->isdirectory == TRUE) && (handle->type != FILING_tDirectory)) ||
        !          1140:                                ((handle->isdirectory == FALSE) && (handle->type == FILING_tDirectory)) ) {
        !          1141:                        ReturnAttributeTypeError(FILING_unreasonable, FILING_isDirectory);
        !          1142:                        /* NOT REACHED */
        !          1143:                }
        !          1144:        }
        !          1145: 
        !          1146:        return(-1);
        !          1147: }
        !          1148: #endif EXTENSIONS
        !          1149: 
        !          1150: 
        !          1151: void FILING_Delete(ServerConnection, BDTProc, file, session)
        !          1152: CourierConnection *ServerConnection;
        !          1153: int ( *BDTProc)();
        !          1154: FILING_Handle file;
        !          1155: FILING_Session session;
        !          1156: {
        !          1157:        file_handle *handle;
        !          1158: 
        !          1159:        BDTabort_expected= FALSE;
        !          1160: #ifdef DEBUG
        !          1161:        if (msgs == 0) {
        !          1162:                char logfile[50];
        !          1163:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          1164:                msgs= fopen(logfile,"w");
        !          1165:        }
        !          1166:        fprintf(msgs, "Delete\n");
        !          1167: #endif DEBUG
        !          1168: 
        !          1169:        if ( verify_session(session) != -1 ) {
        !          1170:                /* NOT REACHED */
        !          1171:        }
        !          1172: 
        !          1173:        if ( is_nullHandle(file) == -1 ) {
        !          1174:                ReturnHandleError(FILING_nullDisallowed);
        !          1175:                /* NOT REACHED */
        !          1176:        }
        !          1177: 
        !          1178:        copyhandle(&handle,file);
        !          1179: 
        !          1180:        if ( handle->state != FILE_OPEN ) {
        !          1181:                ReturnHandleError(FILING_invalid);
        !          1182:                /* NOT REACHED */
        !          1183:        }
        !          1184: 
        !          1185:        if ( access_file(handle) != -1 ) {
        !          1186:                /* NOT REACHED */
        !          1187:        }
        !          1188: 
        !          1189:        close_file(handle);                             /* do it now */
        !          1190: 
        !          1191:        if ( delete_file(handle) != -1 ) {
        !          1192:                /* NOT REACHED */
        !          1193:        }
        !          1194: 
        !          1195:        handle->state= FILE_CLOSED;
        !          1196:        handle->pathname= (char *)0;
        !          1197: 
        !          1198:        free(handle);
        !          1199:        reset_continuance_timer();
        !          1200: 
        !          1201:        return;
        !          1202: }
        !          1203: 
        !          1204: 
        !          1205: FILING_GetControlsResults FILING_GetControls(ServerConnection, BDTProc, file, types, session)
        !          1206: CourierConnection *ServerConnection;
        !          1207: int ( *BDTProc)();
        !          1208: FILING_Handle file;
        !          1209: FILING_ControlTypeSequence types;
        !          1210: FILING_Session session;
        !          1211: {
        !          1212:        NoSuchProcedureValue("Filing", 6);
        !          1213: }
        !          1214: 
        !          1215: 
        !          1216: void FILING_ChangeControls(ServerConnection, BDTProc, file, controls, session)
        !          1217: CourierConnection *ServerConnection;
        !          1218: int ( *BDTProc)();
        !          1219: FILING_Handle file;
        !          1220: FILING_ControlSequence controls;
        !          1221: FILING_Session session;
        !          1222: {
        !          1223:        NoSuchProcedureValue("Filing", 7);
        !          1224: }
        !          1225: 
        !          1226: 
        !          1227: FILING_GetAttributesResults FILING_GetAttributes(ServerConnection, BDTProc, file, types, session)
        !          1228: CourierConnection *ServerConnection;
        !          1229: int ( *BDTProc)();
        !          1230: FILING_Handle file;
        !          1231: FILING_AttributeTypeSequence types;
        !          1232: FILING_Session session;
        !          1233: {
        !          1234: #ifdef EXTENSIONS
        !          1235:        file_handle *handle;
        !          1236:        FILING_GetAttributesResults results;
        !          1237: 
        !          1238: #ifdef DEBUG
        !          1239:        if (msgs == 0) {
        !          1240:                char logfile[50];
        !          1241:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          1242:                msgs= fopen(logfile,"w");
        !          1243:        }
        !          1244:        fprintf(msgs, "Getattributes\n");
        !          1245: #endif DEBUG
        !          1246: 
        !          1247:        BDTabort_expected= FALSE;
        !          1248: 
        !          1249:        if ( verify_session(session) != -1 ) {
        !          1250:                /* NOT REACHED */
        !          1251:        }
        !          1252: 
        !          1253:        if ( is_nullHandle(file) == -1 ) {
        !          1254:                ReturnHandleError(FILING_nullDisallowed);
        !          1255:                /* NOT REACHED */
        !          1256:        }
        !          1257: 
        !          1258:        copyhandle(&handle,file);
        !          1259: 
        !          1260:        if ( handle->state != FILE_OPEN ) {
        !          1261:                ReturnHandleError(FILING_invalid);
        !          1262:                /* NOT REACHED */
        !          1263:        }
        !          1264: 
        !          1265:        if ( access_file(handle) != -1 ) {
        !          1266:                /* NOT REACHED */
        !          1267:        }
        !          1268: 
        !          1269:        close_file(handle);                             /* do it now */
        !          1270: 
        !          1271:        if ( get_types(types,&results.attributes) != -1 ) {
        !          1272:                /* NOT REACHED */
        !          1273:        }
        !          1274: 
        !          1275:        make_attribute_sequence(handle->pathname,&results.attributes);
        !          1276: 
        !          1277:        return(results);
        !          1278: #else EXTENSIONS
        !          1279:        NoSuchProcedureValue("Filing", 8);
        !          1280: #endif EXTENSIONS
        !          1281: }
        !          1282: 
        !          1283: get_types(types, attrseq)
        !          1284: FILING_AttributeTypeSequence types;
        !          1285: FILING_AttributeSequence *attrseq;
        !          1286: {
        !          1287:        int i;
        !          1288:        LongCardinal t;
        !          1289: 
        !          1290:        if ( types.length <= 0 ) {
        !          1291:                ReturnAttributeTypeError(FILING_illegal, 0);
        !          1292:                /* NOT REACHED */
        !          1293:        }
        !          1294: 
        !          1295: #ifdef EXTENSIONS
        !          1296:        if ( *(types.sequence) == 037777777777 ) {
        !          1297: #ifdef DEBUG
        !          1298:                fprintf(msgs, "get_types: asking for all\n");
        !          1299: #endif DEBUG
        !          1300:                attrseq->length= -1;
        !          1301:                attrseq->sequence= (FILING_Attribute *)
        !          1302:                                Allocate((SUPPORTEDATTRIBUTES + OPTIONALATTRIBUTES) * sizeof(FILING_Attribute)/sizeof(Unspecified));
        !          1303:        } else {
        !          1304: #endif EXTENSIONS
        !          1305:                attrseq->length= types.length;
        !          1306:                attrseq->sequence= (FILING_Attribute *)
        !          1307:                                Allocate(types.length * sizeof(FILING_Attribute)/sizeof(Unspecified));
        !          1308: 
        !          1309: #ifdef DEBUG
        !          1310:                fprintf(msgs, "get_types: asking for ");
        !          1311: #endif DEBUG
        !          1312: 
        !          1313:                for ( i = 0; i < types.length ; i ++ ) {
        !          1314:                        t= types.sequence[i];
        !          1315: 
        !          1316: #ifdef DEBUG
        !          1317:                        fprintf(msgs, "%d  ",t);
        !          1318: #endif DEBUG
        !          1319: 
        !          1320:                        
        !          1321:                        if ( (t < 0) || ( t > FILING_subtreeSizeLimit) ) {
        !          1322: #ifdef FILETOOLCOMPATIBILITY
        !          1323:                                if ( t != 4938 ) {
        !          1324:                                        ReturnAttributeTypeError(FILING_illegal, t);
        !          1325:                                        /* NOT REACHED */
        !          1326:                                }
        !          1327: #else FILETOOLCOMPATIBILITY
        !          1328:                                ReturnAttributeTypeError(FILING_illegal, t);
        !          1329:                                /* NOT REACHED */
        !          1330: #endif FILETOOLCOMPATIBILITY
        !          1331:                        }
        !          1332: 
        !          1333:                        if ( (t != FILING_createdOn) && (t != FILING_modifiedOn) &&
        !          1334:                                        (t != FILING_isDirectory) && (t != FILING_isTemporary) &&
        !          1335:                                        (t != FILING_name) && (t != FILING_pathname) &&
        !          1336: #ifndef FILETOOLCOMPATIBILITY
        !          1337:                                        (t != FILING_dataSize) && (t != FILING_type) &&
        !          1338:                                        (t != FILING_version) ) {
        !          1339: #else FILETOOLCOMPATIBILITY
        !          1340:                                        (t != FILING_dataSize) && (t != FILING_type) &&
        !          1341:                                        (t != FILING_createdBy) && (t != FILING_readOn) &&
        !          1342:                                        (t != FILING_version) && (t != FILING_fileID)  &&
        !          1343:                                        (t != 4938) ) {
        !          1344: #endif FILETOOLCOMPATIBILITY
        !          1345:                                ReturnAttributeTypeError(FILING_disallowed, t);
        !          1346:                                /* NOT REACHED */
        !          1347:                        }
        !          1348:                        attrseq->sequence[i].type= t;
        !          1349:                }
        !          1350: #ifdef EXTENSIONS
        !          1351:        }
        !          1352: #endif EXTENSIONS
        !          1353: #ifdef DEBUG
        !          1354:        fprintf(msgs, "\n");
        !          1355: #endif DEBUG
        !          1356: }
        !          1357: 
        !          1358: #ifdef EXTENSIONS
        !          1359: make_supported_attributes(attrseq)
        !          1360: FILING_AttributeSequence *attrseq;
        !          1361: 
        !          1362: {
        !          1363:        attrseq->length= SUPPORTEDATTRIBUTES;
        !          1364:        attrseq->sequence[0].type= FILING_createdOn;
        !          1365:        attrseq->sequence[1].type= FILING_isDirectory;
        !          1366:        attrseq->sequence[2].type= FILING_modifiedOn;
        !          1367:        attrseq->sequence[3].type= FILING_name;
        !          1368:        attrseq->sequence[4].type= FILING_dataSize;
        !          1369:        attrseq->sequence[5].type= FILING_type;
        !          1370:        attrseq->sequence[6].type= FILING_version;
        !          1371:        attrseq->sequence[7].type= FILING_pathname;
        !          1372: }
        !          1373: 
        !          1374: make_required_attributes(attrseq)
        !          1375: FILING_AttributeSequence *attrseq;
        !          1376: 
        !          1377: {
        !          1378:        attrseq->length= REQUIREDATTRIBUTES;
        !          1379:        attrseq->sequence[0].type= FILING_createdOn;
        !          1380:        attrseq->sequence[1].type= FILING_modifiedOn;
        !          1381:        attrseq->sequence[2].type= FILING_name;
        !          1382:        attrseq->sequence[3].type= FILING_dataSize;
        !          1383:        attrseq->sequence[4].type= FILING_version;
        !          1384:        attrseq->sequence[5].type= FILING_pathname;
        !          1385: }
        !          1386: #endif EXTENSIONS
        !          1387: 
        !          1388: void FILING_ChangeAttributes(ServerConnection, BDTProc, file, attributes, session)
        !          1389: CourierConnection *ServerConnection;
        !          1390: int ( *BDTProc)();
        !          1391: FILING_Handle file;
        !          1392: FILING_AttributeSequence attributes;
        !          1393: FILING_Session session;
        !          1394: {
        !          1395: #ifdef EXTENSIONS
        !          1396:        file_handle *handle;
        !          1397:        char oldname[MAX_FILE_NAME_LENGTH];
        !          1398: 
        !          1399: #ifdef DEBUG
        !          1400:        if (msgs == 0) {
        !          1401:                char logfile[50];
        !          1402:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          1403:                msgs= fopen(logfile,"w");
        !          1404:        }
        !          1405:        fprintf(msgs, "ChangeAttributes\n");
        !          1406: #endif DEBUG
        !          1407: 
        !          1408:        if ( verify_session(session) != -1 ) {
        !          1409:                /* NOT REACHED */
        !          1410:        }
        !          1411: 
        !          1412:        if ( is_nullHandle(file) == -1 ) {
        !          1413:                ReturnHandleError(FILING_nullDisallowed);
        !          1414:                /* NOT REACHED */
        !          1415:        }
        !          1416: 
        !          1417:        copyhandle(&handle,file);
        !          1418: 
        !          1419:        if ( handle->state != FILE_OPEN ) {
        !          1420:                ReturnHandleError(FILING_invalid);
        !          1421:                /* NOT REACHED */
        !          1422:        }
        !          1423: 
        !          1424:        if ( access_file(handle) != -1 ) {
        !          1425:                /* NOT REACHED */
        !          1426:        }
        !          1427: 
        !          1428:        close_file(handle);                             /* do it now */
        !          1429: 
        !          1430:        strcpy(oldname, handle->pathname);
        !          1431: 
        !          1432:        if ( verify_change_attributes(attributes, handle) != -1 ) {
        !          1433:                /* NOT REACHED */
        !          1434:        }
        !          1435: 
        !          1436:        if ( strcmp(oldname, handle->pathname) != 0 ) {
        !          1437:                rename_file(oldname, handle);
        !          1438:        }
        !          1439: 
        !          1440:        set_create_time(handle);
        !          1441: 
        !          1442:        return;
        !          1443: #else EXTENSIONS
        !          1444:        NoSuchProcedureValue("Filing", 9);
        !          1445: #endif EXTENSIONS
        !          1446: }
        !          1447: #ifdef EXTENSIONS
        !          1448: verify_change_attributes(attr, handle)
        !          1449: FILING_AttributeSequence attr;
        !          1450: file_handle *handle;
        !          1451: {
        !          1452:        int i;
        !          1453:        FILING_AttributeType t;
        !          1454:        int got_accesslist, got_childrenuniquelynamed, got_createdon, got_datasize;
        !          1455:        int got_defaultaccesslist, got_ordering;
        !          1456:        int got_subtreesizelimit, got_type, got_version;
        !          1457:        FILING_Version version;
        !          1458:        Boolean childrenuniquelynamed;
        !          1459:        Cardinal ordering;              
        !          1460:        Cardinal subtreesizelimit;
        !          1461:        char *AttrToString();
        !          1462:        LongCardinal AttrToLongCardinal();
        !          1463: 
        !          1464:        int got_name;
        !          1465:        char *name;
        !          1466: 
        !          1467: #ifdef DEBUG
        !          1468:        fprintf(msgs,"%d change attributes      ",attr.length);
        !          1469: #endif DEBUG
        !          1470: 
        !          1471:        if ( attr.length < 0 ) {
        !          1472:                ReturnAttributeTypeError(FILING_illegal, 0);
        !          1473:                /* NOT REACHED */
        !          1474:        }
        !          1475: 
        !          1476:        got_accesslist= got_childrenuniquelynamed= got_createdon= 0;
        !          1477:        got_datasize= got_defaultaccesslist= 0;
        !          1478:        got_ordering= got_subtreesizelimit= got_type= got_version= 0;
        !          1479:        got_name= 0;
        !          1480: 
        !          1481:        for ( i= 0 ; i < attr.length ; i++ ) {
        !          1482:                t= attr.sequence[i].type;
        !          1483: #ifdef DEBUG
        !          1484:                fprintf(msgs, "%d ",t);
        !          1485: #endif DEBUG
        !          1486:                if ( t == FILING_createdOn ) {
        !          1487: #ifdef DEBUG
        !          1488:                        fprintf(msgs,"createdOn  ");
        !          1489: #endif DEBUG
        !          1490:                        if ( got_createdon ) {
        !          1491:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1492:                                /* NOT REACHED */
        !          1493:                        }
        !          1494:                        got_createdon++;
        !          1495: 
        !          1496:                        handle->createdon= AttrToLongCardinal(&attr.sequence[i]);
        !          1497:                        continue;
        !          1498:                }
        !          1499: 
        !          1500:                if ( t == FILING_dataSize ) {
        !          1501: #ifdef DEBUG
        !          1502:                        fprintf(msgs,"dataSize  ");
        !          1503: #endif DEBUG
        !          1504:                        if ( got_datasize ) {
        !          1505:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1506:                                /* NOT REACHED */
        !          1507:                        }
        !          1508:                        got_datasize++;
        !          1509: 
        !          1510:                        handle->datasize= AttrToLongCardinal(&attr.sequence[i]);
        !          1511:                        continue;
        !          1512:                }
        !          1513: 
        !          1514:                if ( t == FILING_type ) {
        !          1515: #ifdef DEBUG
        !          1516:                        fprintf(msgs,"type  ");
        !          1517: #endif DEBUG
        !          1518:                        if ( got_type ) {
        !          1519:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1520:                                /* NOT REACHED */
        !          1521:                        }
        !          1522:                        got_type++;
        !          1523: 
        !          1524:                        handle->type= AttrToLongCardinal(&attr.sequence[i]);
        !          1525:                        continue;
        !          1526:                }
        !          1527:                if ( t == FILING_version ) {
        !          1528: #ifdef DEBUG
        !          1529:                        fprintf(msgs,"version  ");
        !          1530: #endif DEBUG
        !          1531:                        if ( got_version ) {
        !          1532:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1533:                                /* NOT REACHED */
        !          1534:                        }
        !          1535:                        got_version++;
        !          1536: 
        !          1537:                        version= AttrToCardinal(&attr.sequence[i]);
        !          1538:                        if ( version != FILING_highestVersion ) {
        !          1539:                                        ReturnAttributeValueError(FILING_unimplemented, t);
        !          1540:                                        /* NOT REACHED */
        !          1541: 
        !          1542:                        }
        !          1543:                        continue;
        !          1544:                }
        !          1545: 
        !          1546:                if ( t == FILING_name ) {
        !          1547: #ifdef DEBUG
        !          1548:                        fprintf(msgs, "name  ");
        !          1549: #endif DEBUG
        !          1550:                        if ( got_name ) {
        !          1551:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1552:                                /* NOT REACHED */
        !          1553:                        }
        !          1554:                        got_name++;
        !          1555: 
        !          1556:                        name= AttrToString(&attr.sequence[i]);
        !          1557:                        continue;
        !          1558:                }
        !          1559: 
        !          1560: #ifdef SOMEDAY
        !          1561:                if ( t == FILING_accessList ) {
        !          1562:                        if ( got_accesslist ) {
        !          1563:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1564:                                /* NOT REACHED */
        !          1565:                        }
        !          1566: 
        !          1567:                        got_accesslist++;
        !          1568: 
        !          1569:                        if ( FALSE ) {
        !          1570:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1571:                                /* NOT REACHED */
        !          1572:                        }
        !          1573: 
        !          1574:                        continue;
        !          1575:                }
        !          1576: #endif SOMEDAY
        !          1577: 
        !          1578:                if ( t == FILING_childrenUniquelyNamed ) {
        !          1579:                        if ( got_childrenuniquelynamed ) {
        !          1580:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1581:                                /* NOT REACHED */
        !          1582:                        }
        !          1583: 
        !          1584:                        got_childrenuniquelynamed++;
        !          1585: 
        !          1586:                        childrenuniquelynamed= AttrToBoolean(&attr.sequence[i]);
        !          1587:                        if ( childrenuniquelynamed != TRUE ) {
        !          1588:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1589:                                /* NOT REACHED */
        !          1590:                        }
        !          1591: 
        !          1592:                        continue;
        !          1593:                }
        !          1594: 
        !          1595: 
        !          1596: #ifdef SOMEDAY
        !          1597:                if ( t == FILING_defaultAccessList ) {
        !          1598:                        if ( got_defaultaccesslist ) {
        !          1599:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1600:                                /* NOT REACHED */
        !          1601:                        }
        !          1602: 
        !          1603:                        got_defaultaccesslist++;
        !          1604: 
        !          1605:                        if ( FALSE ) {
        !          1606:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1607:                                /* NOT REACHED */
        !          1608:                        }
        !          1609: 
        !          1610:                        continue;
        !          1611:                }
        !          1612: #endif SOMEDAY
        !          1613: 
        !          1614:                if ( t == FILING_ordering ) {
        !          1615:                        if ( got_ordering ) {
        !          1616:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1617:                                /* NOT REACHED */
        !          1618:                        }
        !          1619: 
        !          1620:                        got_ordering++;
        !          1621: 
        !          1622:                        if ( FALSE ) {
        !          1623:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1624:                                /* NOT REACHED */
        !          1625:                        }
        !          1626: 
        !          1627:                        continue;
        !          1628:                }
        !          1629: 
        !          1630:                if ( t == FILING_subtreeSizeLimit ) {
        !          1631:                        if ( got_subtreesizelimit ) {
        !          1632:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1633:                                /* NOT REACHED */
        !          1634:                        }
        !          1635: 
        !          1636:                        got_subtreesizelimit++;
        !          1637: 
        !          1638:                        subtreesizelimit= AttrToCardinal(&attr.sequence[i]);
        !          1639:                        if ( subtreesizelimit != FILING_nullSubtreeSizeLimit ) {
        !          1640:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1641:                                /* NOT REACHED */
        !          1642:                        }
        !          1643: 
        !          1644:                        continue;
        !          1645:                }
        !          1646: 
        !          1647:                if ( (t == FILING_fileID) || (t == FILING_isDirectory) ||
        !          1648:                                (t == FILING_isTemporary) || (t == FILING_modifiedBy) ||
        !          1649:                                (t == FILING_modifiedOn) || (t == FILING_numberOfChildren) ||
        !          1650:                                (t == FILING_parentID) || (t == FILING_pathname) ||
        !          1651:                                (t == FILING_readBy) || (t == FILING_readOn) ||
        !          1652:                                (t == FILING_storedSize) || (t == FILING_subtreeSize) ) {
        !          1653:                        ReturnAttributeTypeError(FILING_disallowed, t);
        !          1654:                }
        !          1655: 
        !          1656:                if ( t < 0 ) {
        !          1657:                        ReturnAttributeTypeError(FILING_illegal, t);
        !          1658:                        /* NOT REACHED */
        !          1659:                }
        !          1660: 
        !          1661:                if ( (t == FILING_checksum) || (t == FILING_createdBy) ||
        !          1662:                                        (t == FILING_position) )
        !          1663:                        ReturnAttributeTypeError(FILING_unimplemented, t);
        !          1664:                else
        !          1665:                        ReturnAttributeTypeError(FILING_disallowed, t);
        !          1666: 
        !          1667:        }
        !          1668: 
        !          1669: #ifdef DEBUG
        !          1670:        fprintf(msgs, "\n");
        !          1671: #endif DEBUG
        !          1672: 
        !          1673:        if ( got_name ) {
        !          1674:                char *ptr, *rindex();
        !          1675:                if ( (ptr= rindex(handle->pathname, '/')) == 0 ) {
        !          1676:                        ptr= handle->pathname;
        !          1677:                } else {
        !          1678:                        ptr++;
        !          1679:                        *ptr= '\0';
        !          1680:                }
        !          1681:                strcat(handle->pathname, name);
        !          1682:        }
        !          1683: 
        !          1684:        return(-1);
        !          1685: }
        !          1686: #endif EXTENSIONS
        !          1687: 
        !          1688: 
        !          1689: FILING_CopyResults FILING_Copy(ServerConnection, BDTProc, file, destdir, attributes, controls,  session)
        !          1690: CourierConnection *ServerConnection;
        !          1691: int ( *BDTProc)();
        !          1692: FILING_Handle file;
        !          1693: FILING_Handle destdir;
        !          1694: FILING_AttributeSequence attributes;
        !          1695: FILING_ControlSequence controls;
        !          1696: FILING_Session session;
        !          1697: {
        !          1698: #ifdef EXTENSIONS
        !          1699:        FILING_CopyResults results;
        !          1700:        file_handle *handle;
        !          1701:        file_handle *dir_handle;
        !          1702:        file_handle *new_handle;
        !          1703: 
        !          1704: #ifdef DEBUG
        !          1705:        if (msgs == 0) {
        !          1706:                char logfile[50];
        !          1707:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          1708:                msgs= fopen(logfile,"w");
        !          1709:        }
        !          1710:        fprintf(msgs, "Copy\n");
        !          1711: #endif DEBUG
        !          1712: 
        !          1713:        BDTabort_expected= FALSE;
        !          1714: 
        !          1715:        if ( verify_session(session) != -1 ) {
        !          1716:                /* NOT REACHED */
        !          1717:        }
        !          1718: 
        !          1719:        copyhandle(&handle, file);
        !          1720: 
        !          1721:        if ( handle->state != FILE_OPEN ) {
        !          1722:                ReturnHandleError(FILING_invalid);
        !          1723:                /* NOT REACHED */
        !          1724:        }
        !          1725: 
        !          1726:        if ( access_file(handle) != -1 ) {
        !          1727:                /* NOT REACHED */
        !          1728:        }
        !          1729: 
        !          1730:        if ( (new_handle= (file_handle *)malloc(sizeof(file_handle))) == NULL ) {
        !          1731:                ReturnUndefinedError(0);
        !          1732:                /* NOT REACHED */
        !          1733:        }
        !          1734: 
        !          1735:        if ( (new_handle->pathname= (char *)malloc(MAX_FILE_NAME_LENGTH)) == NULL ) {
        !          1736:                ReturnUndefinedError(0);
        !          1737:                /* NOT REACHED */
        !          1738:        }
        !          1739: 
        !          1740: #ifdef DEBUG
        !          1741:        fprintf(msgs, "copy handle= %x\n",new_handle);
        !          1742: #endif DEBUG
        !          1743: 
        !          1744:        copyhandle(&dir_handle,destdir);
        !          1745: 
        !          1746:        if ( dir_handle == 0 ) {
        !          1747:                dir_handle= &RootHandle;
        !          1748:                strcpy(new_handle->pathname, SERVICE_ROOT);
        !          1749:        } else {
        !          1750:                if ( dir_handle->state != FILE_OPEN ) {
        !          1751:                        ReturnHandleError(FILING_invalid);
        !          1752:                        /* NOT REACHED */
        !          1753:                }
        !          1754: 
        !          1755:                if ( access_file(dir_handle) != -1 ) {
        !          1756:                        /* NOT REACHED */
        !          1757:                }
        !          1758: 
        !          1759:                if ( dir_handle->isdirectory != TRUE ) {
        !          1760:                        ReturnHandleError(FILING_directoryRequired);
        !          1761:                        /* NOT REACHED */
        !          1762:                }
        !          1763: 
        !          1764:                strcpy(new_handle->pathname,dir_handle->pathname);
        !          1765:                if ( strcmp(new_handle->pathname, "/") != 0 )
        !          1766:                        strcat(new_handle->pathname,"/");
        !          1767:        } 
        !          1768: 
        !          1769:        if ( verify_copy_attributes(attributes,new_handle,handle) != -1 ) {
        !          1770:                /* NOT REACHED */
        !          1771:        }
        !          1772: 
        !          1773:        close_file(handle);
        !          1774: 
        !          1775: #ifdef DEBUG
        !          1776:        fprintf(msgs, "copying %s to %s\n", handle->pathname, new_handle->pathname);
        !          1777:        fflush(msgs);
        !          1778: #endif DEBUG
        !          1779: 
        !          1780:        if ( copy_file(handle, new_handle) != -1 ) {
        !          1781:                /* NOT REACHED */
        !          1782:        }
        !          1783: 
        !          1784:        new_handle->state= FILE_OPEN;
        !          1785:        new_handle->file_desc= NULL;
        !          1786: 
        !          1787:        copyhandle(results.newFile, &new_handle);
        !          1788:        reset_continuance_timer();
        !          1789:        return(results);
        !          1790: 
        !          1791: #else EXTENSIONS
        !          1792:        NoSuchProcedureValue("Filing", 10);
        !          1793: #endif EXTENSIONS
        !          1794: }
        !          1795: #ifdef EXTENSIONS
        !          1796: verify_copy_attributes(attr, tohandle, fromhandle)
        !          1797: FILING_AttributeSequence attr;
        !          1798: file_handle *tohandle;
        !          1799: file_handle *fromhandle;
        !          1800: {
        !          1801:        int i;
        !          1802:        FILING_AttributeType t;
        !          1803:        int got_accesslist, got_defaultaccesslist, got_istemporary;
        !          1804:        int got_name, got_pathname, got_subtreesizelimit, got_version;
        !          1805:        char *pathname;
        !          1806:        char *name;
        !          1807:        FILING_Version version;
        !          1808:        Boolean istemporary;
        !          1809:        Cardinal subtreesizelimit;
        !          1810:        char *AttrToString();
        !          1811:        LongCardinal AttrToLongCardinal();
        !          1812: 
        !          1813: #ifdef DEBUG
        !          1814:        fprintf(msgs,"%d copy attributes        ",attr.length);
        !          1815: #endif DEBUG
        !          1816: 
        !          1817:        if ( attr.length < 0 ) {
        !          1818:                ReturnAttributeTypeError(FILING_illegal, 0);
        !          1819:                /* NOT REACHED */
        !          1820:        }
        !          1821: 
        !          1822:        got_accesslist= got_defaultaccesslist= got_istemporary= 0;
        !          1823:        got_name= got_pathname= got_subtreesizelimit= got_version= 0;
        !          1824: 
        !          1825:        for ( i= 0 ; i < attr.length ; i++ ) {
        !          1826:                t= attr.sequence[i].type;
        !          1827: #ifdef DEBUG
        !          1828:                fprintf(msgs, "%d ",t);
        !          1829: #endif DEBUG
        !          1830: 
        !          1831:                if ( t == FILING_pathname ) {
        !          1832: #ifdef DEBUG
        !          1833:                        fprintf(msgs,"pathname  ");
        !          1834: #endif DEBUG
        !          1835:                        if ( got_pathname ) {
        !          1836:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1837:                                /* NOT REACHED */
        !          1838:                        }
        !          1839:                        got_pathname++;
        !          1840: 
        !          1841:                        pathname= AttrToString(&attr.sequence[i]);
        !          1842:                        if ( check_pathname(pathname) != -1 ) {
        !          1843:                                /* NOT REACHED */
        !          1844:                        }
        !          1845:                        continue;
        !          1846:                }                       
        !          1847: 
        !          1848:                if ( t == FILING_version ) {
        !          1849: #ifdef DEBUG
        !          1850:                        fprintf(msgs,"version  ");
        !          1851: #endif DEBUG
        !          1852:                        if ( got_version ) {
        !          1853:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1854:                                /* NOT REACHED */
        !          1855:                        }
        !          1856:                        got_version++;
        !          1857: 
        !          1858:                        version= AttrToCardinal(&attr.sequence[i]);
        !          1859:                        if ( version != FILING_highestVersion ) {
        !          1860:                                        ReturnAttributeValueError(FILING_unimplemented, t);
        !          1861:                                        /* NOT REACHED */
        !          1862: 
        !          1863:                        }
        !          1864:                        continue;
        !          1865:                }
        !          1866: 
        !          1867: 
        !          1868:                if ( t == FILING_name ) {
        !          1869: #ifdef DEBUG
        !          1870:                        fprintf(msgs, "name  ");
        !          1871: #endif DEBUG
        !          1872:                        if ( got_name ) {
        !          1873:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1874:                                /* NOT REACHED */
        !          1875:                        }
        !          1876:                        got_name++;
        !          1877: 
        !          1878:                        name= AttrToString(&attr.sequence[i]);
        !          1879:                        continue;
        !          1880:                }
        !          1881: 
        !          1882: #ifdef SOMEDAY
        !          1883:                if ( t == FILING_accessList ) {
        !          1884:                        if ( got_accesslist ) {
        !          1885:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1886:                                /* NOT REACHED */
        !          1887:                        }
        !          1888: 
        !          1889:                        got_accesslist++;
        !          1890: 
        !          1891:                        if ( FALSE ) {
        !          1892:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1893:                                /* NOT REACHED */
        !          1894:                        }
        !          1895: 
        !          1896:                        continue;
        !          1897:                }
        !          1898: 
        !          1899:                if ( t == FILING_defaultAccessList ) {
        !          1900:                        if ( got_defaultaccesslist ) {
        !          1901:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1902:                                /* NOT REACHED */
        !          1903:                        }
        !          1904: 
        !          1905:                        got_defaultaccesslist++;
        !          1906: 
        !          1907:                        if ( FALSE ) {
        !          1908:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1909:                                /* NOT REACHED */
        !          1910:                        }
        !          1911: 
        !          1912:                        continue;
        !          1913:                }
        !          1914: #endif SOMEDAY
        !          1915: 
        !          1916:                if ( t == FILING_isTemporary ) {
        !          1917:                        if ( got_istemporary ) {
        !          1918:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1919:                                /* NOT REACHED */
        !          1920:                        }
        !          1921: 
        !          1922:                        got_istemporary++;
        !          1923: 
        !          1924:                        istemporary= AttrToBoolean(&attr.sequence[i]);
        !          1925:                        if ( istemporary != FALSE ) {
        !          1926:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1927:                                /* NOT REACHED */
        !          1928:                        }
        !          1929: 
        !          1930:                        continue;
        !          1931:                }
        !          1932: 
        !          1933:                if ( t == FILING_subtreeSizeLimit ) {
        !          1934:                        if ( got_subtreesizelimit ) {
        !          1935:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          1936:                                /* NOT REACHED */
        !          1937:                        }
        !          1938: 
        !          1939:                        got_subtreesizelimit++;
        !          1940: 
        !          1941:                        subtreesizelimit= AttrToCardinal(&attr.sequence[i]);
        !          1942:                        if ( subtreesizelimit != FILING_nullSubtreeSizeLimit ) {
        !          1943:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          1944:                                /* NOT REACHED */
        !          1945:                        }
        !          1946: 
        !          1947:                        continue;
        !          1948:                }
        !          1949: 
        !          1950:                if ( t == FILING_position ) {
        !          1951:                        ReturnAttributeTypeError(FILING_unimplemented, t);
        !          1952:                        /* NOT REACHED */
        !          1953:                }
        !          1954: 
        !          1955:                if ( ( t < 0 ) || (t > FILING_subtreeSizeLimit) ) {
        !          1956:                        ReturnAttributeTypeError(FILING_illegal, t);
        !          1957:                        /* NOT REACHED */
        !          1958:                }
        !          1959: 
        !          1960:                ReturnAttributeTypeError(FILING_disallowed, t);
        !          1961:        }
        !          1962: 
        !          1963: #ifdef DEBUG
        !          1964:        fprintf(msgs, "\n");
        !          1965: #endif DEBUG
        !          1966: 
        !          1967: #ifdef FILETOOLCOMPATIBILITY
        !          1968:        if ( !got_pathname && !got_name) {
        !          1969:                char *ptr, *rindex();
        !          1970:                if ( (ptr= rindex(fromhandle->pathname,'/')) == 0 ) 
        !          1971:                        ptr= fromhandle->pathname;
        !          1972:                else
        !          1973:                        ptr++;
        !          1974:                strcat(tohandle->pathname, ptr);
        !          1975:        } else  if ( !got_pathname )  {
        !          1976:                strcat(tohandle->pathname,name);
        !          1977:        } else {
        !          1978:                if ( *pathname == '/' )
        !          1979:                        strcat(tohandle->pathname, pathname+1);
        !          1980:                else
        !          1981:                        strcat(tohandle->pathname,pathname);
        !          1982:                Deallocate(&pathname);
        !          1983:        }
        !          1984: 
        !          1985: #else FILETOOLCOMPATIBILITY
        !          1986:        if ( !got_pathname ) {
        !          1987:                ReturnAttributeTypeError(FILING_missing, t);
        !          1988:                /* NOT REACHED */
        !          1989:        } else {
        !          1990:                if ( *pathname == '/' )
        !          1991:                        strcat(tohandle->pathname, pathname+1);
        !          1992:                else
        !          1993:                        strcat(tohandle->pathname, pathname);
        !          1994:                Deallocate(&pathname);
        !          1995:        }
        !          1996: #endif FILETOOLCOMPATIBILITY
        !          1997: 
        !          1998:        return(-1);
        !          1999: }
        !          2000: #endif EXTENSIONS
        !          2001: 
        !          2002: 
        !          2003: void FILING_Move(ServerConnection, BDTProc, file, destdir, attributes, session)
        !          2004: CourierConnection *ServerConnection;
        !          2005: int ( *BDTProc)();
        !          2006: FILING_Handle file;
        !          2007: FILING_Handle destdir;
        !          2008: FILING_AttributeSequence attributes;
        !          2009: FILING_Session session;
        !          2010: {
        !          2011: #ifdef EXTENSIONS
        !          2012:        file_handle *handle;
        !          2013:        file_handle *dir_handle;
        !          2014:        char oldname[MAX_FILE_NAME_LENGTH];
        !          2015: 
        !          2016: #ifdef DEBUG
        !          2017:        if (msgs == 0) {
        !          2018:                char logfile[50];
        !          2019:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          2020:                msgs= fopen(logfile,"w");
        !          2021:        }
        !          2022:        fprintf(msgs, "Move\n");
        !          2023: #endif DEBUG
        !          2024: 
        !          2025:        BDTabort_expected= FALSE;
        !          2026: 
        !          2027:        if ( verify_session(session) != -1 ) {
        !          2028:                /* NOT REACHED */
        !          2029:        }
        !          2030: 
        !          2031:        copyhandle(&handle, file);
        !          2032: 
        !          2033:        if ( handle->state != FILE_OPEN ) {
        !          2034:                ReturnHandleError(FILING_invalid);
        !          2035:                /* NOT REACHED */
        !          2036:        }
        !          2037: 
        !          2038:        if ( access_file(handle) != -1 ) {
        !          2039:                /* NOT REACHED */
        !          2040:        }
        !          2041: 
        !          2042:        strcpy(oldname, handle->pathname);
        !          2043: 
        !          2044:        copyhandle(&dir_handle,destdir);
        !          2045: 
        !          2046:        if ( dir_handle == 0 ) {
        !          2047:                dir_handle= &RootHandle;
        !          2048:                strcpy(handle->pathname, SERVICE_ROOT);
        !          2049:        } else {
        !          2050:                if ( dir_handle->state != FILE_OPEN ) {
        !          2051:                        ReturnHandleError(FILING_invalid);
        !          2052:                        /* NOT REACHED */
        !          2053:                }
        !          2054: 
        !          2055:                if ( access_file(dir_handle) != -1 ) {
        !          2056:                        /* NOT REACHED */
        !          2057:                }
        !          2058: 
        !          2059:                if ( dir_handle->isdirectory != TRUE ) {
        !          2060:                        ReturnHandleError(FILING_directoryRequired);
        !          2061:                        /* NOT REACHED */
        !          2062:                }
        !          2063: 
        !          2064:                strcpy(handle->pathname,dir_handle->pathname);
        !          2065:                if ( strcmp(handle->pathname, "/") != 0 )
        !          2066:                        strcat(handle->pathname,"/");
        !          2067:        } 
        !          2068: 
        !          2069: 
        !          2070:        if ( verify_move_attributes(attributes,handle,oldname) != -1 ) {
        !          2071:                /* NOT REACHED */
        !          2072:        }
        !          2073: 
        !          2074:        close_file(handle);
        !          2075: 
        !          2076: #ifdef DEBUG
        !          2077:        fprintf(msgs, "moving %s to %s\n", oldname, handle->pathname);
        !          2078: #endif DEBUG
        !          2079: 
        !          2080:        if ( rename_file(oldname, handle) != -1 ) {
        !          2081:                /* NOT REACHED */
        !          2082:        }
        !          2083: 
        !          2084:        reset_continuance_timer();
        !          2085:        return;
        !          2086: 
        !          2087: #else EXTENSIONS
        !          2088:        NoSuchProcedureValue("Filing", 11);
        !          2089: #endif EXTENSIONS
        !          2090: }
        !          2091: #ifdef EXTENSIONS
        !          2092: verify_move_attributes(attr, tohandle, fromname)
        !          2093: FILING_AttributeSequence attr;
        !          2094: file_handle *tohandle;
        !          2095: char *fromname;
        !          2096: {
        !          2097:        int i;
        !          2098:        FILING_AttributeType t;
        !          2099:        int got_accesslist, got_defaultaccesslist, got_istemporary;
        !          2100:        int got_name, got_subtreesizelimit, got_version;
        !          2101:        char *name;
        !          2102:        FILING_Version version;
        !          2103:        Boolean istemporary;
        !          2104:        Cardinal subtreesizelimit;
        !          2105:        char *AttrToString();
        !          2106:        LongCardinal AttrToLongCardinal();
        !          2107: 
        !          2108: #ifdef DEBUG
        !          2109:        fprintf(msgs,"%d move attributes        ",attr.length);
        !          2110: #endif DEBUG
        !          2111: 
        !          2112:        if ( attr.length < 0 ) {
        !          2113:                ReturnAttributeTypeError(FILING_illegal, 0);
        !          2114:                /* NOT REACHED */
        !          2115:        }
        !          2116: 
        !          2117:        got_accesslist= got_defaultaccesslist= got_istemporary= 0;
        !          2118:        got_name= got_subtreesizelimit= got_version= 0;
        !          2119: 
        !          2120:        for ( i= 0 ; i < attr.length ; i++ ) {
        !          2121:                t= attr.sequence[i].type;
        !          2122: #ifdef DEBUG
        !          2123:                fprintf(msgs, "%d ",t);
        !          2124: #endif DEBUG
        !          2125: 
        !          2126:                if ( t == FILING_version ) {
        !          2127: #ifdef DEBUG
        !          2128:                        fprintf(msgs,"version  ");
        !          2129: #endif DEBUG
        !          2130:                        if ( got_version ) {
        !          2131:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2132:                                /* NOT REACHED */
        !          2133:                        }
        !          2134:                        got_version++;
        !          2135: 
        !          2136:                        version= AttrToCardinal(&attr.sequence[i]);
        !          2137:                        if ( version != FILING_highestVersion ) {
        !          2138:                                        ReturnAttributeValueError(FILING_unimplemented, t);
        !          2139:                                        /* NOT REACHED */
        !          2140: 
        !          2141:                        }
        !          2142:                        continue;
        !          2143:                }
        !          2144: 
        !          2145: 
        !          2146:                if ( t == FILING_name ) {
        !          2147: #ifdef DEBUG
        !          2148:                        fprintf(msgs, "name  ");
        !          2149: #endif DEBUG
        !          2150:                        if ( got_name ) {
        !          2151:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2152:                                /* NOT REACHED */
        !          2153:                        }
        !          2154:                        got_name++;
        !          2155: 
        !          2156:                        name= AttrToString(&attr.sequence[i]);
        !          2157:                        continue;
        !          2158:                }
        !          2159: 
        !          2160: #ifdef SOMEDAY
        !          2161:                if ( t == FILING_accessList ) {
        !          2162:                        if ( got_accesslist ) {
        !          2163:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2164:                                /* NOT REACHED */
        !          2165:                        }
        !          2166: 
        !          2167:                        got_accesslist++;
        !          2168: 
        !          2169:                        if ( FALSE ) {
        !          2170:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2171:                                /* NOT REACHED */
        !          2172:                        }
        !          2173: 
        !          2174:                        continue;
        !          2175:                }
        !          2176: 
        !          2177:                if ( t == FILING_defaultAccessList ) {
        !          2178:                        if ( got_defaultaccesslist ) {
        !          2179:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2180:                                /* NOT REACHED */
        !          2181:                        }
        !          2182: 
        !          2183:                        got_defaultaccesslist++;
        !          2184: 
        !          2185:                        if ( FALSE ) {
        !          2186:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2187:                                /* NOT REACHED */
        !          2188:                        }
        !          2189: 
        !          2190:                        continue;
        !          2191:                }
        !          2192: #endif SOMEDAY
        !          2193: 
        !          2194:                if ( t == FILING_isTemporary ) {
        !          2195:                        if ( got_istemporary ) {
        !          2196:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2197:                                /* NOT REACHED */
        !          2198:                        }
        !          2199: 
        !          2200:                        got_istemporary++;
        !          2201: 
        !          2202:                        istemporary= AttrToBoolean(&attr.sequence[i]);
        !          2203:                        if ( istemporary != FALSE ) {
        !          2204:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2205:                                /* NOT REACHED */
        !          2206:                        }
        !          2207: 
        !          2208:                        continue;
        !          2209:                }
        !          2210: 
        !          2211:                if ( t == FILING_subtreeSizeLimit ) {
        !          2212:                        if ( got_subtreesizelimit ) {
        !          2213:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2214:                                /* NOT REACHED */
        !          2215:                        }
        !          2216: 
        !          2217:                        got_subtreesizelimit++;
        !          2218: 
        !          2219:                        subtreesizelimit= AttrToCardinal(&attr.sequence[i]);
        !          2220:                        if ( subtreesizelimit != FILING_nullSubtreeSizeLimit ) {
        !          2221:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2222:                                /* NOT REACHED */
        !          2223:                        }
        !          2224: 
        !          2225:                        continue;
        !          2226:                }
        !          2227: 
        !          2228:                if ( t == FILING_position ) {
        !          2229:                        ReturnAttributeTypeError(FILING_unimplemented, t);
        !          2230:                        /* NOT REACHED */
        !          2231:                }
        !          2232: 
        !          2233:                if ( ( t < 0 ) || (t > FILING_subtreeSizeLimit) ) {
        !          2234:                        ReturnAttributeTypeError(FILING_illegal, t);
        !          2235:                        /* NOT REACHED */
        !          2236:                }
        !          2237: 
        !          2238:                ReturnAttributeTypeError(FILING_disallowed, t);
        !          2239:        }
        !          2240: 
        !          2241: #ifdef DEBUG
        !          2242:        fprintf(msgs, "\n");
        !          2243: #endif DEBUG
        !          2244: 
        !          2245:        if ( !got_name) {
        !          2246:                char *ptr, *rindex();
        !          2247:                if ( (ptr= rindex(fromname,'/')) == 0 ) 
        !          2248:                        ptr= fromname;
        !          2249:                else
        !          2250:                        ptr++;
        !          2251:                strcat(tohandle->pathname, ptr);
        !          2252:        } else {
        !          2253:                strcat(tohandle->pathname,name);
        !          2254:        } 
        !          2255: 
        !          2256:        return(-1);
        !          2257: }
        !          2258: #endif EXTENSIONS
        !          2259: 
        !          2260: 
        !          2261: FILING_StoreResults FILING_Store(ServerConnection, BDTProc, directory, attributes, controls, content, session)
        !          2262: CourierConnection *ServerConnection;
        !          2263: int ( *BDTProc)();
        !          2264: FILING_Handle directory;
        !          2265: FILING_AttributeSequence attributes;
        !          2266: FILING_ControlSequence controls;
        !          2267: BulkData1_Descriptor content;
        !          2268: FILING_Session session;
        !          2269: {
        !          2270:        FILING_StoreResults results;
        !          2271:        file_handle *handle, *dir_handle;
        !          2272: 
        !          2273: #ifdef DEBUG
        !          2274:        if (msgs == 0) {
        !          2275:                char logfile[50];
        !          2276:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          2277:                msgs= fopen(logfile,"w");
        !          2278:        }
        !          2279:        fprintf(msgs, "Store  ");
        !          2280: #endif DEBUG
        !          2281: 
        !          2282:        BDTabort_expected= TRUE;
        !          2283: 
        !          2284:        if ( verify_session(session) != -1 ) {
        !          2285:                /* NOT REACHED */
        !          2286:        }
        !          2287: 
        !          2288: #ifndef FILETOOLCOMPATIBILITY
        !          2289:        if ( is_nullControls(controls) != -1) {
        !          2290:                ReturnControlTypeError(FILING_disallowed, 0);
        !          2291:                /* NOT REACHED */
        !          2292:        }
        !          2293: 
        !          2294:        if ( is_nullHandle(directory) != -1 ) {
        !          2295:                ReturnHandleError(FILING_invalid);
        !          2296:                /* NOT REACHED */
        !          2297:        }
        !          2298: #endif FILETOOLCOMPATIBILITY
        !          2299: 
        !          2300:        if ( content.designator == BulkData1_null ) {
        !          2301:                return;
        !          2302:        } else  if ( content.designator != BulkData1_immediate ) {
        !          2303:                ReturnTransferError(FILING_aborted);
        !          2304:                /* NOT REACHED */
        !          2305:        }
        !          2306: 
        !          2307:        if ( (handle= (file_handle *)malloc(sizeof(file_handle))) == NULL ) {
        !          2308:                ReturnUndefinedError(0);
        !          2309:                /* NOT REACHED */
        !          2310:        }
        !          2311: 
        !          2312:        if ( (handle->pathname= (char *)malloc(MAX_FILE_NAME_LENGTH)) == NULL ) {
        !          2313:                ReturnUndefinedError(0);
        !          2314:                /* NOT REACHED */
        !          2315:        }
        !          2316: 
        !          2317: #ifdef DEBUG
        !          2318:        fprintf(msgs, "store handle= %x\n",handle);
        !          2319: #endif DEBUG
        !          2320: 
        !          2321: #ifdef FILETOOLCOMPATIBILITY
        !          2322:        copyhandle(&dir_handle,directory);
        !          2323: 
        !          2324:        if ( dir_handle == 0 ) {
        !          2325:                dir_handle= &RootHandle;
        !          2326:                strcpy(handle->pathname, SERVICE_ROOT);
        !          2327:        } else {
        !          2328:                if ( dir_handle->state != FILE_OPEN ) {
        !          2329:                        ReturnHandleError(FILING_invalid);
        !          2330:                        /* NOT REACHED */
        !          2331:                }
        !          2332: 
        !          2333:                if ( access_file(dir_handle) != -1 ) {
        !          2334:                        /* NOT REACHED */
        !          2335:                }
        !          2336: 
        !          2337:                if ( dir_handle->isdirectory != TRUE ) {
        !          2338:                        ReturnHandleError(FILING_directoryRequired);
        !          2339:                        /* NOT REACHED */
        !          2340:                }
        !          2341: 
        !          2342:                strcpy(handle->pathname,dir_handle->pathname);
        !          2343:                if ( strcmp(handle->pathname, "/") != 0 )
        !          2344:                        strcat(handle->pathname,"/");
        !          2345:        } 
        !          2346: #else FILETOOLCOMPATIBILITY
        !          2347:        strcpy(handle->pathname, SERVICE_ROOT);
        !          2348: #endif FILETOOLCOMPATIBILITY
        !          2349: 
        !          2350:        if ( verify_store_attributes(attributes, handle) != -1 ) {
        !          2351:                /* NOT REACHED */
        !          2352:        }
        !          2353: 
        !          2354: #ifdef DEBUG
        !          2355:        fprintf(msgs, "creating '%s'\n", handle->pathname);
        !          2356: #endif DEBUG
        !          2357: 
        !          2358:        if ( handle->isdirectory == TRUE ) {
        !          2359:                if ( dir_storeproc(ServerConnection,handle,content) != -1 ) {
        !          2360:                        /* NOT REACHED */
        !          2361:                }
        !          2362:        } else {
        !          2363:                if ( create_file(handle) != -1 ) {
        !          2364:                        /* NOT REACHED */
        !          2365:                }
        !          2366: 
        !          2367: #ifdef EXTENSIONS
        !          2368:                if ( (handle->type > LAST_FILING_TYPE) && (handle->type != TYPE_Interpress) &&
        !          2369:                                        (handle->type != TYPE_VPCanvas) ) {
        !          2370:                        SaveExtendedAttributes(handle->file_desc, attributes);
        !          2371:                }
        !          2372: #endif EXTENSIONS
        !          2373:                if ( storeproc(ServerConnection,handle) != -1 ) {
        !          2374:                        close_file(handle);
        !          2375:                        delete_partial_file(handle);
        !          2376:                        ReturnTransferError(FILING_aborted);
        !          2377:                        /* NOT REACHED */
        !          2378:                }
        !          2379: 
        !          2380:                close_file(handle);
        !          2381:        }
        !          2382: 
        !          2383:        handle->state= FILE_OPEN;
        !          2384:        handle->file_desc= NULL;
        !          2385: 
        !          2386:        copyhandle(results.file, &handle);
        !          2387:        reset_continuance_timer();
        !          2388: 
        !          2389:        return(results);
        !          2390: }
        !          2391: 
        !          2392: verify_store_attributes(attr, handle)
        !          2393: FILING_AttributeSequence attr;
        !          2394: file_handle *handle;
        !          2395: {
        !          2396:        int i;
        !          2397:        FILING_AttributeType t;
        !          2398:        int got_accesslist, got_childrenuniquelynamed, got_createdon, got_datasize;
        !          2399:        int got_defaultaccesslist, got_isdirectory, got_istemporary, got_ordering;
        !          2400:        int got_parentID, got_pathname, got_subtreesizelimit, got_type, got_version;
        !          2401:        char *pathname;
        !          2402:        FILING_Version version;
        !          2403:        Boolean childrenuniquelynamed, istemporary;
        !          2404:        Cardinal ordering;              
        !          2405:        Cardinal subtreesizelimit;
        !          2406:        char *AttrToString();
        !          2407:        Unspecified *AttrToFileID();
        !          2408:        LongCardinal AttrToLongCardinal();
        !          2409: 
        !          2410: #ifdef FILETOOLCOMPATIBILITY
        !          2411:        int got_name, got_4938;
        !          2412:        char *name;
        !          2413: #endif FILETOOLCOMPATIBILITY
        !          2414: 
        !          2415: #ifdef DEBUG
        !          2416:        fprintf(msgs,"%d store attributes       ",attr.length);
        !          2417: #endif DEBUG
        !          2418: 
        !          2419:        if ( attr.length <= 0 ) {
        !          2420:                ReturnAttributeTypeError(FILING_illegal, 0);
        !          2421:                /* NOT REACHED */
        !          2422:        }
        !          2423: 
        !          2424:        got_accesslist= got_childrenuniquelynamed= got_createdon= 0;
        !          2425:        got_datasize= got_defaultaccesslist= got_isdirectory= 0;
        !          2426:        got_istemporary= got_ordering= got_parentID= got_pathname= 0;
        !          2427:        got_subtreesizelimit= got_type= got_version= 0;
        !          2428: 
        !          2429: #ifdef FILETOOLCOMPATIBILITY
        !          2430:        got_name= got_4938= 0;
        !          2431: #endif FILETOOLCOMPATIBILITY
        !          2432: 
        !          2433: 
        !          2434:        for ( i= 0 ; i < attr.length ; i++ ) {
        !          2435:                t= attr.sequence[i].type;
        !          2436: #ifdef DEBUG
        !          2437:                fprintf(msgs, "%d ",t);
        !          2438: #endif DEBUG
        !          2439:                if ( t == FILING_createdOn ) {
        !          2440: #ifdef DEBUG
        !          2441:                        fprintf(msgs,"createdOn  ");
        !          2442: #endif DEBUG
        !          2443:                        if ( got_createdon ) {
        !          2444:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2445:                                /* NOT REACHED */
        !          2446:                        }
        !          2447:                        got_createdon++;
        !          2448: 
        !          2449:                        handle->createdon= AttrToLongCardinal(&attr.sequence[i]);
        !          2450:                        continue;
        !          2451:                }
        !          2452: 
        !          2453:                if ( t == FILING_dataSize ) {
        !          2454: #ifdef DEBUG
        !          2455:                        fprintf(msgs,"dataSize  ");
        !          2456: #endif DEBUG
        !          2457:                        if ( got_datasize ) {
        !          2458:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2459:                                /* NOT REACHED */
        !          2460:                        }
        !          2461:                        got_datasize++;
        !          2462: 
        !          2463:                        handle->datasize= AttrToLongCardinal(&attr.sequence[i]);
        !          2464:                        continue;
        !          2465:                }
        !          2466: 
        !          2467:                if ( t == FILING_isDirectory ) {
        !          2468: #ifdef DEBUG
        !          2469:                        fprintf(msgs,"isDirectory  ");
        !          2470: #endif DEBUG
        !          2471:                        if ( got_isdirectory ) {
        !          2472:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2473:                                /* NOT REACHED */
        !          2474:                        }
        !          2475: 
        !          2476:                        got_isdirectory++;
        !          2477: 
        !          2478:                        handle->isdirectory= AttrToBoolean(&attr.sequence[i]);
        !          2479:                        continue;
        !          2480:                }
        !          2481: 
        !          2482:                if ( t == FILING_pathname ) {
        !          2483: #ifdef DEBUG
        !          2484:                        fprintf(msgs,"pathname  ");
        !          2485: #endif DEBUG
        !          2486:                        if ( got_pathname ) {
        !          2487:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2488:                                /* NOT REACHED */
        !          2489:                        }
        !          2490:                        got_pathname++;
        !          2491: 
        !          2492:                        pathname= AttrToString(&attr.sequence[i]);
        !          2493:                        if ( check_pathname(pathname) != -1 ) {
        !          2494:                                /* NOT REACHED */
        !          2495:                        }
        !          2496:                        continue;
        !          2497:                }                       
        !          2498:                if ( t == FILING_type ) {
        !          2499: #ifdef DEBUG
        !          2500:                        fprintf(msgs,"type  ");
        !          2501: #endif DEBUG
        !          2502:                        if ( got_type ) {
        !          2503:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2504:                                /* NOT REACHED */
        !          2505:                        }
        !          2506:                        got_type++;
        !          2507: 
        !          2508:                        handle->type= AttrToLongCardinal(&attr.sequence[i]);
        !          2509: #ifndef EXTENSIONS
        !          2510:                        if ( (handle->type != FILING_tText) &&
        !          2511:                                        (handle->type != FILING_tUnspecified) &&
        !          2512:                                        (handle->type != FILING_tDirectory) ) {
        !          2513:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2514:                                /* NOT REACHED */
        !          2515:                        }
        !          2516: #endif EXTENSIONS
        !          2517:                        continue;
        !          2518:                }
        !          2519:                if ( t == FILING_version ) {
        !          2520: #ifdef DEBUG
        !          2521:                        fprintf(msgs,"version  ");
        !          2522: #endif DEBUG
        !          2523:                        if ( got_version ) {
        !          2524:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2525:                                /* NOT REACHED */
        !          2526:                        }
        !          2527:                        got_version++;
        !          2528: 
        !          2529:                        version= AttrToCardinal(&attr.sequence[i]);
        !          2530:                        if ( version != FILING_highestVersion ) {
        !          2531:                                        ReturnAttributeValueError(FILING_unimplemented, t);
        !          2532:                                        /* NOT REACHED */
        !          2533: 
        !          2534:                        }
        !          2535:                        continue;
        !          2536:                }
        !          2537: 
        !          2538: #ifdef FILETOOLCOMPATIBILITY
        !          2539:                if ( t == FILING_name ) {
        !          2540: #ifdef DEBUG
        !          2541:                        fprintf(msgs, "name  ");
        !          2542: #endif DEBUG
        !          2543:                        if ( got_name ) {
        !          2544:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2545:                                /* NOT REACHED */
        !          2546:                        }
        !          2547:                        got_name++;
        !          2548: 
        !          2549:                        name= AttrToString(&attr.sequence[i]);
        !          2550:                        continue;
        !          2551:                }
        !          2552: 
        !          2553:                if ( t == 4938 ) {
        !          2554:                        if ( got_4938 ) {
        !          2555:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2556:                                /* NOT REACHED */
        !          2557:                        }
        !          2558: 
        !          2559:                        got_4938++;
        !          2560:                        continue;
        !          2561:                }
        !          2562: #endif FILETOOLCOMPATIBILITY
        !          2563: 
        !          2564: #ifdef SOMEDAY
        !          2565:                if ( t == FILING_accessList ) {
        !          2566:                        if ( got_accesslist ) {
        !          2567:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2568:                                /* NOT REACHED */
        !          2569:                        }
        !          2570: 
        !          2571:                        got_accesslist++;
        !          2572: 
        !          2573:                        if ( FALSE ) {
        !          2574:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2575:                                /* NOT REACHED */
        !          2576:                        }
        !          2577: 
        !          2578:                        continue;
        !          2579:                }
        !          2580: #endif SOMEDAY
        !          2581: 
        !          2582:                if ( t == FILING_childrenUniquelyNamed ) {
        !          2583:                        if ( got_childrenuniquelynamed ) {
        !          2584:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2585:                                /* NOT REACHED */
        !          2586:                        }
        !          2587: 
        !          2588:                        got_childrenuniquelynamed++;
        !          2589: 
        !          2590:                        childrenuniquelynamed= AttrToBoolean(&attr.sequence[i]);
        !          2591:                        if ( childrenuniquelynamed != TRUE ) {
        !          2592:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2593:                                /* NOT REACHED */
        !          2594:                        }
        !          2595: 
        !          2596:                        continue;
        !          2597:                }
        !          2598: 
        !          2599: 
        !          2600: #ifdef SOMEDAY
        !          2601:                if ( t == FILING_defaultAccessList ) {
        !          2602:                        if ( got_defaultaccesslist ) {
        !          2603:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2604:                                /* NOT REACHED */
        !          2605:                        }
        !          2606: 
        !          2607:                        got_defaultaccesslist++;
        !          2608: 
        !          2609:                        if ( FALSE ) {
        !          2610:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2611:                                /* NOT REACHED */
        !          2612:                        }
        !          2613: 
        !          2614:                        continue;
        !          2615:                }
        !          2616: #endif SOMEDAY
        !          2617: 
        !          2618:                if ( t == FILING_isTemporary ) {
        !          2619:                        if ( got_istemporary ) {
        !          2620:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2621:                                /* NOT REACHED */
        !          2622:                        }
        !          2623: 
        !          2624:                        got_istemporary++;
        !          2625: 
        !          2626:                        istemporary= AttrToBoolean(&attr.sequence[i]);
        !          2627:                        if ( istemporary != FALSE ) {
        !          2628:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2629:                                /* NOT REACHED */
        !          2630:                        }
        !          2631: 
        !          2632:                        continue;
        !          2633:                }
        !          2634: 
        !          2635:                if ( t == FILING_ordering ) {
        !          2636:                        if ( got_ordering ) {
        !          2637:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2638:                                /* NOT REACHED */
        !          2639:                        }
        !          2640: 
        !          2641:                        got_ordering++;
        !          2642: 
        !          2643:                        if ( FALSE ) {
        !          2644:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2645:                                /* NOT REACHED */
        !          2646:                        }
        !          2647: 
        !          2648:                        continue;
        !          2649:                }
        !          2650: 
        !          2651:                if ( t == FILING_subtreeSizeLimit ) {
        !          2652:                        if ( got_subtreesizelimit ) {
        !          2653:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2654:                                /* NOT REACHED */
        !          2655:                        }
        !          2656: 
        !          2657:                        got_subtreesizelimit++;
        !          2658: 
        !          2659:                        subtreesizelimit= AttrToCardinal(&attr.sequence[i]);
        !          2660:                        if ( subtreesizelimit != FILING_nullSubtreeSizeLimit ) {
        !          2661:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          2662:                                /* NOT REACHED */
        !          2663:                        }
        !          2664: 
        !          2665:                        continue;
        !          2666:                }
        !          2667: 
        !          2668:                if ( (t == FILING_fileID) || (t == FILING_modifiedBy) ||
        !          2669:                                (t == FILING_modifiedOn) || (t == FILING_name) ||
        !          2670:                                (t == FILING_numberOfChildren) || (t == FILING_parentID) ||
        !          2671:                                (t == FILING_readBy) || (t == FILING_readOn) ||
        !          2672:                                (t == FILING_storedSize) || (t == FILING_subtreeSize) ) {
        !          2673:                        ReturnAttributeTypeError(FILING_disallowed, t);
        !          2674:                }
        !          2675: 
        !          2676: #ifndef EXTENSIONS
        !          2677:                if ( ( t < 0 ) || (t > FILING_subtreeSizeLimit) ) {
        !          2678:                        ReturnAttributeTypeError(FILING_illegal, t);
        !          2679:                        /* NOT REACHED */
        !          2680:                }
        !          2681: 
        !          2682:                if ( (t == FILING_checksum) || (t == FILING_createdBy) ||
        !          2683:                                                (t == FILING_position) )
        !          2684:                        ReturnAttributeTypeError(FILING_unimplemented, t);
        !          2685:                else
        !          2686:                        ReturnAttributeTypeError(FILING_disallowed, t);
        !          2687: 
        !          2688: #else EXTENSIONS
        !          2689:                if ( t < 0 ) {
        !          2690:                        ReturnAttributeTypeError(FILING_illegal, t);
        !          2691:                        /* NOT REACHED */
        !          2692:                }
        !          2693:                if ( handle->type != TYPE_VP ) {
        !          2694:                        if ( (t == FILING_checksum) || (t == FILING_createdBy) ||
        !          2695:                                                (t == FILING_position) )
        !          2696:                                ReturnAttributeTypeError(FILING_unimplemented, t);
        !          2697:                        else
        !          2698:                                ReturnAttributeTypeError(FILING_disallowed, t);
        !          2699:                }
        !          2700: #endif EXTENSIONS
        !          2701:        }
        !          2702: 
        !          2703: #ifdef DEBUG
        !          2704:        fprintf(msgs, "\n");
        !          2705: #endif DEBUG
        !          2706: 
        !          2707: #ifdef FILETOOLCOMPATIBILITY
        !          2708:        if ( !got_pathname && !got_name) {
        !          2709:                handle->pathname= SERVICE_ROOT;
        !          2710:        } else  if ( !got_pathname )  {
        !          2711:                strcat(handle->pathname,name);
        !          2712:        } else {
        !          2713:                if ( *pathname == '/' )
        !          2714:                        strcat(handle->pathname, pathname+1);
        !          2715:                else
        !          2716:                        strcat(handle->pathname,pathname);
        !          2717:                Deallocate(&pathname);
        !          2718:        }
        !          2719: 
        !          2720: #else FILETOOLCOMPATIBILITY
        !          2721:        if ( !got_pathname ) {
        !          2722:                ReturnAttributeTypeError(FILING_missing, t);
        !          2723:                /* NOT REACHED */
        !          2724:        } else {
        !          2725:                if ( *pathname == '/' )
        !          2726:                        strcat(handle->pathname, pathname+1);
        !          2727:                else
        !          2728:                        strcat(handle->pathname, pathname);
        !          2729:                Deallocate(&pathname);
        !          2730:        }
        !          2731: #endif FILETOOLCOMPATIBILITY
        !          2732: 
        !          2733:        if ( !got_type )
        !          2734:                handle->type= FILING_tUnspecified;
        !          2735: 
        !          2736:        if ( !got_createdon )
        !          2737:                handle->createdon= 0;
        !          2738: 
        !          2739:        if ( !got_isdirectory ) {
        !          2740:                if ( handle->type == FILING_tDirectory )
        !          2741:                        handle->isdirectory= TRUE;
        !          2742:                else
        !          2743:                        handle->isdirectory= FALSE;
        !          2744:        } else {
        !          2745:                if ( ((handle->isdirectory == TRUE) && (handle->type != FILING_tDirectory)) ||
        !          2746:                                ((handle->isdirectory == FALSE) && (handle->type == FILING_tDirectory)) ) {
        !          2747:                        ReturnAttributeTypeError(FILING_unreasonable, FILING_isDirectory);
        !          2748:                        /* NOT REACHED */
        !          2749:                }
        !          2750:        }
        !          2751: 
        !          2752:        return(-1);
        !          2753: }
        !          2754: 
        !          2755: 
        !          2756: void FILING_Retrieve(ServerConnection, BDTProc, file, content, session)
        !          2757: CourierConnection *ServerConnection;
        !          2758: int ( *BDTProc)();
        !          2759: FILING_Handle file;
        !          2760: BulkData1_Descriptor content;
        !          2761: FILING_Session session;
        !          2762: {
        !          2763:        file_handle *handle;
        !          2764: 
        !          2765: #ifdef DEBUG
        !          2766:        if (msgs == 0) {
        !          2767:                char logfile[50];
        !          2768:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          2769:                msgs= fopen(logfile,"w");
        !          2770:        }
        !          2771:        fprintf(msgs, "Retrieve\n");
        !          2772: #endif DEBUG
        !          2773: 
        !          2774:        BDTabort_expected= TRUE;
        !          2775: 
        !          2776:        if ( verify_session(session) != -1 ) {
        !          2777:                /* NOT REACHED */
        !          2778:        }
        !          2779: 
        !          2780:        if ( is_nullHandle(file) == -1 ) {
        !          2781:                ReturnHandleError(FILING_nullDisallowed);
        !          2782:                /* NOT REACHED */
        !          2783:        }
        !          2784: 
        !          2785:        copyhandle(&handle,file);
        !          2786: 
        !          2787:        if ( handle->state != FILE_OPEN ) {
        !          2788:                ReturnHandleError(FILING_invalid);
        !          2789:                /* NOT REACHED */
        !          2790:        }
        !          2791: 
        !          2792:        if ( access_file(handle) != -1 ) {
        !          2793:                /* NOT REACHED */
        !          2794:        }
        !          2795: 
        !          2796:        if ( content.designator == BulkData1_null ) {
        !          2797:                return;
        !          2798:        } else  if ( content.designator != BulkData1_immediate ) {
        !          2799:                ReturnTransferError(FILING_aborted);
        !          2800:                /* NOT REACHED */
        !          2801:        }
        !          2802: 
        !          2803:        if ( open_file(handle) != -1 ) {
        !          2804:                /* NOT REACHED */
        !          2805:        }
        !          2806: 
        !          2807: #ifdef DEBUG
        !          2808:        fprintf(msgs, "retrieving '%s'\n", handle->pathname);
        !          2809: #endif DEBUG
        !          2810: 
        !          2811:        if ( retrieveproc(ServerConnection,handle) != -1 ) {
        !          2812:                close_file(handle);
        !          2813:                ReturnTransferError(FILING_aborted);
        !          2814:                /* NOT REACHED */
        !          2815:        }
        !          2816: 
        !          2817:        close_file(handle);
        !          2818:        handle->file_desc= NULL;
        !          2819:        reset_continuance_timer();
        !          2820: 
        !          2821:        return;
        !          2822: }
        !          2823: 
        !          2824: 
        !          2825: void FILING_Replace(ServerConnection, BDTProc, file, attributes, content, session)
        !          2826: CourierConnection *ServerConnection;
        !          2827: int ( *BDTProc)();
        !          2828: FILING_Handle file;
        !          2829: FILING_AttributeSequence attributes;
        !          2830: BulkData1_Descriptor content;
        !          2831: FILING_Session session;
        !          2832: {
        !          2833: #ifdef EXTENSIONS
        !          2834:        file_handle *handle;
        !          2835: 
        !          2836: #ifdef DEBUG
        !          2837:        if (msgs == 0) {
        !          2838:                char logfile[50];
        !          2839:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          2840:                msgs= fopen(logfile,"w");
        !          2841:        }
        !          2842:        fprintf(msgs, "Replace\n");
        !          2843: #endif DEBUG
        !          2844: 
        !          2845:        BDTabort_expected= TRUE;
        !          2846: 
        !          2847:        if ( verify_session(session) != -1 ) {
        !          2848:                /* NOT REACHED */
        !          2849:        }
        !          2850: 
        !          2851:        if ( is_nullHandle(file) == -1 ) {
        !          2852:                ReturnHandleError(FILING_nullDisallowed);
        !          2853:                /* NOT REACHED */
        !          2854:        }
        !          2855: 
        !          2856:        copyhandle(&handle,file);
        !          2857: 
        !          2858:        if ( handle->state != FILE_OPEN ) {
        !          2859:                ReturnHandleError(FILING_invalid);
        !          2860:                /* NOT REACHED */
        !          2861:        }
        !          2862: 
        !          2863:        if ( access_file(handle) != -1 ) {
        !          2864:                /* NOT REACHED */
        !          2865:        }
        !          2866: 
        !          2867:        if ( content.designator == BulkData1_null ) {
        !          2868:                return;
        !          2869:        } else  if ( content.designator != BulkData1_immediate ) {
        !          2870:                ReturnTransferError(FILING_aborted);
        !          2871:                /* NOT REACHED */
        !          2872:        }
        !          2873: 
        !          2874:        if ( verify_replace_attributes(attributes, handle) != -1 ) {
        !          2875:                /* NOT REACHED */
        !          2876:        }
        !          2877: 
        !          2878: #ifdef DEBUG
        !          2879:        fprintf(msgs, "replacing '%s'\n", handle->pathname);
        !          2880: #endif DEBUG
        !          2881: 
        !          2882:        if ( make_backup(handle) != -1 ) {
        !          2883:                /* NOT REACHED */
        !          2884:        }
        !          2885: 
        !          2886:        if ( open_file(handle) != -1 ) {
        !          2887:                /* NOT REACHED */
        !          2888:        }
        !          2889: 
        !          2890:        if ( storeproc(ServerConnection,handle) != -1 ) {
        !          2891:                close_file(handle);
        !          2892:                recall_backup(handle);
        !          2893:                ReturnTransferError(FILING_aborted);
        !          2894:                /* NOT REACHED */
        !          2895:        }
        !          2896: 
        !          2897:        close_file(handle);
        !          2898:        unlink_backup(handle);
        !          2899: 
        !          2900:        handle->file_desc= NULL;
        !          2901:        reset_continuance_timer();
        !          2902: 
        !          2903:        return;
        !          2904: 
        !          2905: #else EXTENSIONS
        !          2906:        NoSuchProcedureValue("Filing", 14);
        !          2907: #endif EXTENSIONS
        !          2908: }
        !          2909: 
        !          2910: #ifdef EXTENSIONS
        !          2911: verify_replace_attributes(attr, handle)
        !          2912: FILING_AttributeSequence attr;
        !          2913: file_handle *handle;
        !          2914: {
        !          2915:        int i;
        !          2916:        FILING_AttributeType t;
        !          2917:        LongCardinal datasize;
        !          2918:        int got_createdon, got_datasize;
        !          2919:        LongCardinal AttrToLongCardinal();
        !          2920: 
        !          2921: #ifdef DEBUG
        !          2922:        fprintf(msgs,"%d replace attributes     ",attr.length);
        !          2923: #endif DEBUG
        !          2924: 
        !          2925:        if ( attr.length < 0 ) {
        !          2926:                ReturnAttributeTypeError(FILING_illegal, 0);
        !          2927:                /* NOT REACHED */
        !          2928:        }
        !          2929: 
        !          2930:        got_createdon= 0;
        !          2931: 
        !          2932:        for ( i= 0 ; i < attr.length ; i++ ) {
        !          2933:                t= attr.sequence[i].type;
        !          2934: #ifdef DEBUG
        !          2935:                fprintf(msgs, "%d ",t);
        !          2936: #endif DEBUG
        !          2937:                if ( t == FILING_createdOn ) {
        !          2938: #ifdef DEBUG
        !          2939:                        fprintf(msgs,"createdOn  ");
        !          2940: #endif DEBUG
        !          2941:                        if ( got_createdon ) {
        !          2942:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2943:                                /* NOT REACHED */
        !          2944:                        }
        !          2945:                        got_createdon++;
        !          2946: 
        !          2947:                        handle->createdon= AttrToLongCardinal(&attr.sequence[i]);
        !          2948:                        continue;
        !          2949:                }
        !          2950: 
        !          2951:                if ( t == FILING_dataSize ) {
        !          2952: #ifdef DEBUG
        !          2953:                        fprintf(msgs,"dataSize  ");
        !          2954: #endif DEBUG
        !          2955:                        if ( got_datasize ) {
        !          2956:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          2957:                                /* NOT REACHED */
        !          2958:                        }
        !          2959:                        got_datasize++;
        !          2960: 
        !          2961:                        datasize= AttrToLongCardinal(&attr.sequence[i]);
        !          2962:                        continue;
        !          2963:                }
        !          2964: 
        !          2965:                if ( t < 0 ) {
        !          2966:                        ReturnAttributeTypeError(FILING_illegal, t);
        !          2967:                        /* NOT REACHED */
        !          2968:                }
        !          2969: 
        !          2970:                if ( (t == FILING_checksum) || (t == FILING_createdBy) ||
        !          2971:                                                (t == FILING_position) )
        !          2972:                        ReturnAttributeTypeError(FILING_unimplemented, t);
        !          2973:                else
        !          2974:                        ReturnAttributeTypeError(FILING_disallowed, t);
        !          2975: 
        !          2976:        }
        !          2977: 
        !          2978: #ifdef DEBUG
        !          2979:        fprintf(msgs, "\n");
        !          2980: #endif DEBUG
        !          2981: 
        !          2982:        return(-1);
        !          2983: }
        !          2984: #endif EXTENSIONS
        !          2985: 
        !          2986: 
        !          2987: void FILING_Serialize(ServerConnection, BDTProc, file, serializedFile, session)
        !          2988: CourierConnection *ServerConnection;
        !          2989: int ( *BDTProc)();
        !          2990: FILING_Handle file;
        !          2991: BulkData1_Descriptor serializedFile;
        !          2992: FILING_Session session;
        !          2993: {
        !          2994: #ifdef EXTENSIONS
        !          2995:        file_handle *handle;
        !          2996:        LongCardinal type;
        !          2997: 
        !          2998: #ifdef DEBUG
        !          2999:        if (msgs == 0) {
        !          3000:                char logfile[50];
        !          3001:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          3002:                msgs= fopen(logfile,"w");
        !          3003:        }
        !          3004:        fprintf(msgs, "Serialize\n");
        !          3005: #endif DEBUG
        !          3006: 
        !          3007:        BDTabort_expected= TRUE;
        !          3008: 
        !          3009:        if ( verify_session(session) != -1 ) {
        !          3010:                /* NOT REACHED */
        !          3011:        }
        !          3012: 
        !          3013:        if ( is_nullHandle(file) == -1 ) {
        !          3014:                ReturnHandleError(FILING_nullDisallowed);
        !          3015:                /* NOT REACHED */
        !          3016:        }
        !          3017: 
        !          3018:        copyhandle(&handle,file);
        !          3019: 
        !          3020:        if ( handle->state != FILE_OPEN ) {
        !          3021:                ReturnHandleError(FILING_invalid);
        !          3022:                /* NOT REACHED */
        !          3023:        }
        !          3024: 
        !          3025:        if ( access_file(handle) != -1 ) {
        !          3026:                /* NOT REACHED */
        !          3027:        }
        !          3028: 
        !          3029:        if ( serializedFile.designator == BulkData1_null ) {
        !          3030:                return;
        !          3031:        } else  if ( serializedFile.designator != BulkData1_immediate ) {
        !          3032:                ReturnTransferError(FILING_aborted);
        !          3033:                /* NOT REACHED */
        !          3034:        }
        !          3035: 
        !          3036:        /*
        !          3037:         * for now, can only serialize files which are already in 'serialized'
        !          3038:         * form. This can be assumed if the file is of a Viewpoint file type
        !          3039:         * and the stored isDirectory attribute is TRUE.
        !          3040:         * NOTE: like all other cases, this is no guarantee...
        !          3041:        */
        !          3042: 
        !          3043:        type= get_type(handle->pathname);
        !          3044: 
        !          3045:        if ( (type < LAST_FILING_TYPE) || (type == TYPE_Interpress) || (type == TYPE_VPCanvas) ) {
        !          3046:                ReturnAccessError(FILING_fileChanged);
        !          3047:                /* NOT REACHED */
        !          3048:        }
        !          3049: 
        !          3050:        if ( open_file(handle) != -1 ) {
        !          3051:                /* NOT REACHED */
        !          3052:        }
        !          3053: 
        !          3054:        if ( GetDirectoryAttribute(handle->file_desc) != TRUE ) {
        !          3055:                close_file(handle);
        !          3056:                ReturnAccessError(FILING_fileChanged);
        !          3057:                /* NOT REACHED */
        !          3058:        }
        !          3059: 
        !          3060: #ifdef DEBUG
        !          3061:        fprintf(msgs, "serializing '%s'\n", handle->pathname);
        !          3062: #endif DEBUG
        !          3063: 
        !          3064:        if ( retrieveproc(ServerConnection,handle) != -1 ) {
        !          3065:                close_file(handle);
        !          3066:                ReturnTransferError(FILING_aborted);
        !          3067:                /* NOT REACHED */
        !          3068:        }
        !          3069: 
        !          3070:        close_file(handle);
        !          3071:        handle->file_desc= NULL;
        !          3072:        reset_continuance_timer();
        !          3073: #else EXTENSIONS
        !          3074:        NoSuchProcedureValue("Filing", 15);
        !          3075: #endif EXTENSIONS
        !          3076: }
        !          3077: 
        !          3078: 
        !          3079: FILING_DeserializeResults FILING_Deserialize(ServerConnection, BDTProc,
        !          3080:                 directory, attributes, controls, serializedFile, session)
        !          3081: CourierConnection *ServerConnection;
        !          3082: int ( *BDTProc)();
        !          3083: FILING_Handle directory;
        !          3084: FILING_AttributeSequence attributes;
        !          3085: FILING_ControlSequence controls;
        !          3086: BulkData1_Descriptor serializedFile;
        !          3087: FILING_Session session;
        !          3088: {
        !          3089: #ifdef EXTENSIONS
        !          3090:        FILING_DeserializeResults results;
        !          3091:        file_handle *handle, *dir_handle;
        !          3092: 
        !          3093: #ifdef DEBUG
        !          3094:        if (msgs == 0) {
        !          3095:                char logfile[50];
        !          3096:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          3097:                msgs= fopen(logfile,"w");
        !          3098:        }
        !          3099:        fprintf(msgs, "Deserialize  ");
        !          3100: #endif DEBUG
        !          3101: 
        !          3102:        BDTabort_expected= TRUE;
        !          3103: 
        !          3104:        if ( verify_session(session) != -1 ) {
        !          3105:                /* NOT REACHED */
        !          3106:        }
        !          3107: 
        !          3108: #ifndef FILETOOLCOMPATIBILITY
        !          3109:        if ( is_nullControls(controls) != -1) {
        !          3110:                ReturnControlTypeError(FILING_disallowed, 0);
        !          3111:                /* NOT REACHED */
        !          3112:        }
        !          3113: 
        !          3114:        if ( is_nullHandle(directory) != -1 ) {
        !          3115:                ReturnHandleError(FILING_invalid);
        !          3116:                /* NOT REACHED */
        !          3117:        }
        !          3118: #endif FILETOOLCOMPATIBILITY
        !          3119: 
        !          3120:        if ( serializedFile.designator == BulkData1_null ) {
        !          3121:                return;
        !          3122:        } else  if ( serializedFile.designator != BulkData1_immediate ) {
        !          3123:                ReturnTransferError(FILING_aborted);
        !          3124:                /* NOT REACHED */
        !          3125:        }
        !          3126: 
        !          3127:        if ( (handle= (file_handle *)malloc(sizeof(file_handle))) == NULL ) {
        !          3128:                ReturnUndefinedError(0);
        !          3129:                /* NOT REACHED */
        !          3130:        }
        !          3131: 
        !          3132:        if ( (handle->pathname= (char *)malloc(MAX_FILE_NAME_LENGTH)) == NULL ) {
        !          3133:                ReturnUndefinedError(0);
        !          3134:                /* NOT REACHED */
        !          3135:        }
        !          3136: 
        !          3137: #ifdef DEBUG
        !          3138:        fprintf(msgs, "deserialize handle= %x\n",handle);
        !          3139: #endif DEBUG
        !          3140: 
        !          3141: #ifdef FILETOOLCOMPATIBILITY
        !          3142:        copyhandle(&dir_handle,directory);
        !          3143: 
        !          3144:        if ( dir_handle == 0 ) {
        !          3145:                dir_handle= &RootHandle;
        !          3146:                strcpy(handle->pathname, SERVICE_ROOT);
        !          3147:        } else {
        !          3148:                if ( dir_handle->state != FILE_OPEN ) {
        !          3149:                        ReturnHandleError(FILING_invalid);
        !          3150:                        /* NOT REACHED */
        !          3151:                }
        !          3152: 
        !          3153:                if ( access_file(dir_handle) != -1 ) {
        !          3154:                        /* NOT REACHED */
        !          3155:                }
        !          3156: 
        !          3157:                if ( dir_handle->isdirectory != TRUE ) {
        !          3158:                        ReturnHandleError(FILING_directoryRequired);
        !          3159:                        /* NOT REACHED */
        !          3160:                }
        !          3161: 
        !          3162:                strcpy(handle->pathname,dir_handle->pathname);
        !          3163:                if ( strcmp(handle->pathname, "/") != 0 )
        !          3164:                        strcat(handle->pathname,"/");
        !          3165:        } 
        !          3166: #else FILETOOLCOMPATIBILITY
        !          3167:        strcpy(handle->pathname, SERVICE_ROOT);
        !          3168: #endif FILETOOLCOMPATIBILITY
        !          3169: 
        !          3170:        if ( verify_deserialize_attributes(attributes, handle) != -1 ) {
        !          3171:                /* NOT REACHED */
        !          3172:        }
        !          3173: 
        !          3174: #ifdef DEBUG
        !          3175:        fprintf(msgs, "creating '%s'\n", handle->pathname);
        !          3176: #endif DEBUG
        !          3177: 
        !          3178:        if ( create_file(handle) != -1 ) {
        !          3179:                /* NOT REACHED */
        !          3180:        }
        !          3181: 
        !          3182:        if ( storeproc(ServerConnection,handle) != -1 ) {
        !          3183:                close_file(handle);
        !          3184:                delete_partial_file(handle);
        !          3185:                ReturnTransferError(FILING_aborted);
        !          3186:                /* NOT REACHED */
        !          3187:        }
        !          3188: 
        !          3189:        close_file(handle);
        !          3190: 
        !          3191:        handle->state= FILE_OPEN;
        !          3192:        handle->file_desc= NULL;
        !          3193: 
        !          3194:        copyhandle(results.file, &handle);
        !          3195:        reset_continuance_timer();
        !          3196: 
        !          3197:        return(results);
        !          3198: #else EXTENSIONS
        !          3199:        NoSuchProcedureValue("Filing", 16);
        !          3200: #endif EXTENSIONS
        !          3201: }
        !          3202: 
        !          3203: #ifdef EXTENSIONS
        !          3204: verify_deserialize_attributes(attr, handle)
        !          3205: FILING_AttributeSequence attr;
        !          3206: file_handle *handle;
        !          3207: {
        !          3208:        int i;
        !          3209:        FILING_AttributeType t;
        !          3210:        int got_accesslist, got_defaultaccesslist, got_istemporary;
        !          3211:        int got_name, got_pathname, got_subtreesizelimit, got_version;
        !          3212:        FILING_Version version;
        !          3213:        Boolean istemporary;
        !          3214:        char *pathname;
        !          3215:        char *name;
        !          3216:        char *AttrToString();
        !          3217: 
        !          3218: #ifdef DEBUG
        !          3219:        fprintf(msgs, "%d deserialize attributes     ", attr.length);
        !          3220: #endif DEBUG
        !          3221: 
        !          3222:        if ( attr.length <= 0 ) {
        !          3223:                ReturnAttributeTypeError(FILING_illegal, 0);
        !          3224:                /* NOT REACHED */
        !          3225:        }
        !          3226: 
        !          3227:        got_accesslist= got_defaultaccesslist= got_istemporary= 0;
        !          3228:        got_name= got_pathname= got_subtreesizelimit= got_version= 0;
        !          3229: 
        !          3230:        for ( i= 0; i < attr.length ; i++ ) {
        !          3231:                t= attr.sequence[i].type;
        !          3232: 
        !          3233:                if ( t == FILING_accessList ) {
        !          3234: #ifdef DEBUG
        !          3235:                        fprintf(msgs, "accessList  ");
        !          3236: #endif DEBUG
        !          3237:                        if ( got_accesslist ) {
        !          3238:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          3239:                                /* NOT REACHED */
        !          3240:                        }
        !          3241:                        got_accesslist++;
        !          3242: 
        !          3243:                        continue;
        !          3244:                }
        !          3245: 
        !          3246: #ifdef SOMEDAY
        !          3247:                if ( t == FILING_defaultAccessList ) {
        !          3248: #ifdef DEBUG
        !          3249:                        fprintf(msgs, "defaultAccessList  ");
        !          3250: #endif DEBUG
        !          3251:                        if ( got_defaultaccesslist ) {
        !          3252:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          3253:                                /* NOT REACHED */
        !          3254:                        }
        !          3255:                        got_defaultaccesslist++;
        !          3256: 
        !          3257:                        continue;
        !          3258:                }
        !          3259: #endif SOMEDAY
        !          3260: 
        !          3261:                if ( t == FILING_isTemporary ) {
        !          3262: #ifdef DEBUG
        !          3263:                        fprintf(msgs, "isTemporary  ");
        !          3264: #endif DEBUG
        !          3265:                        if ( got_istemporary ) {
        !          3266:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          3267:                                /* NOT REACHED */
        !          3268:                        }
        !          3269:                        got_istemporary++;
        !          3270: 
        !          3271:                        istemporary= AttrToBoolean(&attr.sequence[i]);
        !          3272:                        if ( istemporary != FALSE ) {
        !          3273:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          3274:                                /*  NOT REACHED */
        !          3275:                        }
        !          3276:                        continue;
        !          3277:                }
        !          3278: 
        !          3279:                if ( t == FILING_name ) {
        !          3280: #ifdef DEBUG
        !          3281:                        fprintf(msgs, "name  ");
        !          3282: #endif DEBUG
        !          3283:                        if ( got_name ) {
        !          3284:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          3285:                                /* NOT REACHED */
        !          3286:                        }
        !          3287:                        got_name++;
        !          3288: 
        !          3289:                        name= AttrToString(&attr.sequence[i]);
        !          3290:                        continue;
        !          3291:                }
        !          3292: 
        !          3293:                if ( t == FILING_pathname ) {
        !          3294: #ifdef DEBUG
        !          3295:                        fprintf(msgs, "pathname  ");
        !          3296: #endif DEBUG
        !          3297:                        if ( got_pathname ) {
        !          3298:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          3299:                                /* NOT REACHED */
        !          3300:                        }
        !          3301:                        got_pathname++;
        !          3302: 
        !          3303:                        pathname= AttrToString(&attr.sequence[i]);
        !          3304:                        if ( check_pathname(pathname) != 1 ) {
        !          3305:                                /* NOT REACHED */
        !          3306:                        }
        !          3307:                        continue;
        !          3308:                }
        !          3309: 
        !          3310:                if ( t == FILING_subtreeSizeLimit ) {
        !          3311: #ifdef DEBUG
        !          3312:                        fprintf(msgs, "subtreeSizeLimit  ");
        !          3313: #endif DEBUG
        !          3314:                        if ( got_subtreesizelimit ) {
        !          3315:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          3316:                                /* NOT REACHED */
        !          3317:                        }
        !          3318:                        got_subtreesizelimit++;
        !          3319: 
        !          3320:                        continue;
        !          3321:                }
        !          3322: 
        !          3323:                if ( t == FILING_version ) {
        !          3324: #ifdef DEBUG
        !          3325:                        fprintf(msgs, "version  ");
        !          3326: #endif DEBUG
        !          3327:                        if ( got_version ) {
        !          3328:                                ReturnAttributeTypeError(FILING_duplicated, t);
        !          3329:                                /* NOT REACHED */
        !          3330:                        }
        !          3331:                        got_version++;
        !          3332: 
        !          3333:                        version= AttrToCardinal(&attr.sequence[i]);
        !          3334:                        if ( version != FILING_highestVersion ) {
        !          3335:                                ReturnAttributeValueError(FILING_unimplemented, t);
        !          3336:                                /* NOT REACHED */
        !          3337:                        }
        !          3338:                        continue;
        !          3339:                }
        !          3340:        }
        !          3341: 
        !          3342: #ifdef DEBUG
        !          3343:        fprintf(msgs, "\n");
        !          3344: #endif DEBUG
        !          3345: 
        !          3346:        if ( !got_pathname && !got_name ) {
        !          3347:                handle->pathname= SERVICE_ROOT;
        !          3348:        } else if ( !got_pathname ) {
        !          3349:                strcat(handle->pathname, name);
        !          3350:                Deallocate(&name);
        !          3351:        } else {
        !          3352:                if ( *pathname == '/' )
        !          3353:                        strcat(handle->pathname, pathname+1);
        !          3354:                else
        !          3355:                        strcat(handle->pathname, pathname);
        !          3356:                Deallocate(&pathname);
        !          3357:        }
        !          3358: 
        !          3359:        handle->type= FILING_tSerialized;
        !          3360:        handle->createdon= 0;
        !          3361: 
        !          3362:        return(-1);
        !          3363: }
        !          3364: #endif EXTENSIONS
        !          3365: 
        !          3366: FILING_FindResults FILING_Find(ServerConnection, BDTProc, directory, types, scope, controls, session)
        !          3367: CourierConnection *ServerConnection;
        !          3368: int ( *BDTProc)();
        !          3369: FILING_Handle directory;
        !          3370: FILING_AttributeTypeSequence types;
        !          3371: FILING_ScopeSequence scope;
        !          3372: FILING_ControlSequence controls;
        !          3373: FILING_Session session;
        !          3374: {
        !          3375:        NoSuchProcedureValue("Filing", 17);
        !          3376: }
        !          3377: 
        !          3378: 
        !          3379: void FILING_List(ServerConnection, BDTProc, directory, types, scope, listing, session)
        !          3380: CourierConnection *ServerConnection;
        !          3381: int ( *BDTProc)();
        !          3382: FILING_Handle directory;
        !          3383: FILING_AttributeTypeSequence types;
        !          3384: FILING_ScopeSequence scope;
        !          3385: BulkData1_Descriptor listing;
        !          3386: FILING_Session session;
        !          3387: {
        !          3388:        char *match_name;
        !          3389:        Cardinal count;
        !          3390:        file_handle *dir_handle;
        !          3391: 
        !          3392:        BDTabort_expected= TRUE;
        !          3393: 
        !          3394: #ifdef DEBUG
        !          3395:        if (msgs == 0) {
        !          3396:                char logfile[50];
        !          3397:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          3398:                msgs= fopen(logfile,"w");
        !          3399:        }
        !          3400:        fprintf(msgs, "List\n");
        !          3401: #endif DEBUG
        !          3402: 
        !          3403:        if ( verify_session(session) != -1 ) {
        !          3404:                /* NOT REACHED */
        !          3405:        }
        !          3406: 
        !          3407: #ifndef FILETOOLCOMPATIBILITY
        !          3408:        if ( is_nullHandle(directory) != -1 ) {
        !          3409:                ReturnHandleError(FILING_invalid);
        !          3410:                /* NOT REACHED */
        !          3411:        }
        !          3412: #endif FILETOOLCOMPATIBILITY
        !          3413: 
        !          3414:        if ( listing.designator == BulkData1_null )
        !          3415:                return;
        !          3416:        else if ( listing.designator != BulkData1_immediate ) {
        !          3417:                ReturnTransferError(FILING_aborted);
        !          3418:                /* NOT REACHED */
        !          3419:        }
        !          3420: 
        !          3421:        copyhandle(&dir_handle, directory);
        !          3422: 
        !          3423: #ifdef FILETOOLCOMPATIBILITY
        !          3424:        if ( dir_handle == 0 ) {
        !          3425:                dir_handle= &RootHandle;
        !          3426:        } else {
        !          3427:                if ( dir_handle->state != FILE_OPEN ) {
        !          3428:                        ReturnHandleError(FILING_invalid);
        !          3429:                        /* NOT REACHED */
        !          3430:                }
        !          3431: 
        !          3432:                if ( dir_handle->isdirectory != TRUE ) {
        !          3433:                        ReturnHandleError(FILING_directoryRequired);
        !          3434:                        /* NOT REACHED */
        !          3435:                }
        !          3436: 
        !          3437:                if ( access_file(dir_handle) != -1 ) {
        !          3438:                        /* NOT REACHED */
        !          3439:                }
        !          3440: 
        !          3441:        }
        !          3442: #else FILETOOLCOMPATIBILITY
        !          3443:        dir_handle= &RootHandle;
        !          3444: #endif FILETOOLCOMPATIBILITY
        !          3445: 
        !          3446:        if ( get_scopes(scope, &count, &match_name) != -1 ) {
        !          3447:                /* NOT REACHED */
        !          3448:        }
        !          3449: 
        !          3450:        if ( list_directory(ServerConnection, dir_handle, types, match_name, count) != -1 ) {
        !          3451:                /* NOT REACHED */
        !          3452:        }
        !          3453: 
        !          3454:        reset_continuance_timer();
        !          3455: 
        !          3456:        return;
        !          3457: }
        !          3458: 
        !          3459: get_scopes(scope, count, matches_name)
        !          3460: FILING_ScopeSequence scope;
        !          3461: Cardinal *count;
        !          3462: char **matches_name;
        !          3463: {
        !          3464:        int got_count, got_filter, got_matches;
        !          3465:        int i, scopetype;
        !          3466:        FILING_ScopeType t;
        !          3467: #ifdef FILETOOLCOMPATIBILITY
        !          3468:        int got_equal;
        !          3469:        static char *wildcard_all= "*";
        !          3470: 
        !          3471:                *matches_name= wildcard_all;
        !          3472:                *count= FILING_unlimitedCount;
        !          3473:        if ( scope.length < 0 ) {
        !          3474:                ReturnScopeTypeError(FILING_illegal, 0);
        !          3475:                /* NOT REACHED */
        !          3476:        } else if ( scope.length == 0 ) {
        !          3477:                return(-1);
        !          3478:        }
        !          3479: #else FILETOOLCOMPATIBILITY
        !          3480:        if ( scope.length <= 0 ) {
        !          3481:                ReturnScopeTypeError(FILING_illegal, 0);
        !          3482:                /* NOT REACHED */
        !          3483:        }
        !          3484: #endif FILETOOLCOMPATIBILITY
        !          3485: 
        !          3486: #ifdef DEBUG
        !          3487:        fprintf(msgs, "get_scope %d scopes   ",scope.length);
        !          3488: #endif DEBUG
        !          3489: 
        !          3490:        got_count= got_filter= got_matches= 0;
        !          3491: 
        !          3492:        for ( i= 0 ; i < scope.length ; i++ ) {
        !          3493:                t= scope.sequence[i].designator;
        !          3494: 
        !          3495:                if ( t == FILING_filter ) {
        !          3496: #ifdef DEBUG
        !          3497:                        fprintf(msgs, "filter  ");
        !          3498: #endif DEBUG
        !          3499:                        if ( got_filter ) {
        !          3500:                                ReturnScopeTypeError(FILING_duplicated, t);
        !          3501:                                /* NOT REACHED */
        !          3502:                        }
        !          3503:                        got_filter++;
        !          3504: 
        !          3505:                        if ( get_filter(scope.sequence[i].FILING_filter_case,matches_name) != -1 ) {
        !          3506:                                /* NOT REACHED */
        !          3507:                        }
        !          3508:                        continue;
        !          3509:                }
        !          3510: 
        !          3511:                if ( t == FILING_count ) {
        !          3512: #ifdef DEBUG
        !          3513:                        fprintf(msgs, "count  ");
        !          3514: #endif DEBUG
        !          3515:                        if ( got_count ) {
        !          3516:                                ReturnScopeTypeError(FILING_duplicated, t);
        !          3517:                                /* NOT REACHED */
        !          3518:                        }
        !          3519:                        got_count++;
        !          3520: 
        !          3521:                        *count= AttrToCardinal(&scope.sequence[i].FILING_count_case);
        !          3522: #ifdef DEBUG
        !          3523:                        fprintf(msgs, "count = %d  ",*count);
        !          3524: #endif DEBUG
        !          3525:                        continue;
        !          3526:                }
        !          3527: 
        !          3528:                scopetype= (Cardinal) t;
        !          3529:                if ( (scopetype < 0) || (scopetype > (Cardinal) FILING_depth) ) {
        !          3530:                        ReturnScopeTypeError(FILING_illegal, t);
        !          3531:                        /* NOT REACHED */
        !          3532:                }
        !          3533: 
        !          3534:                ReturnScopeTypeError(FILING_unimplemented, t);
        !          3535:                /* NOT REACHED */
        !          3536:        }
        !          3537: 
        !          3538:        if ( !got_count ) {
        !          3539:                *count= FILING_unlimitedCount;
        !          3540:        }
        !          3541: 
        !          3542: #ifdef DEBUG
        !          3543:        fprintf(msgs, "\n");
        !          3544: #endif DEBUG
        !          3545: }
        !          3546: 
        !          3547: get_filter(filter,matches_name)
        !          3548: FILING_Filter filter;
        !          3549: char **matches_name;
        !          3550: {
        !          3551: 
        !          3552:        int got_matches= 0;
        !          3553: #ifdef FILETOOLCOMPATIBILITY
        !          3554:        int got_equal= 0;
        !          3555:        int got_all= 0;
        !          3556: #endif FILETOOLCOMPATIBILITY
        !          3557: 
        !          3558:        if ( filter.designator == FILING_matches ) {
        !          3559:                if ( got_matches ) {
        !          3560:                        ReturnScopeValueError(FILING_duplicated, (Cardinal) FILING_filter);
        !          3561:                        /* NOT REACHED */
        !          3562:                }       
        !          3563: 
        !          3564:                got_matches++;
        !          3565: 
        !          3566: #ifdef DEBUG
        !          3567:                fprintf(msgs, "matches on %d attribute\n",filter.FILING_matches_case.attribute.type);
        !          3568: #endif DEBUG
        !          3569: 
        !          3570: #ifdef FILETOOLCOMPATIBILITY
        !          3571:                if ( (filter.FILING_matches_case.attribute.type != FILING_pathname) &&
        !          3572:                                (filter.FILING_matches_case.attribute.type != FILING_name) ) {
        !          3573:                        ReturnScopeValueError(FILING_unimplemented, (Cardinal) FILING_filter);
        !          3574:                        /* NOT REACHED */
        !          3575:                }
        !          3576: #else FILETOOLCOMPATIBILITY
        !          3577:                if ( filter.FILING_matches_case.attribute.type != FILING_pathname ) {
        !          3578:                        ReturnScopeValueError(FILING_unimplemented, (Cardinal) FILING_filter);
        !          3579:                        /* NOT REACHED */
        !          3580:                }
        !          3581: #endif FILETOOLCOMPATIBILITY
        !          3582: 
        !          3583:                *matches_name= AttrToString(&filter.FILING_matches_case.attribute);
        !          3584: 
        !          3585: #ifdef DEBUG
        !          3586:                fprintf(msgs, "matches name= '%s'\n",*matches_name);
        !          3587: #endif DEBUG
        !          3588: 
        !          3589: #ifdef FILETOOLCOMPATIBILITY
        !          3590:        } else if ( filter.designator == FILING_equal ) {
        !          3591:                if ( got_equal ) {
        !          3592:                        ReturnScopeValueError(FILING_duplicated, (Cardinal) FILING_filter);
        !          3593:                        /* NOT REACHED */
        !          3594:                }       
        !          3595: 
        !          3596:                got_equal++;
        !          3597: 
        !          3598: #ifdef DEBUG
        !          3599:                fprintf(msgs, "equal on %d attribute\n",filter.FILING_matches_case.attribute.type);
        !          3600: #endif DEBUG
        !          3601: 
        !          3602:                if ( (filter.FILING_matches_case.attribute.type != FILING_pathname) &&
        !          3603:                                (filter.FILING_matches_case.attribute.type != FILING_name) ) {
        !          3604:                        ReturnScopeValueError(FILING_unimplemented, (Cardinal) FILING_filter);
        !          3605:                        /* NOT REACHED */
        !          3606:                }
        !          3607: 
        !          3608:                *matches_name= AttrToString(&filter.FILING_matches_case.attribute);
        !          3609: 
        !          3610: #ifdef DEBUG
        !          3611:                fprintf(msgs, "matches name= '%s'\n",*matches_name);
        !          3612: #endif DEBUG
        !          3613: 
        !          3614:        } else if ( filter.designator == FILING_all ) {
        !          3615:                if ( got_all ) {
        !          3616:                        ReturnScopeValueError(FILING_duplicated, (Cardinal) FILING_filter);
        !          3617:                        /* NOT REACHED */
        !          3618:                }
        !          3619:                got_all++;
        !          3620: 
        !          3621: #ifdef DEBUG
        !          3622:                fprintf(msgs, "all");
        !          3623: #endif DEBUG
        !          3624: #endif FILETOOLCOMPATIBILITY
        !          3625:        } else {
        !          3626:                ReturnScopeValueError(FILING_unimplemented, (Cardinal) FILING_filter);
        !          3627:                /* NOT REACHED */
        !          3628:        }
        !          3629:        return(-1);
        !          3630: }
        !          3631: 
        !          3632: 
        !          3633: FILING_ContinueResults FILING_Continue(ServerConnection, BDTProc, session)
        !          3634: CourierConnection *ServerConnection;
        !          3635: int ( *BDTProc)();
        !          3636: FILING_Session session;
        !          3637: {
        !          3638:        FILING_ContinueResults results;
        !          3639: 
        !          3640:        BDTabort_expected= FALSE;
        !          3641: 
        !          3642: #ifdef DEBUG
        !          3643:        if (msgs == 0) {
        !          3644:                char logfile[50];
        !          3645:                sprintf(logfile, "/tmp/filing%ld.msgs", getpid());
        !          3646:                msgs= fopen(logfile,"w");
        !          3647:        }
        !          3648:        fprintf(msgs, "Continue\n");
        !          3649: #endif DEBUG
        !          3650: 
        !          3651:        if ( verify_session(session) != -1 ) {
        !          3652:                /* NOT REACHED */
        !          3653:        }
        !          3654: 
        !          3655:        results.continuance= continuance;
        !          3656:        reset_continuance_timer();
        !          3657: 
        !          3658:        return(results);
        !          3659: }
        !          3660: 
        !          3661: continuance_expiration()
        !          3662: {
        !          3663:        /*
        !          3664:         * if BDT in progress, don't close connection
        !          3665:         */
        !          3666: 
        !          3667:        if ( !BDTabort_expected ) {
        !          3668: #ifdef DEBUG
        !          3669:                fprintf(msgs, "continuance_expiration, closing connection\n");
        !          3670:                fflush(msgs);
        !          3671: #endif DEBUG
        !          3672:                CourierClose(_serverConnection);
        !          3673:                exit(1);
        !          3674:        } else {
        !          3675:                reset_continuance_timer();
        !          3676:        }
        !          3677: 
        !          3678: }
        !          3679: 
        !          3680: 
        !          3681: void FILING_UnifyAccessLists(ServerConnection, BDTProc, directory, session)
        !          3682: CourierConnection *ServerConnection;
        !          3683: int ( *BDTProc)();
        !          3684: FILING_Handle directory;
        !          3685: FILING_Session session;
        !          3686: {
        !          3687:        NoSuchProcedureValue("Filing", 20);
        !          3688: }
        !          3689: 
        !          3690: 
        !          3691: void FILING_RetrieveBytes(ServerConnection, BDTProc, file, range, sink, session)
        !          3692: CourierConnection *ServerConnection;
        !          3693: int ( *BDTProc)();
        !          3694: FILING_Handle file;
        !          3695: FILING_ByteRange range;
        !          3696: BulkData1_Descriptor sink;
        !          3697: FILING_Session session;
        !          3698: {
        !          3699:        NoSuchProcedureValue("Filing", 22);
        !          3700: }
        !          3701: 
        !          3702: 
        !          3703: void FILING_ReplaceBytes(ServerConnection, BDTProc, file, range, source, session)
        !          3704: CourierConnection *ServerConnection;
        !          3705: int ( *BDTProc)();
        !          3706: FILING_Handle file;
        !          3707: FILING_ByteRange range;
        !          3708: BulkData1_Descriptor source;
        !          3709: FILING_Session session;
        !          3710: {
        !          3711:        NoSuchProcedureValue("Filing", 23);
        !          3712: }
        !          3713: 
        !          3714: 
        !          3715: dir_storeproc(conn,handle,content)
        !          3716: CourierConnection *conn;
        !          3717: file_handle *handle;
        !          3718: BulkData1_Descriptor content;
        !          3719: {
        !          3720:        int count;
        !          3721:        char buffer[10];
        !          3722: 
        !          3723:        if ( content.designator == BulkData1_immediate ) {
        !          3724:                if ( (count= BDTread(conn,buffer,sizeof(buffer))) > 0 ) {
        !          3725:                        BDTabort(conn);
        !          3726:                        ReturnAttributeTypeError(FILING_unreasonable, FILING_isDirectory);
        !          3727:                        /* NOT REACHED */
        !          3728:                }
        !          3729:        }
        !          3730: 
        !          3731:        if ( create_directory(handle) != -1 ) {
        !          3732:                /* NOT REACHED */
        !          3733:        }
        !          3734: 
        !          3735:        return(-1);
        !          3736: }
        !          3737: 
        !          3738: 
        !          3739: static Unspecified list_buffer[SPPMAXDATA];
        !          3740: static Unspecified *list_end= list_buffer + SPPMAXDATA -1;
        !          3741: static Unspecified *list_ptr= list_buffer;
        !          3742: 
        !          3743: put_next_attribute_sequence(conn,stream_of_attrseq)
        !          3744: CourierConnection *conn;
        !          3745: FILING_StreamOfAttributeSequence *stream_of_attrseq;
        !          3746: {
        !          3747:        int ocount;
        !          3748: 
        !          3749:        stream_of_attrseq->designator= nextSegment;
        !          3750: 
        !          3751:        if ( (list_ptr + FILING_sizeof_StreamOfAttributeSequence(stream_of_attrseq)) > list_end ) {
        !          3752: #ifdef DEBUG
        !          3753:                fprintf(msgs,"put_next writing %d bulk data\n",list_ptr-list_buffer);
        !          3754: #endif DEBUG
        !          3755:                if ( (ocount= BDTwrite(conn, list_buffer, (list_ptr-list_buffer)*sizeof(Cardinal))) <= 0 ) {
        !          3756:                        list_ptr= list_buffer;
        !          3757:                        BDTabort(conn);
        !          3758:                        ReturnTransferError(FILING_aborted);
        !          3759:                        /* NOT REACHED */
        !          3760:                }
        !          3761: 
        !          3762:                list_ptr= list_buffer;
        !          3763:        }
        !          3764: 
        !          3765:        list_ptr += FILING_externalize_StreamOfAttributeSequence(stream_of_attrseq, list_ptr);
        !          3766: 
        !          3767: #ifdef DEBUG
        !          3768:        fprintf(msgs, "put_next_attr_seq (out) buf= %x, ptr= %x\n",list_buffer, list_ptr);
        !          3769: #endif DEBUG
        !          3770: 
        !          3771:        return(-1);
        !          3772: }
        !          3773: 
        !          3774: put_last_attribute_sequence(conn)
        !          3775: CourierConnection *conn;
        !          3776: {
        !          3777: 
        !          3778:        int ocount;
        !          3779:        Cardinal zero= 0, lastseg= (Cardinal) lastSegment;
        !          3780: 
        !          3781:        if ( (list_ptr + (sizeof_Cardinal(0) * 3)) > list_end ) {
        !          3782: #ifdef DEBUG
        !          3783:        fprintf(msgs,"put_last writing %d bulk data\n",list_ptr-list_buffer);
        !          3784: #endif DEBUG
        !          3785:                if ( (ocount= BDTwrite(conn, list_buffer, (list_ptr-list_buffer)*sizeof(Cardinal))) <= 0 ) {
        !          3786:                        list_ptr= list_buffer;
        !          3787:                        BDTabort(conn);
        !          3788:                        ReturnTransferError(FILING_aborted);
        !          3789:                        /* NOT REACHED */
        !          3790:                }
        !          3791:                list_ptr= list_buffer;
        !          3792:        }
        !          3793: 
        !          3794:        list_ptr+= externalize_Cardinal(&lastseg, list_ptr);
        !          3795:        list_ptr+= externalize_Cardinal(&zero, list_ptr);
        !          3796: 
        !          3797: #ifdef DEBUG
        !          3798:        fprintf(msgs,"put_last writing %d bulk data\n",list_ptr-list_buffer);
        !          3799: #endif DEBUG
        !          3800:        if ( (ocount= BDTwrite(conn, list_buffer, (list_ptr-list_buffer)*sizeof(Cardinal))) <= 0 ) {
        !          3801:                list_ptr= list_buffer;
        !          3802:                BDTabort(conn);
        !          3803:                ReturnTransferError(FILING_aborted);
        !          3804:                /* NOT REACHED */
        !          3805:        }
        !          3806: 
        !          3807:        list_ptr= list_buffer;
        !          3808:        return(-1);
        !          3809: }
        !          3810: 

unix.superglobalmegacorp.com

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