Lines Matching full:fs

147 #define bytsec(fs, n)	((n) >> (fs)->sshift)  argument
148 #define secbyt(fs, s) ((s) << (fs)->sshift) argument
149 #define depsec(fs) (1 << (fs)->dshift) argument
150 #define entsec(fs, e) ((e) >> (fs)->dshift) argument
151 #define bytblk(fs, n) ((n) >> (fs)->bshift) argument
152 #define blkbyt(fs, b) ((b) << (fs)->bshift) argument
153 #define secblk(fs, s) ((s) >> ((fs)->bshift - (fs)->sshift)) argument
154 #define blksec(fs, b) ((b) << ((fs)->bshift - (fs)->sshift)) argument
157 #define blkoff(fs, b) (secbyt(fs, (fs)->lsndta) + \ argument
158 blkbyt(fs, (b) - LOCLUS))
161 #define blklsn(fs, b) ((fs)->lsndta + blksec(fs, (b) - LOCLUS)) argument
169 #define okclus(fs, c) ((c) >= LOCLUS && (c) <= (fs)->xclus) argument
189 dos_read_fatblk(DOS_FS *fs, u_int blknum) in dos_read_fatblk() argument
196 max_offset_in_fat = secbyt(fs, (daddr_t)fs->spf); in dos_read_fatblk()
204 err = ioget(fs, fs->lsnfat + bytsec(fs, offset_in_fat), in dos_read_fatblk()
205 fs->fatbuf, io_size); in dos_read_fatblk()
207 fs->fatbuf_blknum = ((u_int)(-1)); in dos_read_fatblk()
212 memset(fs->fatbuf + io_size, 0, FATBLKSZ - io_size); in dos_read_fatblk()
214 fs->fatbuf_blknum = blknum; in dos_read_fatblk()
222 dos_mount_impl(DOS_FS *fs, struct open_file *fd) in dos_mount_impl() argument
228 fs->fd = fd; in dos_mount_impl()
239 if ((err = ioget(fs, 0, buf, secsz)) || in dos_mount_impl()
240 (err = parsebs(fs, (DOS_BS *)buf))) { in dos_mount_impl()
244 fs->secbuf = buf; in dos_mount_impl()
246 if ((fs->fatbuf = malloc(FATBLKSZ)) == NULL) { in dos_mount_impl()
250 err = dos_read_fatblk(fs, 0); in dos_mount_impl()
253 free(fs->fatbuf); in dos_mount_impl()
257 fs->root = dot[0]; in dos_mount_impl()
258 fs->root.name[0] = ' '; in dos_mount_impl()
259 if (fs->fatsz == 32) { in dos_mount_impl()
260 fs->root.clus[0] = fs->rdcl & 0xff; in dos_mount_impl()
261 fs->root.clus[1] = (fs->rdcl >> 8) & 0xff; in dos_mount_impl()
262 fs->root.dex.h_clus[0] = (fs->rdcl >> 16) & 0xff; in dos_mount_impl()
263 fs->root.dex.h_clus[1] = (fs->rdcl >> 24) & 0xff; in dos_mount_impl()
271 char *fs; in dos_mount() local
285 if (asprintf(&fs, "%s%s", dev, path) < 0) in dos_mount()
288 mnt->dos_fd = open(fs, O_RDONLY); in dos_mount()
289 free(fs); in dos_mount()
296 mnt->dos_fs = df->fs; in dos_mount()
331 dos_unmount_impl(DOS_FS *fs) in dos_unmount_impl() argument
333 if (fs->links) in dos_unmount_impl()
335 free(fs->secbuf); in dos_unmount_impl()
336 free(fs->fatbuf); in dos_unmount_impl()
337 free(fs); in dos_unmount_impl()
349 DOS_FS *fs = NULL; in dos_open() local
363 if ((fs = calloc(1, sizeof(DOS_FS))) == NULL) in dos_open()
365 if ((err = dos_mount_impl(fs, fd))) { in dos_open()
366 free(fs); in dos_open()
370 fs = mnt->dos_fs; in dos_open()
373 if ((err = namede(fs, path, &de))) { in dos_open()
375 dos_unmount_impl(fs); in dos_open()
379 clus = stclus(fs->fatsz, de); in dos_open()
384 (clus && !okclus(fs, clus))) { in dos_open()
386 dos_unmount_impl(fs); in dos_open()
392 dos_unmount_impl(fs); in dos_open()
395 f->fs = fs; in dos_open()
396 fs->links++; in dos_open()
423 if ((size = fsize(f->fs, &f->de)) == -1) in dos_read()
428 if ((clus = stclus(f->fs->fatsz, &f->de))) in dos_read()
429 off &= f->fs->bsize - 1; in dos_read()
436 n = bytblk(f->fs, f->offset); in dos_read()
440 if ((err = fatget(f->fs, &c))) in dos_read()
442 if (!okclus(f->fs, c)) { in dos_read()
447 if (!clus || (n = f->fs->bsize - off) > cnt) in dos_read()
450 off += blkoff(f->fs, (uint64_t)c); in dos_read()
452 off += secbyt(f->fs, f->fs->lsndir); in dos_read()
453 err = ioread(f->fs, off, buf, n); in dos_read()
510 DOS_FS *fs = f->fs; in dos_close() local
512 f->fs->links--; in dos_close()
514 dos_unmount_impl(fs); in dos_close()
531 if ((sb->st_size = fsize(f->fs, &f->de)) == -1) in dos_stat()
630 parsebs(DOS_FS *fs, DOS_BS *bs) in parsebs() argument
643 fs->sshift = ffs(cv2(bs->bpb.secsiz)) - 1; in parsebs()
650 if (!(fs->spc = bs->bpb.spc) || fs->spc & (fs->spc - 1)) in parsebs()
652 fs->bsize = secbyt(fs, fs->spc); in parsebs()
653 fs->bshift = ffs(fs->bsize) - 1; in parsebs()
654 fs->dshift = ffs(secbyt(fs, 1) / sizeof (DOS_DE)) - 1; in parsebs()
655 fs->dirents = cv2(bs->bpb.dirents); in parsebs()
656 fs->spf = cv2(bs->bpb.spf); in parsebs()
657 fs->lsnfat = cv2(bs->bpb.ressec); in parsebs()
659 if (fs->spf != 0) { in parsebs()
662 if (fs->dirents == 0) in parsebs()
665 fs->spf = cv4(bs->bpb.fstype.f32.lspf); in parsebs()
666 if (fs->spf == 0) in parsebs()
670 fs->rdcl = cv4(bs->bpb.fstype.f32.rdcl); in parsebs()
671 if (fs->rdcl < LOCLUS) in parsebs()
675 RootDirSectors = ((fs->dirents * sizeof (DOS_DE)) + in parsebs()
676 (secbyt(fs, 1) - 1)) / secbyt(fs, 1); in parsebs()
678 fs->lsndir = fs->lsnfat + fs->spf * bs->bpb.fats; in parsebs()
679 fs->lsndta = fs->lsndir + RootDirSectors; in parsebs()
682 if (fs->lsndta > sc) in parsebs()
684 if ((fs->xclus = secblk(fs, sc - fs->lsndta) + 1) < LOCLUS) in parsebs()
686 fs->fatsz = fs->dirents ? fs->xclus < 0xff6 ? 12 : 16 : 32; in parsebs()
687 sc = (secbyt(fs, fs->spf) << 1) / (fs->fatsz >> 2) - 1; in parsebs()
688 if (fs->xclus > sc) in parsebs()
689 fs->xclus = sc; in parsebs()
697 namede(DOS_FS *fs, const char *path, DOS_DE **dep) in namede() argument
706 de = &fs->root; in namede()
721 if ((err = lookup(fs, stclus(fs->fatsz, de), name, &de))) in namede()
732 lookup(DOS_FS *fs, u_int clus, const char *name, DOS_DE **dep) in lookup() argument
746 if (!clus && fs->fatsz == 32) in lookup()
747 clus = fs->rdcl; in lookup()
748 nsec = !clus ? entsec(fs, fs->dirents) : fs->spc; in lookup()
751 dir = (DOS_DIR *)fs->secbuf; in lookup()
754 lsec = fs->lsndir; in lookup()
755 else if (okclus(fs, clus)) in lookup()
756 lsec = blklsn(fs, clus); in lookup()
760 if ((err = ioget(fs, lsec + sec, dir, in lookup()
761 secbyt(fs, 1)))) in lookup()
763 for (ent = 0; ent < depsec(fs); ent++) { in lookup()
809 if ((err = fatget(fs, &clus))) in lookup()
811 if (fatend(fs->fatsz, clus)) in lookup()
879 fsize(DOS_FS *fs, DOS_DE *de) in fsize() argument
886 if (!(c = stclus(fs->fatsz, de))) { in fsize()
887 size = fs->dirents * sizeof(DOS_DE); in fsize()
889 if ((n = fatcnt(fs, c)) == -1) in fsize()
891 size = blkbyt(fs, n); in fsize()
901 fatcnt(DOS_FS *fs, u_int c) in fatcnt() argument
905 for (n = 0; okclus(fs, c); n++) in fatcnt()
906 if (fatget(fs, &c)) in fatcnt()
908 return (fatend(fs->fatsz, c) ? n : -1); in fatcnt()
916 fatget(DOS_FS *fs, u_int *c) in fatget() argument
928 offset = fatoff(fs->fatsz, val_in); in fatget()
929 nbyte = fs->fatsz != 32 ? 2 : 4; in fatget()
930 if (offset + nbyte > secbyt(fs, fs->spf)) in fatget()
936 if (blknum != fs->fatbuf_blknum) { in fatget()
937 err = dos_read_fatblk(fs, blknum); in fatget()
941 p_entry = fs->fatbuf + offset; in fatget()
944 switch (fs->fatsz) { in fatget()
979 ioread(DOS_FS *fs, uint64_t offset, void *buf, size_t nbyte) in ioread() argument
986 secsiz = secbyt(fs, 1); in ioread()
992 err = ioget(fs, bytsec(fs, offset), fs->secbuf, secsiz); in ioread()
995 memcpy(s, fs->secbuf + off, n); in ioread()
1002 if ((err = ioget(fs, bytsec(fs, offset), s, nbyte))) in ioread()
1008 err = ioget(fs, bytsec(fs, offset), fs->secbuf, secsiz); in ioread()
1011 memcpy(s, fs->secbuf, n); in ioread()
1021 ioget(DOS_FS *fs, daddr_t lsec, void *buf, size_t size) in ioget() argument
1025 struct open_file *fd = fs->fd; in ioget()
1030 lsec = secbyt(fs, lsec) >> 9; in ioget()