Lines Matching refs:fs

146 #define bytsec(fs, n)	((n) >> (fs)->sshift)  argument
147 #define secbyt(fs, s) ((s) << (fs)->sshift) argument
148 #define depsec(fs) (1 << (fs)->dshift) argument
149 #define entsec(fs, e) ((e) >> (fs)->dshift) argument
150 #define bytblk(fs, n) ((n) >> (fs)->bshift) argument
151 #define blkbyt(fs, b) ((b) << (fs)->bshift) argument
152 #define secblk(fs, s) ((s) >> ((fs)->bshift - (fs)->sshift)) argument
153 #define blksec(fs, b) ((b) << ((fs)->bshift - (fs)->sshift)) argument
156 #define blkoff(fs, b) (secbyt(fs, (fs)->lsndta) + \ argument
157 blkbyt(fs, (b) - LOCLUS))
160 #define blklsn(fs, b) ((fs)->lsndta + blksec(fs, (b) - LOCLUS)) argument
168 #define okclus(fs, c) ((c) >= LOCLUS && (c) <= (fs)->xclus) argument
188 dos_read_fatblk(DOS_FS *fs, u_int blknum) in dos_read_fatblk() argument
195 max_offset_in_fat = secbyt(fs, (daddr_t)fs->spf); in dos_read_fatblk()
203 err = ioget(fs, fs->lsnfat + bytsec(fs, offset_in_fat), in dos_read_fatblk()
204 fs->fatbuf, io_size); in dos_read_fatblk()
206 fs->fatbuf_blknum = ((u_int)(-1)); in dos_read_fatblk()
211 memset(fs->fatbuf + io_size, 0, FATBLKSZ - io_size); in dos_read_fatblk()
213 fs->fatbuf_blknum = blknum; in dos_read_fatblk()
221 dos_mount_impl(DOS_FS *fs, struct open_file *fd) in dos_mount_impl() argument
227 fs->fd = fd; in dos_mount_impl()
238 if ((err = ioget(fs, 0, buf, secsz)) || in dos_mount_impl()
239 (err = parsebs(fs, (DOS_BS *)buf))) { in dos_mount_impl()
243 fs->secbuf = buf; in dos_mount_impl()
245 if ((fs->fatbuf = malloc(FATBLKSZ)) == NULL) { in dos_mount_impl()
249 err = dos_read_fatblk(fs, 0); in dos_mount_impl()
252 free(fs->fatbuf); in dos_mount_impl()
256 fs->root = dot[0]; in dos_mount_impl()
257 fs->root.name[0] = ' '; in dos_mount_impl()
258 if (fs->fatsz == 32) { in dos_mount_impl()
259 fs->root.clus[0] = fs->rdcl & 0xff; in dos_mount_impl()
260 fs->root.clus[1] = (fs->rdcl >> 8) & 0xff; in dos_mount_impl()
261 fs->root.dex.h_clus[0] = (fs->rdcl >> 16) & 0xff; in dos_mount_impl()
262 fs->root.dex.h_clus[1] = (fs->rdcl >> 24) & 0xff; in dos_mount_impl()
270 char *fs; in dos_mount() local
284 if (asprintf(&fs, "%s%s", dev, path) < 0) in dos_mount()
287 mnt->dos_fd = open(fs, O_RDONLY); in dos_mount()
288 free(fs); in dos_mount()
295 mnt->dos_fs = df->fs; in dos_mount()
330 dos_unmount_impl(DOS_FS *fs) in dos_unmount_impl() argument
332 if (fs->links) in dos_unmount_impl()
334 free(fs->secbuf); in dos_unmount_impl()
335 free(fs->fatbuf); in dos_unmount_impl()
336 free(fs); in dos_unmount_impl()
348 DOS_FS *fs = NULL; in dos_open() local
362 if ((fs = calloc(1, sizeof(DOS_FS))) == NULL) in dos_open()
364 if ((err = dos_mount_impl(fs, fd))) { in dos_open()
365 free(fs); in dos_open()
369 fs = mnt->dos_fs; in dos_open()
372 if ((err = namede(fs, path, &de))) { in dos_open()
374 dos_unmount_impl(fs); in dos_open()
378 clus = stclus(fs->fatsz, de); in dos_open()
383 (clus && !okclus(fs, clus))) { in dos_open()
385 dos_unmount_impl(fs); in dos_open()
391 dos_unmount_impl(fs); in dos_open()
394 f->fs = fs; in dos_open()
395 fs->links++; in dos_open()
422 if ((size = fsize(f->fs, &f->de)) == -1) in dos_read()
427 if ((clus = stclus(f->fs->fatsz, &f->de))) in dos_read()
428 off &= f->fs->bsize - 1; in dos_read()
435 n = bytblk(f->fs, f->offset); in dos_read()
439 if ((err = fatget(f->fs, &c))) in dos_read()
441 if (!okclus(f->fs, c)) { in dos_read()
446 if (!clus || (n = f->fs->bsize - off) > cnt) in dos_read()
449 off += blkoff(f->fs, (uint64_t)c); in dos_read()
451 off += secbyt(f->fs, f->fs->lsndir); in dos_read()
452 err = ioread(f->fs, off, buf, n); in dos_read()
509 DOS_FS *fs = f->fs; in dos_close() local
511 f->fs->links--; in dos_close()
513 dos_unmount_impl(fs); in dos_close()
530 if ((sb->st_size = fsize(f->fs, &f->de)) == -1) in dos_stat()
629 parsebs(DOS_FS *fs, DOS_BS *bs) in parsebs() argument
642 fs->sshift = ffs(cv2(bs->bpb.secsiz)) - 1; in parsebs()
649 if (!(fs->spc = bs->bpb.spc) || fs->spc & (fs->spc - 1)) in parsebs()
651 fs->bsize = secbyt(fs, fs->spc); in parsebs()
652 fs->bshift = ffs(fs->bsize) - 1; in parsebs()
653 fs->dshift = ffs(secbyt(fs, 1) / sizeof (DOS_DE)) - 1; in parsebs()
654 fs->dirents = cv2(bs->bpb.dirents); in parsebs()
655 fs->spf = cv2(bs->bpb.spf); in parsebs()
656 fs->lsnfat = cv2(bs->bpb.ressec); in parsebs()
658 if (fs->spf != 0) { in parsebs()
661 if (fs->dirents == 0) in parsebs()
664 fs->spf = cv4(bs->bpb.fstype.f32.lspf); in parsebs()
665 if (fs->spf == 0) in parsebs()
669 fs->rdcl = cv4(bs->bpb.fstype.f32.rdcl); in parsebs()
670 if (fs->rdcl < LOCLUS) in parsebs()
674 RootDirSectors = ((fs->dirents * sizeof (DOS_DE)) + in parsebs()
675 (secbyt(fs, 1) - 1)) / secbyt(fs, 1); in parsebs()
677 fs->lsndir = fs->lsnfat + fs->spf * bs->bpb.fats; in parsebs()
678 fs->lsndta = fs->lsndir + RootDirSectors; in parsebs()
681 if (fs->lsndta > sc) in parsebs()
683 if ((fs->xclus = secblk(fs, sc - fs->lsndta) + 1) < LOCLUS) in parsebs()
685 fs->fatsz = fs->dirents ? fs->xclus < 0xff6 ? 12 : 16 : 32; in parsebs()
686 sc = (secbyt(fs, fs->spf) << 1) / (fs->fatsz >> 2) - 1; in parsebs()
687 if (fs->xclus > sc) in parsebs()
688 fs->xclus = sc; in parsebs()
696 namede(DOS_FS *fs, const char *path, DOS_DE **dep) in namede() argument
705 de = &fs->root; in namede()
720 if ((err = lookup(fs, stclus(fs->fatsz, de), name, &de))) in namede()
731 lookup(DOS_FS *fs, u_int clus, const char *name, DOS_DE **dep) in lookup() argument
745 if (!clus && fs->fatsz == 32) in lookup()
746 clus = fs->rdcl; in lookup()
747 nsec = !clus ? entsec(fs, fs->dirents) : fs->spc; in lookup()
750 dir = (DOS_DIR *)fs->secbuf; in lookup()
753 lsec = fs->lsndir; in lookup()
754 else if (okclus(fs, clus)) in lookup()
755 lsec = blklsn(fs, clus); in lookup()
759 if ((err = ioget(fs, lsec + sec, dir, in lookup()
760 secbyt(fs, 1)))) in lookup()
762 for (ent = 0; ent < depsec(fs); ent++) { in lookup()
808 if ((err = fatget(fs, &clus))) in lookup()
810 if (fatend(fs->fatsz, clus)) in lookup()
878 fsize(DOS_FS *fs, DOS_DE *de) in fsize() argument
885 if (!(c = stclus(fs->fatsz, de))) { in fsize()
886 size = fs->dirents * sizeof(DOS_DE); in fsize()
888 if ((n = fatcnt(fs, c)) == -1) in fsize()
890 size = blkbyt(fs, n); in fsize()
900 fatcnt(DOS_FS *fs, u_int c) in fatcnt() argument
904 for (n = 0; okclus(fs, c); n++) in fatcnt()
905 if (fatget(fs, &c)) in fatcnt()
907 return (fatend(fs->fatsz, c) ? n : -1); in fatcnt()
915 fatget(DOS_FS *fs, u_int *c) in fatget() argument
927 offset = fatoff(fs->fatsz, val_in); in fatget()
928 nbyte = fs->fatsz != 32 ? 2 : 4; in fatget()
929 if (offset + nbyte > secbyt(fs, fs->spf)) in fatget()
935 if (blknum != fs->fatbuf_blknum) { in fatget()
936 err = dos_read_fatblk(fs, blknum); in fatget()
940 p_entry = fs->fatbuf + offset; in fatget()
943 switch (fs->fatsz) { in fatget()
978 ioread(DOS_FS *fs, uint64_t offset, void *buf, size_t nbyte) in ioread() argument
985 secsiz = secbyt(fs, 1); in ioread()
991 err = ioget(fs, bytsec(fs, offset), fs->secbuf, secsiz); in ioread()
994 memcpy(s, fs->secbuf + off, n); in ioread()
1001 if ((err = ioget(fs, bytsec(fs, offset), s, nbyte))) in ioread()
1007 err = ioget(fs, bytsec(fs, offset), fs->secbuf, secsiz); in ioread()
1010 memcpy(s, fs->secbuf, n); in ioread()
1020 ioget(DOS_FS *fs, daddr_t lsec, void *buf, size_t size) in ioget() argument
1024 struct open_file *fd = fs->fd; in ioget()
1029 lsec = secbyt(fs, lsec) >> 9; in ioget()