BSD 4_3_Tahoe development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Thu, 16 Apr 1987 05:25:13 +0000 (21:25 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Thu, 16 Apr 1987 05:25:13 +0000 (21:25 -0800)
Work on file usr/src/new/xns/examples/filing_common/VPsupport.c

Synthesized-from: CSRG/cd2/4.3tahoe

usr/src/new/xns/examples/filing_common/VPsupport.c [new file with mode: 0644]

diff --git a/usr/src/new/xns/examples/filing_common/VPsupport.c b/usr/src/new/xns/examples/filing_common/VPsupport.c
new file mode 100644 (file)
index 0000000..851461c
--- /dev/null
@@ -0,0 +1,376 @@
+#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));
+
+}