Lines Matching refs:fs

111 #define bytblk(fs, n)  ((n) >> (fs)->bshift)  argument
112 #define blkbyt(fs, b) ((b) << (fs)->bshift) argument
113 #define secblk(fs, s) ((s) >> ((fs)->bshift - SSHIFT)) argument
114 #define blksec(fs, b) ((b) << ((fs)->bshift - SSHIFT)) argument
117 #define blkoff(fs, b) (secbyt((fs)->lsndta) + blkbyt(fs, (b) - LOCLUS)) argument
120 #define blklsn(fs, b) ((fs)->lsndta + blksec(fs, (b) - LOCLUS)) argument
128 #define okclus(fs, c) ((c) >= LOCLUS && (c) <= (fs)->xclus) argument
153 dos_mount(DOS_FS *fs, struct open_file *fd) in dos_mount() argument
157 bzero(fs, sizeof(DOS_FS)); in dos_mount()
158 fs->fd = fd; in dos_mount()
159 if ((err = !(fs->buf = malloc(SECSIZ)) ? errno : 0) || in dos_mount()
160 (err = ioget(fs->fd, 0, fs->buf, 1)) || in dos_mount()
161 (err = parsebs(fs, (DOS_BS *)fs->buf))) { in dos_mount()
162 (void)dosunmount(fs); in dos_mount()
165 fs->root = dot[0]; in dos_mount()
166 fs->root.name[0] = ' '; in dos_mount()
167 if (fs->fatsz == 32) { in dos_mount()
168 fs->root.clus[0] = fs->rdcl & 0xff; in dos_mount()
169 fs->root.clus[1] = (fs->rdcl >> 8) & 0xff; in dos_mount()
170 fs->root.dex.h_clus[0] = (fs->rdcl >> 16) & 0xff; in dos_mount()
171 fs->root.dex.h_clus[1] = (fs->rdcl >> 24) & 0xff; in dos_mount()
180 dos_unmount(DOS_FS *fs) in dos_unmount() argument
184 if (fs->links) in dos_unmount()
186 if ((err = dosunmount(fs))) in dos_unmount()
195 dosunmount(DOS_FS *fs) in dosunmount() argument
197 if (fs->buf) in dosunmount()
198 free(fs->buf); in dosunmount()
199 free(fs); in dosunmount()
211 DOS_FS *fs; in dos_open() local
216 fs = malloc(sizeof(DOS_FS)); in dos_open()
218 if ((err = dos_mount(fs, fd))) in dos_open()
221 if ((err = namede(fs, path, &de))) in dos_open()
224 clus = stclus(fs->fatsz, de); in dos_open()
229 (clus && !okclus(fs, clus))) { in dos_open()
235 f->fs = fs; in dos_open()
236 fs->links++; in dos_open()
256 if ((size = fsize(f->fs, &f->de)) == -1) in dos_read()
261 if ((clus = stclus(f->fs->fatsz, &f->de))) in dos_read()
262 off &= f->fs->bsize - 1; in dos_read()
269 n = bytblk(f->fs, f->offset); in dos_read()
273 if ((err = fatget(f->fs, &c))) in dos_read()
275 if (!okclus(f->fs, c)) { in dos_read()
280 if (!clus || (n = f->fs->bsize - off) > cnt) in dos_read()
282 if ((err = ioread(f->fs, (c ? blkoff(f->fs, c) : in dos_read()
283 secbyt(f->fs->lsndir)) + off, in dos_read()
337 DOS_FS *fs; in dos_close() local
341 fs = f->fs; in dos_close()
342 f->fs = NULL; in dos_close()
343 fs->links--; in dos_close()
345 dos_unmount(fs); in dos_close()
363 if ((sb->st_size = fsize(f->fs, &f->de)) == -1) in dos_stat()
448 parsebs(DOS_FS *fs, DOS_BS *bs) in parsebs() argument
459 if (!(fs->spc = bs->bpb.spc) || fs->spc & (fs->spc - 1)) in parsebs()
461 fs->bsize = secbyt(fs->spc); in parsebs()
462 fs->bshift = ffs(fs->bsize) - 1; in parsebs()
463 if ((fs->spf = cv2(bs->bpb.spf))) { in parsebs()
466 if (!(fs->dirents = cv2(bs->bpb.dirents))) in parsebs()
469 if (!(fs->spf = cv4(bs->bpb.lspf))) in parsebs()
473 if ((fs->rdcl = cv4(bs->bpb.rdcl)) < LOCLUS) in parsebs()
476 if (!(fs->lsnfat = cv2(bs->bpb.ressec))) in parsebs()
478 fs->lsndir = fs->lsnfat + fs->spf * bs->bpb.fats; in parsebs()
479 fs->lsndta = fs->lsndir + entsec(fs->dirents); in parsebs()
482 if (fs->lsndta > sc) in parsebs()
484 if ((fs->xclus = secblk(fs, sc - fs->lsndta) + 1) < LOCLUS) in parsebs()
486 fs->fatsz = fs->dirents ? fs->xclus < 0xff6 ? 12 : 16 : 32; in parsebs()
487 sc = (secbyt(fs->spf) << 1) / (fs->fatsz >> 2) - 1; in parsebs()
488 if (fs->xclus > sc) in parsebs()
489 fs->xclus = sc; in parsebs()
497 namede(DOS_FS *fs, const char *path, DOS_DE **dep) in namede() argument
506 de = &fs->root; in namede()
521 if ((err = lookup(fs, stclus(fs->fatsz, de), name, &de))) in namede()
532 lookup(DOS_FS *fs, u_int clus, const char *name, DOS_DE **dep) in lookup() argument
546 if (!clus && fs->fatsz == 32) in lookup()
547 clus = fs->rdcl; in lookup()
548 nsec = !clus ? entsec(fs->dirents) : fs->spc; in lookup()
553 lsec = fs->lsndir; in lookup()
554 else if (okclus(fs, clus)) in lookup()
555 lsec = blklsn(fs, clus); in lookup()
559 if ((err = ioget(fs->fd, lsec + sec, dir, 1))) in lookup()
604 if ((err = fatget(fs, &clus))) in lookup()
606 if (fatend(fs->fatsz, clus)) in lookup()
672 fsize(DOS_FS *fs, DOS_DE *de) in fsize() argument
680 size = fs->dirents * sizeof(DOS_DE); in fsize()
682 if ((n = fatcnt(fs, c)) == -1) in fsize()
684 size = blkbyt(fs, n); in fsize()
694 fatcnt(DOS_FS *fs, u_int c) in fatcnt() argument
698 for (n = 0; okclus(fs, c); n++) in fatcnt()
699 if (fatget(fs, &c)) in fatcnt()
701 return fatend(fs->fatsz, c) ? n : -1; in fatcnt()
708 fatget(DOS_FS *fs, u_int *c) in fatget() argument
714 err = ioread(fs, secbyt(fs->lsnfat) + fatoff(fs->fatsz, *c), buf, in fatget()
715 fs->fatsz != 32 ? 2 : 4); in fatget()
718 x = fs->fatsz != 32 ? cv2(buf) : cv4(buf); in fatget()
719 *c = fs->fatsz == 12 ? *c & 1 ? x >> 4 : x & 0xfff : x; in fatget()
736 ioread(DOS_FS *fs, u_int offset, void *buf, u_int nbyte) in ioread() argument
745 if ((err = iobuf(fs, bytsec(offset)))) in ioread()
750 memcpy(s, fs->buf + off, n); in ioread()
756 if ((err = ioget(fs->fd, bytsec(offset), s, bytsec(nbyte)))) in ioread()
762 if ((err = iobuf(fs, bytsec(offset)))) in ioread()
764 memcpy(s, fs->buf, n); in ioread()
773 iobuf(DOS_FS *fs, u_int lsec) in iobuf() argument
777 if (fs->bufsec != lsec) { in iobuf()
778 if ((err = ioget(fs->fd, lsec, fs->buf, 1))) in iobuf()
780 fs->bufsec = lsec; in iobuf()