|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.