📄 vpsupport.c
字号:
#ifndef lintstatic 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));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -