Lines Matching defs:dir

20 #include "dir.h"
43 static status_t findfile(nspace *vol, vnode *dir, const char *file,
57 // scans dir for the next entry, using the state stored in a struct diri.
203 static status_t get_next_dirent(nspace *vol, vnode *dir, struct diri *iter,
216 } while ((info.mode & FAT_VOLUME) && (dir->vnid == vol->root_vnode.vnid));
220 if (vnid) *vnid = dir->vnid;
223 if (vnid) *vnid = dir->dir_vnid;
227 GENERATE_DIR_CLUSTER_VNID(dir->vnid, info.cluster) :
228 GENERATE_DIR_INDEX_VNID(dir->vnid, info.sindex);
269 status_t check_dir_empty(nspace *vol, vnode *dir)
276 if (check_vnode_magic(dir, "check_dir_empty")) return EINVAL;
278 if (diri_init(vol, dir->cluster, 0, &iter) == NULL) {
284 i = (dir->vnid == vol->root_vnode.vnid) ? 2 : 0;
312 status_t findfile_case(nspace *vol, vnode *dir, const char *file,
315 return findfile(vol, dir, file, vnid, node, true, false, NULL);
318 status_t findfile_nocase(nspace *vol, vnode *dir, const char *file,
321 return findfile(vol, dir, file, vnid, node, false, false, NULL);
324 status_t findfile_nocase_duplicates(nspace *vol, vnode *dir, const char *file,
327 return findfile(vol, dir, file, vnid, node, false, true, dups_exist);
330 status_t findfile_case_duplicates(nspace *vol, vnode *dir, const char *file,
333 return findfile(vol, dir, file, vnid, node, true, true, dups_exist);
336 static status_t findfile(nspace *vol, vnode *dir, const char *file,
354 // dprintf("findfile: %s in %Lx, case %d dups %d\n", file, dir->vnid, check_case, check_dups);
357 if (check_vnode_magic(dir, "findfile")) return EINVAL;
359 DPRINTF(1, ("findfile: %s in %Lx\n", file, dir->vnid));
364 if ((strcmp(file,".") == 0) && (dir->vnid == vol->root_vnode.vnid)) {
366 found_vnid = dir->vnid;
367 } else if ((strcmp(file, "..") == 0) && (dir->vnid == vol->root_vnode.vnid)) {
369 found_vnid = dir->dir_vnid;
374 diri_init(vol, dir->cluster, 0, &diri);
381 result = get_next_dirent(vol, dir, &diri, &_vnid, filename, 512);
471 status_t compact_directory(nspace *vol, vnode *dir)
477 DPRINTF(0, ("compacting directory with vnode id %Lx\n", dir->vnid));
480 if (IS_FIXED_ROOT(dir->cluster))
483 diri_init(vol, dir->cluster, 0, &diri);
491 // don't compact away volume labels in the root dir
492 if (!(info.mode & FAT_VOLUME) || (dir->vnid != vol->root_vnode.vnid))
502 if (clusters * vol->bytes_per_sector * vol->sectors_per_cluster < dir->st_size) {
504 error = set_fat_chain_length(vol, dir, clusters);
505 dir->st_size = clusters*vol->bytes_per_sector*vol->sectors_per_cluster;
506 dir->iteration++;
520 static status_t find_short_name(nspace *vol, vnode *dir, const uchar *name)
526 buffer = diri_init(vol, dir->cluster, 0, &diri);
553 static status_t _create_dir_entry_(nspace *vol, vnode *dir, struct _entry_info_ *info,
598 diri_init(vol, dir->cluster, 0, &diri);
628 GENERATE_DIR_INDEX_VNID(dir->cluster, i)) == ENOENT);
631 DPRINTF(0, ("directory entry runs from %lx to %lx (dirsize = %Lx) (is%s last entry)\n", *ns, *ne, dir->st_size, last_entry ? "" : "n't"));
634 if (*ne * 0x20 >= dir->st_size) {
638 if (IS_FIXED_ROOT(dir->cluster)) {
648 DPRINTF(0, ("expanding directory from %Lx to %lx clusters\n", dir->st_size/vol->bytes_per_sector/vol->sectors_per_cluster, clusters_needed));
649 if ((error = set_fat_chain_length(vol, dir, clusters_needed)) < 0)
651 dir->st_size = vol->bytes_per_sector*vol->sectors_per_cluster*clusters_needed;
652 dir->iteration++;
656 buffer = diri_init(vol,dir->cluster, *ns, &diri);
760 status_t create_dir_entry(nspace *vol, vnode *dir, vnode *node,
774 error = findfile_nocase(vol,dir,name,NULL,NULL);
776 DPRINTF(0, ("%s already found in directory %Lx\n", name, dir->vnid));
813 error = find_short_name(vol, dir, nshort);
820 } while (((error = find_short_name(vol, dir, nshort)) == B_OK) && (++iter < 10));
831 } while ((error = find_short_name(vol, dir, nshort)) == B_OK);
846 return _create_dir_entry_(vol, dir, &info, (char *)nshort, (char *)nlong, len, ns, ne);
977 vnode *dir = (vnode*)_dir;
987 check_vnode_magic(dir, "dosfs_walk")) {
992 DPRINTF(0, ("dosfs_walk: find %Lx/%s\n", dir->vnid, file));
994 result = findfile_case(vol, dir, file, vnid, &vnode);
1110 vnode *dir = (vnode *)_dir;
1117 check_vnode_magic(dir, "dosfs_readdir") ||
1123 DPRINTF(0, ("dosfs_readdir: vnode id %Lx, index %lx\n", dir->vnid, cookie->current_index));
1126 if (dir->vnid == vol->root_vnode.vnid) {
1145 diri_init(vol, dir->cluster, cookie->current_index, &diri);
1146 result = get_next_dirent(vol, dir, &diri, &(entry->d_ino), entry->d_name, bufsize - sizeof(struct dirent) - 1);
1150 if (dir->vnid == vol->root_vnode.vnid)