Lines Matching refs:itr
661 static int fat_itr_isdir(fat_itr *itr);
671 static int fat_itr_root(fat_itr *itr, fsdata *fsdata) in fat_itr_root() argument
676 itr->fsdata = fsdata; in fat_itr_root()
677 itr->clust = fsdata->root_cluster; in fat_itr_root()
678 itr->dent = NULL; in fat_itr_root()
679 itr->remaining = 0; in fat_itr_root()
680 itr->last_cluster = 0; in fat_itr_root()
681 itr->is_root = 1; in fat_itr_root()
703 static void fat_itr_child(fat_itr *itr, fat_itr *parent) in fat_itr_child() argument
710 itr->fsdata = parent->fsdata; in fat_itr_child()
712 itr->clust = clustnum; in fat_itr_child()
714 itr->clust = parent->fsdata->root_cluster; in fat_itr_child()
716 itr->dent = NULL; in fat_itr_child()
717 itr->remaining = 0; in fat_itr_child()
718 itr->last_cluster = 0; in fat_itr_child()
719 itr->is_root = 0; in fat_itr_child()
722 static void *next_cluster(fat_itr *itr) in next_cluster() argument
724 fsdata *mydata = itr->fsdata; /* for silly macros */ in next_cluster()
729 if (itr->last_cluster) in next_cluster()
732 sect = clust_to_sect(itr->fsdata, itr->clust); in next_cluster()
735 sect, itr->fsdata->clust_size, DIRENTSPERBLOCK); in next_cluster()
746 ret = disk_read(sect, itr->fsdata->clust_size, in next_cluster()
747 itr->block); in next_cluster()
753 if (itr->is_root && itr->fsdata->fatsize != 32) { in next_cluster()
754 itr->clust++; in next_cluster()
755 sect = clust_to_sect(itr->fsdata, itr->clust); in next_cluster()
756 if (sect - itr->fsdata->rootdir_sect >= in next_cluster()
757 itr->fsdata->rootdir_size) { in next_cluster()
758 debug("cursect: 0x%x\n", itr->clust); in next_cluster()
759 itr->last_cluster = 1; in next_cluster()
762 itr->clust = get_fatent(itr->fsdata, itr->clust); in next_cluster()
763 if (CHECK_CLUST(itr->clust, itr->fsdata->fatsize)) { in next_cluster()
764 debug("cursect: 0x%x\n", itr->clust); in next_cluster()
765 itr->last_cluster = 1; in next_cluster()
769 return itr->block; in next_cluster()
772 static dir_entry *next_dent(fat_itr *itr) in next_dent() argument
774 if (itr->remaining == 0) { in next_dent()
775 struct dir_entry *dent = next_cluster(itr); in next_dent()
776 unsigned nbytes = itr->fsdata->sect_size * in next_dent()
777 itr->fsdata->clust_size; in next_dent()
783 itr->remaining = nbytes / sizeof(dir_entry) - 1; in next_dent()
784 itr->dent = dent; in next_dent()
786 itr->remaining--; in next_dent()
787 itr->dent++; in next_dent()
791 if (itr->dent->name[0] == 0) in next_dent()
794 return itr->dent; in next_dent()
797 static dir_entry *extract_vfat_name(fat_itr *itr) in extract_vfat_name() argument
799 struct dir_entry *dent = itr->dent; in extract_vfat_name()
800 int seqn = itr->dent->name[0] & ~LAST_LONG_ENTRY_MASK; in extract_vfat_name()
811 memmove(itr->l_name + idx, itr->l_name, n); in extract_vfat_name()
812 memcpy(itr->l_name, buf, idx); in extract_vfat_name()
815 dent = next_dent(itr); in extract_vfat_name()
820 itr->l_name[n] = '\0'; in extract_vfat_name()
827 chksum, alias_checksum, itr->l_name, dent->name, dent->ext); in extract_vfat_name()
843 static int fat_itr_next(fat_itr *itr) in fat_itr_next() argument
847 itr->name = NULL; in fat_itr_next()
850 dent = next_dent(itr); in fat_itr_next()
862 dent = extract_vfat_name(itr); in fat_itr_next()
865 itr->name = itr->l_name; in fat_itr_next()
876 get_name(dent, itr->s_name); in fat_itr_next()
877 if (!itr->name) in fat_itr_next()
878 itr->name = itr->s_name; in fat_itr_next()
889 static int fat_itr_isdir(fat_itr *itr) in fat_itr_isdir() argument
891 return !!(itr->dent->attr & ATTR_DIR); in fat_itr_isdir()
917 static int fat_itr_resolve(fat_itr *itr, const char *path, unsigned type) in fat_itr_resolve() argument
937 while (fat_itr_next(itr)) { in fat_itr_resolve()
939 unsigned n = max(strlen(itr->name), (size_t)(next - path)); in fat_itr_resolve()
942 if (!strncasecmp(path, itr->name, n)) in fat_itr_resolve()
944 else if (itr->name != itr->s_name && in fat_itr_resolve()
945 !strncasecmp(path, itr->s_name, n)) in fat_itr_resolve()
951 if (fat_itr_isdir(itr)) { in fat_itr_resolve()
953 fat_itr_child(itr, itr); in fat_itr_resolve()
954 return fat_itr_resolve(itr, next, type); in fat_itr_resolve()
1037 fat_itr *itr; in fat_exists() local
1040 itr = malloc_cache_aligned(sizeof(fat_itr)); in fat_exists()
1041 if (!itr) in fat_exists()
1043 ret = fat_itr_root(itr, &fsdata); in fat_exists()
1047 ret = fat_itr_resolve(itr, filename, TYPE_ANY); in fat_exists()
1050 free(itr); in fat_exists()
1057 fat_itr *itr; in fat_size() local
1060 itr = malloc_cache_aligned(sizeof(fat_itr)); in fat_size()
1061 if (!itr) in fat_size()
1063 ret = fat_itr_root(itr, &fsdata); in fat_size()
1067 ret = fat_itr_resolve(itr, filename, TYPE_FILE); in fat_size()
1074 fat_itr_root(itr, &fsdata); in fat_size()
1075 if (!fat_itr_resolve(itr, filename, TYPE_DIR)) { in fat_size()
1082 *size = FAT2CPU32(itr->dent->size); in fat_size()
1086 free(itr); in fat_size()
1094 fat_itr *itr; in file_fat_read_at() local
1097 itr = malloc_cache_aligned(sizeof(fat_itr)); in file_fat_read_at()
1098 if (!itr) in file_fat_read_at()
1100 ret = fat_itr_root(itr, &fsdata); in file_fat_read_at()
1104 ret = fat_itr_resolve(itr, filename, TYPE_FILE); in file_fat_read_at()
1109 ret = get_contents(&fsdata, itr->dent, pos, buffer, maxsize, actread); in file_fat_read_at()
1114 free(itr); in file_fat_read_at()
1146 fat_itr itr; member
1157 ret = fat_itr_root(&dir->itr, &dir->fsdata); in fat_opendir()
1161 ret = fat_itr_resolve(&dir->itr, filename, TYPE_DIR); in fat_opendir()
1180 if (!fat_itr_next(&dir->itr)) in fat_readdir()
1184 strcpy(dent->name, dir->itr.name); in fat_readdir()
1186 if (fat_itr_isdir(&dir->itr)) { in fat_readdir()
1190 dent->size = FAT2CPU32(dir->itr.dent->size); in fat_readdir()