#ifndef lint static char *rcsid = "$Header: VPsupport.c,v 1.3 87/04/16 15:24:53 ed Exp $"; #endif lint /* * Copyright (c) 1986, 1987 Xerox Corporation. */ /* $Log: VPsupport.c,v $ * Revision 1.3 87/04/16 15:24:53 ed * Some machines prefer large arrays to be static. * * Revision 1.2 87/04/01 10:08:39 ed * Added GetSizeAttribute. * * Revision 1.1 87/03/18 08:42:28 ed * Initial revision * */ /* * support routines for dealing with Viewpoint related files on Unix * files are formatted as * header ("viewpoint-files/xerox") * int attribute_length (byte length of attribute sequence to follow) * Sequence of attributes * file content * will be serialized data if isDirectory value is TRUE */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <netns/ns.h> #include <netns/sp.h> #ifdef FILING4 #include "filingV4.h" #endif FILING4 #ifdef FILING5 #include "filingV5.h" #endif FILING5 #ifdef FILING6 #include "filingV6.h" #endif FILING6 #ifdef FILINGSUBSET1 #include "filingsubsetV1.h" #endif FILINGSUBSET1 #include <xnscourier/filetypes.h> Boolean isValidAttr(t) FILING_AttributeType t; { /* * Following are service specific and therefore irrelevant * (what are 24 and 25 ??) */ if ( (t == FILING_fileID) || (t == FILING_numberOfChildren) || (t == FILING_parentID) || (t == FILING_storedSize) || (t == FILING_subtreeSize) || (t == 24) || (t == 25) ) return(FALSE); /* * Following are retained locally and may be in conflict * (i.e., name/pathname/position/version) so they are in effect replaced */ if ( (t == FILING_createdOn) || (t == FILING_dataSize) || (t == FILING_isDirectory) || (t == FILING_modifiedOn) || (t == FILING_name) || (t == FILING_pathname) || (t == FILING_position) || (t == FILING_type) || (t == FILING_version) ) return(FALSE); return(TRUE); } SaveExtendedAttributes(file, attr) FILE *file; FILING_AttributeSequence attr; { int i, count, pos; int attr_size; Cardinal sequence_count; FILING_AttributeType t; static Unspecified buffer[MAX_SEQUENCE_LENGTH]; attr_size= sequence_count= 0; fprintf(file, VPHDR); attr_size= FILING_sizeof_AttributeSequence(&attr) * sizeof(Unspecified); fwrite(&attr_size, sizeof(attr_size), 1, file); fwrite(&attr.length, sizeof(Cardinal), 1, file); for ( i= 0; i < attr.length; i++ ) { t= attr.sequence[i].type; count= FILING_externalize_Attribute(&attr.sequence[i], buffer); fwrite(buffer, sizeof(Unspecified), count, file); } return(attr_size); } GetExtendedAttributes(file,attrptr) FILE *file; char **attrptr; { int size, count; char *buffer, *malloc(); char hdr[50]; fread(hdr, sizeof(char), strlen(VPHDR), file); fread(&size, sizeof(size), 1, file); if ( (buffer= malloc(size)) == 0 ) { return(0); } if ( (count= fread(buffer, sizeof(char), size, file)) == 0 ) { return(0); } if ( count != size ) { return(0); } *attrptr= buffer; return(count); } FreeExtendedAttributes(attrptr) char *attrptr; { if ( attrptr != 0 ) free(attrptr); } AddAllExtendedAttributes(file, attrseq) FILE *file; FILING_AttributeSequence *attrseq; { int attr_size, size, index, i; Unspecified *buffer, *unptr; Cardinal sequence_count= 0; FILING_AttributeType t; if ( ftell(file) != 0 ) rewind(file); /* to be sure */ if ( (attr_size= GetExtendedAttributes(file, &buffer)) == 0 ) { return(0); } unptr= (Unspecified *) buffer; sequence_count= *unptr; unptr ++; index= attrseq->length; for ( i= 0; i < sequence_count ; i++ ) { size= FILING_internalize_Attribute(&(attrseq->sequence[index]), unptr); t= attrseq->sequence[index].type; if ( isValidAttr(t) ) index++; unptr += size; } attrseq->length= index; FreeExtendedAttributes(buffer); return(-1); } AddExtendedStoreAttributes(file, attrseq) FILE *file; FILING_AttributeSequence *attrseq; { int attr_size, size, index, i; Unspecified *buffer, *unptr; Cardinal sequence_count= 0; FILING_AttributeType t; if ( ftell(file) != 0 ) rewind(file); /* to be sure */ if ( (attr_size= GetExtendedAttributes(file,&buffer)) == 0 ) return(0); unptr= (Unspecified *) buffer; sequence_count= *unptr; unptr++; index= attrseq->length; for ( i= 0; i < sequence_count; i++ ) { size= FILING_internalize_Attribute(&(attrseq->sequence[index]), unptr); t= attrseq->sequence[index].type; if ( (isValidAttr(t)) && (t != FILING_modifiedBy) && (t != FILING_readBy) && (t != FILING_readOn) && (t != FILING_type) ) { index++; } unptr+= size; } attrseq->length= index; FreeExtendedAttributes(buffer); return(-1); } AddExtendedDeserializeAttributes(file, attrseq) FILE *file; FILING_AttributeSequence *attrseq; { int attr_size, size, index, i; Unspecified *buffer, *unptr; Cardinal sequence_count= 0; FILING_AttributeType t; if ( ftell(file) != 0 ) rewind(file); /* to be sure */ if ( (attr_size= GetExtendedAttributes(file,&buffer)) == 0 ) return(0); unptr= buffer; sequence_count= *unptr; unptr++; index= attrseq->length; for ( i= 0; i < sequence_count; i++ ) { size= FILING_internalize_Attribute(&(attrseq->sequence[index]), unptr); t= attrseq->sequence[index].type; /* * omit attributes which are illegal on Deserialize */ if ( (isValidAttr(t)) && (t != FILING_checksum) && (t != FILING_childrenUniquelyNamed) && (t != FILING_createdBy) && (t != FILING_modifiedBy) && (t != FILING_ordering) && (t != FILING_readBy) && (t != FILING_readOn) ) { index++; } unptr+= size; } attrseq->length= index; FreeExtendedAttributes(buffer); return(-1); } Boolean GetDirectoryAttribute(file) FILE *file; { int i; Unspecified *buffer, *unptr; int attr_size; Boolean dirval; Cardinal sequence_count= 0; FILING_Attribute attribute; dirval= FALSE; if ( ftell(file) != 0 ) rewind(file); /* back to beginning */ if ( (attr_size= GetExtendedAttributes(file,&buffer)) == 0 ) { return(FALSE); } unptr= buffer; sequence_count= *unptr; unptr++; for ( i= 0; i < sequence_count; i++ ){ unptr+= FILING_internalize_Attribute(&attribute, unptr); if ( attribute.type == FILING_isDirectory ) { dirval= AttrToBoolean(&attribute); break; } } FreeExtendedAttributes(buffer); return(dirval); } LongCardinal GetTypeAttribute(file) FILE *file; { int i; Unspecified *buffer, *unptr; LongCardinal filetype, attr_size; FILING_Attribute attribute; Cardinal sequence_count= 0; filetype= TYPE_I; if ( ftell(file) != 0 ) rewind(file); /* back to beginning */ if ( (attr_size= GetExtendedAttributes(file, &buffer)) == 0 ) { return(TYPE_I); } unptr= buffer; sequence_count= *unptr; unptr++; for ( i= 0; i < sequence_count; i++ ) { unptr+= FILING_internalize_Attribute(&attribute, unptr); if ( attribute.type == FILING_type ) { filetype= AttrToLongCardinal(&attribute); break; } } FreeExtendedAttributes(buffer); return(filetype); } LongCardinal GetSizeAttribute(file) FILE *file; { int i; Unspecified *buffer, *unptr; LongCardinal filesize, attr_size; FILING_Attribute attribute; Cardinal sequence_count= 0; filesize= 0; if ( ftell(file) != 0 ) rewind(file); /* back to beginning */ if ( (attr_size= GetExtendedAttributes(file, &buffer)) == 0 ) { return(filesize); } unptr= buffer; sequence_count= *unptr; unptr++; for ( i= 0; i < sequence_count; i++ ) { unptr+= FILING_internalize_Attribute(&attribute, unptr); if ( attribute.type == FILING_dataSize ) { filesize= AttrToLongCardinal(&attribute); break; } } FreeExtendedAttributes(buffer); return(filesize); } PositionAfterExtendedAttributes(file) FILE *file; { int size; fseek(file, strlen(VPHDR), 0); fread(&size, sizeof(size), 1, file); return (fseek(file, (long) size, 1)); }