Lines Matching full:file

26 # include "file.h"
35 * NAME: file->selectfork()
36 * DESCRIPTION: choose a fork for file operations
38 void f_selectfork(hfsfile *file, int fork) in f_selectfork() argument
42 file->fork = fkData; in f_selectfork()
43 memcpy(file->ext, file->cat.u.fil.filExtRec, sizeof(ExtDataRec)); in f_selectfork()
47 file->fork = fkRsrc; in f_selectfork()
48 memcpy(file->ext, file->cat.u.fil.filRExtRec, sizeof(ExtDataRec)); in f_selectfork()
51 file->fabn = 0; in f_selectfork()
52 file->pos = 0; in f_selectfork()
56 * NAME: file->getptrs()
59 void f_getptrs(hfsfile *file, unsigned long **lglen, in f_getptrs() argument
62 if (file->fork == fkData) in f_getptrs()
65 *lglen = &file->cat.u.fil.filLgLen; in f_getptrs()
67 *pylen = &file->cat.u.fil.filPyLen; in f_getptrs()
69 *extrec = &file->cat.u.fil.filExtRec; in f_getptrs()
74 *lglen = &file->cat.u.fil.filRLgLen; in f_getptrs()
76 *pylen = &file->cat.u.fil.filRPyLen; in f_getptrs()
78 *extrec = &file->cat.u.fil.filRExtRec; in f_getptrs()
83 * NAME: file->doblock()
84 * DESCRIPTION: read or write a numbered block from a file
86 int f_doblock(hfsfile *file, unsigned long num, block *bp, in f_doblock() argument
94 abnum = num / file->vol->lpa; in f_doblock()
95 blnum = num % file->vol->lpa; in f_doblock()
99 fabn = file->fabn; in f_doblock()
105 f_getptrs(file, 0, 0, &extrec); in f_doblock()
107 fabn = file->fabn = 0; in f_doblock()
108 memcpy(file->ext, extrec, sizeof(ExtDataRec)); in f_doblock()
119 num = file->ext[i].xdrNumABlks; in f_doblock()
125 a hard linked file? */ in f_doblock()
127 fprintf(stderr,"file: %s %d\n",file->name, i); */ in f_doblock()
129 ERROR(HCE_ERROR, "Possible Catalog file overflow - please report error"); in f_doblock()
134 return func(file->vol, file->ext[i].xdrStABN + abnum, blnum, bp); in f_doblock()
140 if (v_extsearch(file, fabn, &file->ext, 0) <= 0) in f_doblock()
143 file->fabn = fabn; in f_doblock()
148 * NAME: file->alloc()
149 * DESCRIPTION: reserve disk blocks for a file
151 int f_alloc(hfsfile *file) in f_alloc() argument
153 hfsvol *vol = file->vol; in f_alloc()
161 clumpsz = file->clump; in f_alloc()
170 /* update the file's extents */ in f_alloc()
172 f_getptrs(file, 0, &pylen, &extrec); in f_alloc()
174 start = file->fabn; in f_alloc()
186 num = file->ext[i].xdrNumABlks; in f_alloc()
194 ERROR(EIO, "file extents exceed file physical length"); in f_alloc()
200 ERROR(EIO, "empty file extent"); in f_alloc()
208 if (v_extsearch(file, start, &file->ext, &n) <= 0) in f_alloc()
214 file->fabn = start; in f_alloc()
218 file->ext[i].xdrStABN + file->ext[i].xdrNumABlks == blocks.xdrStABN) in f_alloc()
219 file->ext[i].xdrNumABlks += blocks.xdrNumABlks; in f_alloc()
225 file->ext[i] = blocks; in f_alloc()
234 file->ext[0] = blocks; in f_alloc()
238 file->ext[i].xdrStABN = 0; in f_alloc()
239 file->ext[i].xdrNumABlks = 0; in f_alloc()
242 file->fabn = start; in f_alloc()
244 r_makeextkey(&key, file->fork, file->cat.u.fil.filFlNum, end); in f_alloc()
246 r_packextdata(&file->ext, HFS_RECDATA(record), &reclen); in f_alloc()
262 if (file->fabn) in f_alloc()
265 v_extsearch(file, file->fabn, 0, &n) <= 0) || in f_alloc()
266 v_putextrec(&file->ext, &n) < 0) in f_alloc()
273 memcpy(extrec, file->ext, sizeof(ExtDataRec)); in f_alloc()
278 file->flags |= HFS_UPDATE_CATREC; in f_alloc()
284 * NAME: file->trunc()
285 * DESCRIPTION: release disk blocks unneeded by a file
287 int f_trunc(hfsfile *file) in f_trunc() argument
295 f_getptrs(file, &lglen, &pylen, &extrec); in f_trunc()
297 alblksz = file->vol->mdb.drAlBlkSiz; in f_trunc()
302 ERROR(EIO, "file size exceeds physical length"); in f_trunc()
310 start = file->fabn; in f_trunc()
315 start = file->fabn = 0; in f_trunc()
316 memcpy(file->ext, extrec, sizeof(ExtDataRec)); in f_trunc()
328 num = file->ext[i].xdrNumABlks; in f_trunc()
335 ERROR(EIO, "empty file extent"); in f_trunc()
343 if (v_extsearch(file, start, &file->ext, &n) <= 0) in f_trunc()
346 file->fabn = start; in f_trunc()
353 file->ext[i].xdrNumABlks -= start - end; in f_trunc()
356 blocks.xdrStABN = file->ext[i].xdrStABN + file->ext[i].xdrNumABlks; in f_trunc()
359 v_freeblocks(file->vol, &blocks); in f_trunc()
364 file->flags |= HFS_UPDATE_CATREC; in f_trunc()
372 num = file->ext[i].xdrNumABlks; in f_trunc()
377 ERROR(EIO, "empty file extent"); in f_trunc()
382 ERROR(EIO, "file extents exceed physical size"); in f_trunc()
387 v_freeblocks(file->vol, &file->ext[i]); in f_trunc()
389 file->ext[i].xdrStABN = 0; in f_trunc()
390 file->ext[i].xdrNumABlks = 0; in f_trunc()
393 if (file->fabn) in f_trunc()
396 v_extsearch(file, file->fabn, 0, &n) <= 0) in f_trunc()
399 if (file->ext[0].xdrNumABlks) in f_trunc()
401 if (v_putextrec(&file->ext, &n) < 0) in f_trunc()
406 if (bt_delete(&file->vol->ext, HFS_NODEREC(n, n.rnum)) < 0) in f_trunc()
413 memcpy(extrec, file->ext, sizeof(ExtDataRec)); in f_trunc()
417 if (v_extsearch(file, start, &file->ext, &n) <= 0) in f_trunc()
420 file->fabn = start; in f_trunc()
430 * NAME: file->flush()
431 * DESCRIPTION: flush all pending changes to an open file
433 int f_flush(hfsfile *file) in f_flush() argument
435 hfsvol *vol = file->vol; in f_flush()
439 if (file->flags & HFS_UPDATE_CATREC) in f_flush()
443 file->cat.u.fil.filStBlk = file->cat.u.fil.filExtRec[0].xdrStABN; in f_flush()
444 file->cat.u.fil.filRStBlk = file->cat.u.fil.filRExtRec[0].xdrStABN; in f_flush()
445 file->cat.u.fil.filClpSize = file->clump; in f_flush()
447 if (v_catsearch(file->vol, file->parid, file->name, 0, 0, &n) <= 0 || in f_flush()
448 v_putcatrec(&file->cat, &n) < 0) in f_flush()
451 file->flags &= ~HFS_UPDATE_CATREC; in f_flush()