/[pearpc]/src/io/prom/fs/hfs/record.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /src/io/prom/fs/hfs/record.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (hide annotations)
Wed Sep 5 17:11:21 2007 UTC (16 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 15692 byte(s)
import upstream CVS
1 dpavlin 1 /*
2     * libhfs - library for reading and writing Macintosh HFS volumes
3     * Copyright (C) 1996-1998 Robert Leslie
4     *
5     * This program is free software; you can redistribute it and/or modify
6     * it under the terms of the GNU General Public License as published by
7     * the Free Software Foundation; either version 2 of the License, or
8     * (at your option) any later version.
9     *
10     * This program is distributed in the hope that it will be useful,
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     * GNU General Public License for more details.
14     *
15     * You should have received a copy of the GNU General Public License
16     * along with this program; if not, write to the Free Software
17     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18     *
19     */
20    
21     # ifdef HAVE_CONFIG_H
22     # include "config.h"
23     # endif
24    
25     # include <string.h>
26    
27     # include "libhfs.h"
28     # include "record.h"
29     # include "data.h"
30    
31     /*
32     * NAME: record->packcatkey()
33     * DESCRIPTION: pack a catalog record key
34     */
35     void r_packcatkey(const CatKeyRec *key, byte *pkey, unsigned int *len)
36     {
37     const byte *start = pkey;
38    
39     d_storesb(&pkey, key->ckrKeyLen);
40     d_storesb(&pkey, key->ckrResrv1);
41     d_storeul(&pkey, key->ckrParID);
42    
43     d_storestr(&pkey, key->ckrCName, sizeof(key->ckrCName));
44    
45     if (len)
46     *len = HFS_RECKEYSKIP(start);
47     }
48    
49     /*
50     * NAME: record->unpackcatkey()
51     * DESCRIPTION: unpack a catalog record key
52     */
53     void r_unpackcatkey(const byte *pkey, CatKeyRec *key)
54     {
55     d_fetchsb(&pkey, &key->ckrKeyLen);
56     d_fetchsb(&pkey, &key->ckrResrv1);
57     d_fetchul(&pkey, &key->ckrParID);
58    
59     d_fetchstr(&pkey, key->ckrCName, sizeof(key->ckrCName));
60     }
61    
62     /*
63     * NAME: record->packextkey()
64     * DESCRIPTION: pack an extents record key
65     */
66     void r_packextkey(const ExtKeyRec *key, byte *pkey, unsigned int *len)
67     {
68     const byte *start = pkey;
69    
70     d_storesb(&pkey, key->xkrKeyLen);
71     d_storesb(&pkey, key->xkrFkType);
72     d_storeul(&pkey, key->xkrFNum);
73     d_storeuw(&pkey, key->xkrFABN);
74    
75     if (len)
76     *len = HFS_RECKEYSKIP(start);
77     }
78    
79     /*
80     * NAME: record->unpackextkey()
81     * DESCRIPTION: unpack an extents record key
82     */
83     void r_unpackextkey(const byte *pkey, ExtKeyRec *key)
84     {
85     d_fetchsb(&pkey, &key->xkrKeyLen);
86     d_fetchsb(&pkey, &key->xkrFkType);
87     d_fetchul(&pkey, &key->xkrFNum);
88     d_fetchuw(&pkey, &key->xkrFABN);
89     }
90    
91     /*
92     * NAME: record->comparecatkeys()
93     * DESCRIPTION: compare two (packed) catalog record keys
94     */
95     int r_comparecatkeys(const CatKeyRec *key1, const CatKeyRec *key2)
96     {
97     int diff;
98    
99     diff = key1->ckrParID - key2->ckrParID;
100     if (diff)
101     return diff;
102    
103     return d_relstring(key1->ckrCName, key2->ckrCName);
104     }
105    
106     /*
107     * NAME: record->compareextkeys()
108     * DESCRIPTION: compare two (packed) extents record keys
109     */
110     int r_compareextkeys(const ExtKeyRec *key1, const ExtKeyRec *key2)
111     {
112     int diff;
113    
114     diff = key1->xkrFNum - key2->xkrFNum;
115     if (diff)
116     return diff;
117    
118     diff = (unsigned char) key1->xkrFkType -
119     (unsigned char) key2->xkrFkType;
120     if (diff)
121     return diff;
122    
123     return key1->xkrFABN - key2->xkrFABN;
124     }
125    
126     /*
127     * NAME: record->packcatdata()
128     * DESCRIPTION: pack catalog record data
129     */
130     void r_packcatdata(const CatDataRec *data, byte *pdata, unsigned int *len)
131     {
132     const byte *start = pdata;
133     int i;
134    
135     d_storesb(&pdata, data->cdrType);
136     d_storesb(&pdata, data->cdrResrv2);
137    
138     switch (data->cdrType)
139     {
140     case cdrDirRec:
141     d_storesw(&pdata, data->u.dir.dirFlags);
142     d_storeuw(&pdata, data->u.dir.dirVal);
143     d_storeul(&pdata, data->u.dir.dirDirID);
144     d_storesl(&pdata, data->u.dir.dirCrDat);
145     d_storesl(&pdata, data->u.dir.dirMdDat);
146     d_storesl(&pdata, data->u.dir.dirBkDat);
147    
148     d_storesw(&pdata, data->u.dir.dirUsrInfo.frRect.top);
149     d_storesw(&pdata, data->u.dir.dirUsrInfo.frRect.left);
150     d_storesw(&pdata, data->u.dir.dirUsrInfo.frRect.bottom);
151     d_storesw(&pdata, data->u.dir.dirUsrInfo.frRect.right);
152     d_storesw(&pdata, data->u.dir.dirUsrInfo.frFlags);
153     d_storesw(&pdata, data->u.dir.dirUsrInfo.frLocation.v);
154     d_storesw(&pdata, data->u.dir.dirUsrInfo.frLocation.h);
155     d_storesw(&pdata, data->u.dir.dirUsrInfo.frView);
156    
157     d_storesw(&pdata, data->u.dir.dirFndrInfo.frScroll.v);
158     d_storesw(&pdata, data->u.dir.dirFndrInfo.frScroll.h);
159     d_storesl(&pdata, data->u.dir.dirFndrInfo.frOpenChain);
160     d_storesw(&pdata, data->u.dir.dirFndrInfo.frUnused);
161     d_storesw(&pdata, data->u.dir.dirFndrInfo.frComment);
162     d_storesl(&pdata, data->u.dir.dirFndrInfo.frPutAway);
163    
164     for (i = 0; i < 4; ++i)
165     d_storesl(&pdata, data->u.dir.dirResrv[i]);
166    
167     break;
168    
169     case cdrFilRec:
170     d_storesb(&pdata, data->u.fil.filFlags);
171     d_storesb(&pdata, data->u.fil.filTyp);
172    
173     d_storesl(&pdata, data->u.fil.filUsrWds.fdType);
174     d_storesl(&pdata, data->u.fil.filUsrWds.fdCreator);
175     d_storesw(&pdata, data->u.fil.filUsrWds.fdFlags);
176     d_storesw(&pdata, data->u.fil.filUsrWds.fdLocation.v);
177     d_storesw(&pdata, data->u.fil.filUsrWds.fdLocation.h);
178     d_storesw(&pdata, data->u.fil.filUsrWds.fdFldr);
179    
180     d_storeul(&pdata, data->u.fil.filFlNum);
181    
182     d_storeuw(&pdata, data->u.fil.filStBlk);
183     d_storeul(&pdata, data->u.fil.filLgLen);
184     d_storeul(&pdata, data->u.fil.filPyLen);
185    
186     d_storeuw(&pdata, data->u.fil.filRStBlk);
187     d_storeul(&pdata, data->u.fil.filRLgLen);
188     d_storeul(&pdata, data->u.fil.filRPyLen);
189    
190     d_storesl(&pdata, data->u.fil.filCrDat);
191     d_storesl(&pdata, data->u.fil.filMdDat);
192     d_storesl(&pdata, data->u.fil.filBkDat);
193    
194     d_storesw(&pdata, data->u.fil.filFndrInfo.fdIconID);
195     for (i = 0; i < 4; ++i)
196     d_storesw(&pdata, data->u.fil.filFndrInfo.fdUnused[i]);
197     d_storesw(&pdata, data->u.fil.filFndrInfo.fdComment);
198     d_storesl(&pdata, data->u.fil.filFndrInfo.fdPutAway);
199    
200     d_storeuw(&pdata, data->u.fil.filClpSize);
201    
202     for (i = 0; i < 3; ++i)
203     {
204     d_storeuw(&pdata, data->u.fil.filExtRec[i].xdrStABN);
205     d_storeuw(&pdata, data->u.fil.filExtRec[i].xdrNumABlks);
206     }
207    
208     for (i = 0; i < 3; ++i)
209     {
210     d_storeuw(&pdata, data->u.fil.filRExtRec[i].xdrStABN);
211     d_storeuw(&pdata, data->u.fil.filRExtRec[i].xdrNumABlks);
212     }
213    
214     d_storesl(&pdata, data->u.fil.filResrv);
215    
216     break;
217    
218     case cdrThdRec:
219     for (i = 0; i < 2; ++i)
220     d_storesl(&pdata, data->u.dthd.thdResrv[i]);
221    
222     d_storeul(&pdata, data->u.dthd.thdParID);
223    
224     d_storestr(&pdata, data->u.dthd.thdCName,
225     sizeof(data->u.dthd.thdCName));
226    
227     break;
228    
229     case cdrFThdRec:
230     for (i = 0; i < 2; ++i)
231     d_storesl(&pdata, data->u.fthd.fthdResrv[i]);
232    
233     d_storeul(&pdata, data->u.fthd.fthdParID);
234    
235     d_storestr(&pdata, data->u.fthd.fthdCName,
236     sizeof(data->u.fthd.fthdCName));
237    
238     break;
239    
240     default:
241     ASSERT(0);
242     }
243    
244     if (len)
245     *len += pdata - start;
246     }
247    
248     /*
249     * NAME: record->unpackcatdata()
250     * DESCRIPTION: unpack catalog record data
251     */
252     void r_unpackcatdata(const byte *pdata, CatDataRec *data)
253     {
254     int i;
255    
256     d_fetchsb(&pdata, &data->cdrType);
257     d_fetchsb(&pdata, &data->cdrResrv2);
258    
259     switch (data->cdrType)
260     {
261     case cdrDirRec:
262     d_fetchsw(&pdata, &data->u.dir.dirFlags);
263     d_fetchuw(&pdata, &data->u.dir.dirVal);
264     d_fetchul(&pdata, &data->u.dir.dirDirID);
265     d_fetchsl(&pdata, &data->u.dir.dirCrDat);
266     d_fetchsl(&pdata, &data->u.dir.dirMdDat);
267     d_fetchsl(&pdata, &data->u.dir.dirBkDat);
268    
269     d_fetchsw(&pdata, &data->u.dir.dirUsrInfo.frRect.top);
270     d_fetchsw(&pdata, &data->u.dir.dirUsrInfo.frRect.left);
271     d_fetchsw(&pdata, &data->u.dir.dirUsrInfo.frRect.bottom);
272     d_fetchsw(&pdata, &data->u.dir.dirUsrInfo.frRect.right);
273     d_fetchsw(&pdata, &data->u.dir.dirUsrInfo.frFlags);
274     d_fetchsw(&pdata, &data->u.dir.dirUsrInfo.frLocation.v);
275     d_fetchsw(&pdata, &data->u.dir.dirUsrInfo.frLocation.h);
276     d_fetchsw(&pdata, &data->u.dir.dirUsrInfo.frView);
277    
278     d_fetchsw(&pdata, &data->u.dir.dirFndrInfo.frScroll.v);
279     d_fetchsw(&pdata, &data->u.dir.dirFndrInfo.frScroll.h);
280     d_fetchsl(&pdata, &data->u.dir.dirFndrInfo.frOpenChain);
281     d_fetchsw(&pdata, &data->u.dir.dirFndrInfo.frUnused);
282     d_fetchsw(&pdata, &data->u.dir.dirFndrInfo.frComment);
283     d_fetchsl(&pdata, &data->u.dir.dirFndrInfo.frPutAway);
284    
285     for (i = 0; i < 4; ++i)
286     d_fetchsl(&pdata, &data->u.dir.dirResrv[i]);
287    
288     break;
289    
290     case cdrFilRec:
291     d_fetchsb(&pdata, &data->u.fil.filFlags);
292     d_fetchsb(&pdata, &data->u.fil.filTyp);
293    
294     d_fetchsl(&pdata, &data->u.fil.filUsrWds.fdType);
295     d_fetchsl(&pdata, &data->u.fil.filUsrWds.fdCreator);
296     d_fetchsw(&pdata, &data->u.fil.filUsrWds.fdFlags);
297     d_fetchsw(&pdata, &data->u.fil.filUsrWds.fdLocation.v);
298     d_fetchsw(&pdata, &data->u.fil.filUsrWds.fdLocation.h);
299     d_fetchsw(&pdata, &data->u.fil.filUsrWds.fdFldr);
300    
301     d_fetchul(&pdata, &data->u.fil.filFlNum);
302    
303     d_fetchuw(&pdata, &data->u.fil.filStBlk);
304     d_fetchul(&pdata, &data->u.fil.filLgLen);
305     d_fetchul(&pdata, &data->u.fil.filPyLen);
306    
307     d_fetchuw(&pdata, &data->u.fil.filRStBlk);
308     d_fetchul(&pdata, &data->u.fil.filRLgLen);
309     d_fetchul(&pdata, &data->u.fil.filRPyLen);
310    
311     d_fetchsl(&pdata, &data->u.fil.filCrDat);
312     d_fetchsl(&pdata, &data->u.fil.filMdDat);
313     d_fetchsl(&pdata, &data->u.fil.filBkDat);
314    
315     d_fetchsw(&pdata, &data->u.fil.filFndrInfo.fdIconID);
316     for (i = 0; i < 4; ++i)
317     d_fetchsw(&pdata, &data->u.fil.filFndrInfo.fdUnused[i]);
318     d_fetchsw(&pdata, &data->u.fil.filFndrInfo.fdComment);
319     d_fetchsl(&pdata, &data->u.fil.filFndrInfo.fdPutAway);
320    
321     d_fetchuw(&pdata, &data->u.fil.filClpSize);
322    
323     for (i = 0; i < 3; ++i)
324     {
325     d_fetchuw(&pdata, &data->u.fil.filExtRec[i].xdrStABN);
326     d_fetchuw(&pdata, &data->u.fil.filExtRec[i].xdrNumABlks);
327     }
328    
329     for (i = 0; i < 3; ++i)
330     {
331     d_fetchuw(&pdata, &data->u.fil.filRExtRec[i].xdrStABN);
332     d_fetchuw(&pdata, &data->u.fil.filRExtRec[i].xdrNumABlks);
333     }
334    
335     d_fetchsl(&pdata, &data->u.fil.filResrv);
336    
337     break;
338    
339     case cdrThdRec:
340     for (i = 0; i < 2; ++i)
341     d_fetchsl(&pdata, &data->u.dthd.thdResrv[i]);
342    
343     d_fetchul(&pdata, &data->u.dthd.thdParID);
344    
345     d_fetchstr(&pdata, data->u.dthd.thdCName,
346     sizeof(data->u.dthd.thdCName));
347    
348     break;
349    
350     case cdrFThdRec:
351     for (i = 0; i < 2; ++i)
352     d_fetchsl(&pdata, &data->u.fthd.fthdResrv[i]);
353    
354     d_fetchul(&pdata, &data->u.fthd.fthdParID);
355    
356     d_fetchstr(&pdata, data->u.fthd.fthdCName,
357     sizeof(data->u.fthd.fthdCName));
358    
359     break;
360    
361     default:
362     ASSERT(0);
363     }
364     }
365    
366     /*
367     * NAME: record->packextdata()
368     * DESCRIPTION: pack extent record data
369     */
370     void r_packextdata(const ExtDataRec *data, byte *pdata, unsigned int *len)
371     {
372     const byte *start = pdata;
373     int i;
374    
375     for (i = 0; i < 3; ++i)
376     {
377     d_storeuw(&pdata, (*data)[i].xdrStABN);
378     d_storeuw(&pdata, (*data)[i].xdrNumABlks);
379     }
380    
381     if (len)
382     *len += pdata - start;
383     }
384    
385     /*
386     * NAME: record->unpackextdata()
387     * DESCRIPTION: unpack extent record data
388     */
389     void r_unpackextdata(const byte *pdata, ExtDataRec *data)
390     {
391     int i;
392    
393     for (i = 0; i < 3; ++i)
394     {
395     d_fetchuw(&pdata, &(*data)[i].xdrStABN);
396     d_fetchuw(&pdata, &(*data)[i].xdrNumABlks);
397     }
398     }
399    
400     /*
401     * NAME: record->makecatkey()
402     * DESCRIPTION: construct a catalog record key
403     */
404     void r_makecatkey(CatKeyRec *key, unsigned long parid, const char *name)
405     {
406     int len;
407    
408     len = strlen(name) + 1;
409    
410     key->ckrKeyLen = 0x05 + len + (len & 1);
411     key->ckrResrv1 = 0;
412     key->ckrParID = parid;
413    
414     strcpy(key->ckrCName, name);
415     }
416    
417     /*
418     * NAME: record->makeextkey()
419     * DESCRIPTION: construct an extents record key
420     */
421     void r_makeextkey(ExtKeyRec *key,
422     int fork, unsigned long fnum, unsigned int fabn)
423     {
424     key->xkrKeyLen = 0x07;
425     key->xkrFkType = fork;
426     key->xkrFNum = fnum;
427     key->xkrFABN = fabn;
428     }
429    
430     /*
431     * NAME: record->packcatrec()
432     * DESCRIPTION: create a packed catalog record
433     */
434     void r_packcatrec(const CatKeyRec *key, const CatDataRec *data,
435     byte *precord, unsigned int *len)
436     {
437     r_packcatkey(key, precord, len);
438     r_packcatdata(data, HFS_RECDATA(precord), len);
439     }
440    
441     /*
442     * NAME: record->packextrec()
443     * DESCRIPTION: create a packed extents record
444     */
445     void r_packextrec(const ExtKeyRec *key, const ExtDataRec *data,
446     byte *precord, unsigned int *len)
447     {
448     r_packextkey(key, precord, len);
449     r_packextdata(data, HFS_RECDATA(precord), len);
450     }
451    
452     /*
453     * NAME: record->packdirent()
454     * DESCRIPTION: make changes to a catalog record
455     */
456     void r_packdirent(CatDataRec *data, const hfsdirent *ent)
457     {
458     switch (data->cdrType)
459     {
460     case cdrDirRec:
461     data->u.dir.dirCrDat = d_mtime(ent->crdate);
462     data->u.dir.dirMdDat = d_mtime(ent->mddate);
463     data->u.dir.dirBkDat = d_mtime(ent->bkdate);
464    
465     data->u.dir.dirUsrInfo.frFlags = ent->fdflags;
466     data->u.dir.dirUsrInfo.frLocation.v = ent->fdlocation.v;
467     data->u.dir.dirUsrInfo.frLocation.h = ent->fdlocation.h;
468    
469     data->u.dir.dirUsrInfo.frRect.top = ent->u.dir.rect.top;
470     data->u.dir.dirUsrInfo.frRect.left = ent->u.dir.rect.left;
471     data->u.dir.dirUsrInfo.frRect.bottom = ent->u.dir.rect.bottom;
472     data->u.dir.dirUsrInfo.frRect.right = ent->u.dir.rect.right;
473    
474     break;
475    
476     case cdrFilRec:
477     if (ent->flags & HFS_ISLOCKED)
478     data->u.fil.filFlags |= (1 << 0);
479     else
480     data->u.fil.filFlags &= ~(1 << 0);
481    
482     data->u.fil.filCrDat = d_mtime(ent->crdate);
483     data->u.fil.filMdDat = d_mtime(ent->mddate);
484     data->u.fil.filBkDat = d_mtime(ent->bkdate);
485    
486     data->u.fil.filUsrWds.fdFlags = ent->fdflags;
487     data->u.fil.filUsrWds.fdLocation.v = ent->fdlocation.v;
488     data->u.fil.filUsrWds.fdLocation.h = ent->fdlocation.h;
489    
490     data->u.fil.filUsrWds.fdType =
491     d_getsl((const unsigned char *) ent->u.file.type);
492     data->u.fil.filUsrWds.fdCreator =
493     d_getsl((const unsigned char *) ent->u.file.creator);
494    
495     break;
496     }
497     }
498    
499     /*
500     * NAME: record->unpackdirent()
501     * DESCRIPTION: unpack catalog information into hfsdirent structure
502     */
503     void r_unpackdirent(unsigned long parid, const char *name,
504     const CatDataRec *data, hfsdirent *ent)
505     {
506     strcpy(ent->name, name);
507     ent->parid = parid;
508    
509     switch (data->cdrType)
510     {
511     case cdrDirRec:
512     ent->flags = HFS_ISDIR;
513     ent->cnid = data->u.dir.dirDirID;
514    
515     ent->crdate = d_ltime(data->u.dir.dirCrDat);
516     ent->mddate = d_ltime(data->u.dir.dirMdDat);
517     ent->bkdate = d_ltime(data->u.dir.dirBkDat);
518    
519     ent->fdflags = data->u.dir.dirUsrInfo.frFlags;
520     ent->fdlocation.v = data->u.dir.dirUsrInfo.frLocation.v;
521     ent->fdlocation.h = data->u.dir.dirUsrInfo.frLocation.h;
522    
523     ent->u.dir.valence = data->u.dir.dirVal;
524    
525     ent->u.dir.rect.top = data->u.dir.dirUsrInfo.frRect.top;
526     ent->u.dir.rect.left = data->u.dir.dirUsrInfo.frRect.left;
527     ent->u.dir.rect.bottom = data->u.dir.dirUsrInfo.frRect.bottom;
528     ent->u.dir.rect.right = data->u.dir.dirUsrInfo.frRect.right;
529    
530     break;
531    
532     case cdrFilRec:
533     ent->flags = (data->u.fil.filFlags & (1 << 0)) ? HFS_ISLOCKED : 0;
534     ent->cnid = data->u.fil.filFlNum;
535    
536     ent->crdate = d_ltime(data->u.fil.filCrDat);
537     ent->mddate = d_ltime(data->u.fil.filMdDat);
538     ent->bkdate = d_ltime(data->u.fil.filBkDat);
539    
540     ent->fdflags = data->u.fil.filUsrWds.fdFlags;
541     ent->fdlocation.v = data->u.fil.filUsrWds.fdLocation.v;
542     ent->fdlocation.h = data->u.fil.filUsrWds.fdLocation.h;
543    
544     ent->u.file.dsize = data->u.fil.filLgLen;
545     ent->u.file.rsize = data->u.fil.filRLgLen;
546    
547     d_putsl((unsigned char *) ent->u.file.type,
548     data->u.fil.filUsrWds.fdType);
549     d_putsl((unsigned char *) ent->u.file.creator,
550     data->u.fil.filUsrWds.fdCreator);
551    
552     ent->u.file.type[4] = ent->u.file.creator[4] = 0;
553    
554     break;
555     }
556     }

  ViewVC Help
Powered by ViewVC 1.1.26