get_dir_listing now returs array of dir_entries

This commit is contained in:
pjht 2019-04-21 15:16:30 -05:00
parent f612cea891
commit 056f13c675

View File

@ -225,8 +225,8 @@ void* read_inode_contents(inode* node,FILE* f,int num) {
return (void*)data; return (void*)data;
} }
char** get_dir_listing(uint32_t inode_num,FILE* f,int num) { dir_entry* get_dir_listing(uint32_t inode_num,FILE* f,int num) {
char** names=malloc(sizeof(char*)*100); dir_entry* entries=malloc(sizeof(dir_entry)*100);
int num_entries_used=0; int num_entries_used=0;
int max_len=100; int max_len=100;
inode* dir_inode=read_inode(inode_num,f,num); inode* dir_inode=read_inode(inode_num,f,num);
@ -240,28 +240,30 @@ char** get_dir_listing(uint32_t inode_num,FILE* f,int num) {
} }
if(num_entries_used==max_len) { if(num_entries_used==max_len) {
max_len+=100; max_len+=100;
names=realloc(names,sizeof(char*)*max_len); entries=realloc(entries,sizeof(dir_entry)*max_len);
} }
names[num_entries_used]=malloc(current_entry->name_len+1); entries[num_entries_used].inode=current_entry->inode;
names[num_entries_used]=current_entry->file_name; entries[num_entries_used].type=current_entry->file_type;
names[num_entries_used][(int)current_entry->name_len]='\0'; entries[num_entries_used].name=malloc(current_entry->name_len+1);
strcpy(entries[num_entries_used].name,current_entry->file_name);
entries[num_entries_used].name[(int)current_entry->name_len]='\0';
num_entries_used++; num_entries_used++;
tot_size+=current_entry->rec_len; tot_size+=current_entry->rec_len;
current_entry=(ext2_dir_entry*)(((uint32_t)current_entry)+current_entry->rec_len); current_entry=(ext2_dir_entry*)(((uint32_t)current_entry)+current_entry->rec_len);
} }
if(num_entries_used==max_len) { if(num_entries_used==max_len) {
max_len+=1; max_len+=1;
names=realloc(names,sizeof(char*)*max_len); entries=realloc(entries,sizeof(dir_entry)*max_len);
} }
names[num_entries_used]=NULL; entries[num_entries_used].inode=0;
return names; return entries;
} }
void free_dir_listing(char** names) { void free_dir_listing(char** names) {
for(int i=0;names[i]!=NULL;i++) { // for(int i=0;names[i]!=NULL;i++) {
free(names[i]); // free(names[i]);
} // }
free(names); // free(names);
} }
ext2_dir_entry* read_dir_entry(uint32_t inode_num,uint32_t dir_entry_num,FILE* f,int num) { ext2_dir_entry* read_dir_entry(uint32_t inode_num,uint32_t dir_entry_num,FILE* f,int num) {
@ -286,19 +288,15 @@ ext2_dir_entry* read_dir_entry(uint32_t inode_num,uint32_t dir_entry_num,FILE* f
} }
uint32_t inode_for_fname(uint32_t dir_inode_num, char* name, char* got_inode,FILE* f,int num) { uint32_t inode_for_fname(uint32_t dir_inode_num, char* name, char* got_inode,FILE* f,int num) {
uint32_t node=0;
*got_inode=0; *got_inode=0;
char** names=get_dir_listing(dir_inode_num,f,num); dir_entry* entries=get_dir_listing(dir_inode_num,f,num);
for(int i=0;names[i]!=NULL;i++) { for(int i=0;entries[i].inode!=0;i++) {
if (strcmp(names[i],name)==0) { if (strcmp(entries[i].name,name)==0) {
dir_entry* entry=read_dir_entry(dir_inode_num,i,f,num);
node=entry->inode;
*got_inode=1; *got_inode=1;
break; return entries[i].inode;
} }
} }
//free_dir_listing(names); return 0;
return node;
} }
char* fname_for_inode(uint32_t dir_inode_num, uint32_t inode_num,FILE* f,int num) { char* fname_for_inode(uint32_t dir_inode_num, uint32_t inode_num,FILE* f,int num) {