/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations)
Wed Sep 5 17:11:21 2007 UTC (16 years, 6 months ago) by dpavlin
File MIME type: text/plain
File size: 15692 byte(s)
import upstream CVS
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