|
|
1.1 root 1: #ifndef lint
2: static char *rcsid = "$Header: VPsupport.c,v 1.3 87/04/16 15:24:53 ed Exp $";
3: #endif lint
4:
5: /*
6: * Copyright (c) 1986, 1987 Xerox Corporation.
7: */
8:
9: /* $Log: VPsupport.c,v $
10: * Revision 1.3 87/04/16 15:24:53 ed
11: * Some machines prefer large arrays to be static.
12: *
13: * Revision 1.2 87/04/01 10:08:39 ed
14: * Added GetSizeAttribute.
15: *
16: * Revision 1.1 87/03/18 08:42:28 ed
17: * Initial revision
18: *
19: */
20:
21: /*
22: * support routines for dealing with Viewpoint related files on Unix
23: * files are formatted as
24: * header ("viewpoint-files/xerox")
25: * int attribute_length (byte length of attribute sequence to follow)
26: * Sequence of attributes
27: * file content
28: * will be serialized data if isDirectory value is TRUE
29: */
30:
31: #include <stdio.h>
32: #include <sys/types.h>
33: #include <sys/stat.h>
34: #include <netns/ns.h>
35: #include <netns/sp.h>
36: #ifdef FILING4
37: #include "filingV4.h"
38: #endif FILING4
39: #ifdef FILING5
40: #include "filingV5.h"
41: #endif FILING5
42: #ifdef FILING6
43: #include "filingV6.h"
44: #endif FILING6
45: #ifdef FILINGSUBSET1
46: #include "filingsubsetV1.h"
47: #endif FILINGSUBSET1
48: #include <xnscourier/filetypes.h>
49:
50: Boolean isValidAttr(t)
51: FILING_AttributeType t;
52: {
53: /*
54: * Following are service specific and therefore irrelevant
55: * (what are 24 and 25 ??)
56: */
57: if ( (t == FILING_fileID) || (t == FILING_numberOfChildren) ||
58: (t == FILING_parentID) || (t == FILING_storedSize) ||
59: (t == FILING_subtreeSize) || (t == 24) || (t == 25) )
60: return(FALSE);
61:
62: /*
63: * Following are retained locally and may be in conflict
64: * (i.e., name/pathname/position/version) so they are in effect replaced
65: */
66: if ( (t == FILING_createdOn) || (t == FILING_dataSize) ||
67: (t == FILING_isDirectory) ||
68: (t == FILING_modifiedOn) || (t == FILING_name) ||
69: (t == FILING_pathname) || (t == FILING_position) ||
70: (t == FILING_type) || (t == FILING_version) )
71: return(FALSE);
72:
73: return(TRUE);
74: }
75:
76: SaveExtendedAttributes(file, attr)
77: FILE *file;
78: FILING_AttributeSequence attr;
79:
80: {
81: int i, count, pos;
82: int attr_size;
83: Cardinal sequence_count;
84: FILING_AttributeType t;
85: static Unspecified buffer[MAX_SEQUENCE_LENGTH];
86:
87: attr_size= sequence_count= 0;
88:
89: fprintf(file, VPHDR);
90: attr_size= FILING_sizeof_AttributeSequence(&attr) * sizeof(Unspecified);
91: fwrite(&attr_size, sizeof(attr_size), 1, file);
92: fwrite(&attr.length, sizeof(Cardinal), 1, file);
93:
94: for ( i= 0; i < attr.length; i++ ) {
95: t= attr.sequence[i].type;
96:
97: count= FILING_externalize_Attribute(&attr.sequence[i], buffer);
98: fwrite(buffer, sizeof(Unspecified), count, file);
99: }
100:
101: return(attr_size);
102: }
103:
104: GetExtendedAttributes(file,attrptr)
105: FILE *file;
106: char **attrptr;
107: {
108: int size, count;
109: char *buffer, *malloc();
110: char hdr[50];
111:
112: fread(hdr, sizeof(char), strlen(VPHDR), file);
113: fread(&size, sizeof(size), 1, file);
114:
115: if ( (buffer= malloc(size)) == 0 ) {
116: return(0);
117: }
118:
119: if ( (count= fread(buffer, sizeof(char), size, file)) == 0 ) {
120: return(0);
121: }
122:
123: if ( count != size ) {
124: return(0);
125: }
126: *attrptr= buffer;
127: return(count);
128: }
129:
130: FreeExtendedAttributes(attrptr)
131: char *attrptr;
132: {
133: if ( attrptr != 0 )
134: free(attrptr);
135: }
136:
137: AddAllExtendedAttributes(file, attrseq)
138: FILE *file;
139: FILING_AttributeSequence *attrseq;
140: {
141: int attr_size, size, index, i;
142: Unspecified *buffer, *unptr;
143: Cardinal sequence_count= 0;
144: FILING_AttributeType t;
145:
146: if ( ftell(file) != 0 )
147: rewind(file); /* to be sure */
148:
149: if ( (attr_size= GetExtendedAttributes(file, &buffer)) == 0 ) {
150: return(0);
151: }
152:
153: unptr= (Unspecified *) buffer;
154: sequence_count= *unptr;
155: unptr ++;
156:
157: index= attrseq->length;
158:
159: for ( i= 0; i < sequence_count ; i++ ) {
160: size= FILING_internalize_Attribute(&(attrseq->sequence[index]), unptr);
161: t= attrseq->sequence[index].type;
162: if ( isValidAttr(t) )
163: index++;
164:
165: unptr += size;
166: }
167:
168: attrseq->length= index;
169:
170: FreeExtendedAttributes(buffer);
171: return(-1);
172: }
173:
174: AddExtendedStoreAttributes(file, attrseq)
175: FILE *file;
176: FILING_AttributeSequence *attrseq;
177:
178: {
179: int attr_size, size, index, i;
180: Unspecified *buffer, *unptr;
181: Cardinal sequence_count= 0;
182: FILING_AttributeType t;
183:
184: if ( ftell(file) != 0 )
185: rewind(file); /* to be sure */
186:
187: if ( (attr_size= GetExtendedAttributes(file,&buffer)) == 0 )
188: return(0);
189:
190: unptr= (Unspecified *) buffer;
191: sequence_count= *unptr;
192: unptr++;
193:
194: index= attrseq->length;
195:
196: for ( i= 0; i < sequence_count; i++ ) {
197: size= FILING_internalize_Attribute(&(attrseq->sequence[index]), unptr);
198: t= attrseq->sequence[index].type;
199:
200: if ( (isValidAttr(t)) && (t != FILING_modifiedBy) &&
201: (t != FILING_readBy) && (t != FILING_readOn) &&
202: (t != FILING_type) ) {
203: index++;
204: }
205: unptr+= size;
206: }
207:
208: attrseq->length= index;
209:
210: FreeExtendedAttributes(buffer);
211: return(-1);
212: }
213:
214: AddExtendedDeserializeAttributes(file, attrseq)
215: FILE *file;
216: FILING_AttributeSequence *attrseq;
217:
218: {
219: int attr_size, size, index, i;
220: Unspecified *buffer, *unptr;
221: Cardinal sequence_count= 0;
222: FILING_AttributeType t;
223:
224: if ( ftell(file) != 0 )
225: rewind(file); /* to be sure */
226:
227: if ( (attr_size= GetExtendedAttributes(file,&buffer)) == 0 )
228: return(0);
229:
230: unptr= buffer;
231: sequence_count= *unptr;
232: unptr++;
233:
234: index= attrseq->length;
235:
236: for ( i= 0; i < sequence_count; i++ ) {
237: size= FILING_internalize_Attribute(&(attrseq->sequence[index]), unptr);
238: t= attrseq->sequence[index].type;
239: /*
240: * omit attributes which are illegal on Deserialize
241: */
242:
243: if ( (isValidAttr(t)) && (t != FILING_checksum) &&
244: (t != FILING_childrenUniquelyNamed) &&
245: (t != FILING_createdBy) &&
246: (t != FILING_modifiedBy) &&
247: (t != FILING_ordering) &&
248: (t != FILING_readBy) &&
249: (t != FILING_readOn) ) {
250: index++;
251: }
252: unptr+= size;
253: }
254:
255: attrseq->length= index;
256:
257: FreeExtendedAttributes(buffer);
258: return(-1);
259: }
260:
261: Boolean GetDirectoryAttribute(file)
262: FILE *file;
263:
264: {
265: int i;
266: Unspecified *buffer, *unptr;
267: int attr_size;
268: Boolean dirval;
269: Cardinal sequence_count= 0;
270: FILING_Attribute attribute;
271:
272: dirval= FALSE;
273:
274: if ( ftell(file) != 0 )
275: rewind(file); /* back to beginning */
276:
277: if ( (attr_size= GetExtendedAttributes(file,&buffer)) == 0 ) {
278: return(FALSE);
279: }
280:
281: unptr= buffer;
282: sequence_count= *unptr;
283: unptr++;
284:
285: for ( i= 0; i < sequence_count; i++ ){
286: unptr+= FILING_internalize_Attribute(&attribute, unptr);
287: if ( attribute.type == FILING_isDirectory ) {
288: dirval= AttrToBoolean(&attribute);
289: break;
290: }
291: }
292:
293: FreeExtendedAttributes(buffer);
294: return(dirval);
295: }
296:
297: LongCardinal GetTypeAttribute(file)
298: FILE *file;
299:
300: {
301: int i;
302: Unspecified *buffer, *unptr;
303: LongCardinal filetype, attr_size;
304: FILING_Attribute attribute;
305: Cardinal sequence_count= 0;
306:
307: filetype= TYPE_I;
308:
309: if ( ftell(file) != 0 )
310: rewind(file); /* back to beginning */
311:
312: if ( (attr_size= GetExtendedAttributes(file, &buffer)) == 0 ) {
313: return(TYPE_I);
314: }
315:
316: unptr= buffer;
317: sequence_count= *unptr;
318: unptr++;
319:
320: for ( i= 0; i < sequence_count; i++ ) {
321: unptr+= FILING_internalize_Attribute(&attribute, unptr);
322: if ( attribute.type == FILING_type ) {
323: filetype= AttrToLongCardinal(&attribute);
324: break;
325: }
326: }
327:
328: FreeExtendedAttributes(buffer);
329: return(filetype);
330: }
331:
332: LongCardinal GetSizeAttribute(file)
333: FILE *file;
334:
335: {
336: int i;
337: Unspecified *buffer, *unptr;
338: LongCardinal filesize, attr_size;
339: FILING_Attribute attribute;
340: Cardinal sequence_count= 0;
341:
342: filesize= 0;
343:
344: if ( ftell(file) != 0 )
345: rewind(file); /* back to beginning */
346:
347: if ( (attr_size= GetExtendedAttributes(file, &buffer)) == 0 ) {
348: return(filesize);
349: }
350:
351: unptr= buffer;
352: sequence_count= *unptr;
353: unptr++;
354:
355: for ( i= 0; i < sequence_count; i++ ) {
356: unptr+= FILING_internalize_Attribute(&attribute, unptr);
357: if ( attribute.type == FILING_dataSize ) {
358: filesize= AttrToLongCardinal(&attribute);
359: break;
360: }
361: }
362:
363: FreeExtendedAttributes(buffer);
364: return(filesize);
365: }
366:
367: PositionAfterExtendedAttributes(file)
368: FILE *file;
369: {
370: int size;
371:
372: fseek(file, strlen(VPHDR), 0);
373: fread(&size, sizeof(size), 1, file);
374: return (fseek(file, (long) size, 1));
375:
376: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.