support . and .. search in find_entry, add init_entry for fake root
This commit is contained in:
parent
051a04ea75
commit
b959e7b093
@ -33,6 +33,8 @@ typedef struct treeNode {
|
|||||||
FileNode *self_info; //self fileNode infromation
|
FileNode *self_info; //self fileNode infromation
|
||||||
} TreeNode;
|
} TreeNode;
|
||||||
|
|
||||||
|
/*for root*/
|
||||||
|
TreeNode *fischl_init_entry(int new_inode_number, const char *fileName, INode *new_inode);
|
||||||
/*root directory have its own initialization, so parent wont be NULL*/
|
/*root directory have its own initialization, so parent wont be NULL*/
|
||||||
int fischl_add_entry(TreeNode *parent, int new_inode_number, const char *fileName, INode *new_inode);
|
int fischl_add_entry(TreeNode *parent, int new_inode_number, const char *fileName, INode *new_inode);
|
||||||
/*if want to use dir mode use the subdirectory treeNode pointer */
|
/*if want to use dir mode use the subdirectory treeNode pointer */
|
||||||
|
@ -127,6 +127,20 @@ void freeTree(TreeNode *node) {
|
|||||||
/*********************************Direntry operation******************************************
|
/*********************************Direntry operation******************************************
|
||||||
|
|
||||||
********************************************************************************************/
|
********************************************************************************************/
|
||||||
|
//for fake root (mount point)
|
||||||
|
TreeNode *fischl_init_entry(int new_inode_number, const char *fileName, INode *new_inode) {
|
||||||
|
TreeNode *newDir = (TreeNode *)malloc(sizeof(TreeNode));
|
||||||
|
newDir->dirName = strdup(fileName);
|
||||||
|
newDir->contents = createHashTable(20);//hashSize define 20
|
||||||
|
newDir->parent = newDir;
|
||||||
|
FileNode *newFile = (FileNode *)malloc(sizeof(FileNode));
|
||||||
|
newFile->name = strdup(fileName);
|
||||||
|
newFile->inode_number = new_inode_number;
|
||||||
|
newFile->permissions = new_inode->permissions;
|
||||||
|
newDir->self_info = newFile;
|
||||||
|
return newDir;
|
||||||
|
}
|
||||||
|
|
||||||
int fischl_add_entry(TreeNode *parent, int new_inode_number, const char *fileName, INode *new_inode){
|
int fischl_add_entry(TreeNode *parent, int new_inode_number, const char *fileName, INode *new_inode){
|
||||||
char *Name = strdup(fileName);
|
char *Name = strdup(fileName);
|
||||||
TreeNode *newDir = NULL;
|
TreeNode *newDir = NULL;
|
||||||
@ -156,6 +170,17 @@ FileNode *fischl_find_entry(TreeNode *root, const char *path){
|
|||||||
FileNode *file = NULL;
|
FileNode *file = NULL;
|
||||||
|
|
||||||
while (segment != NULL && current != NULL) {
|
while (segment != NULL && current != NULL) {
|
||||||
|
if (strcmp(segment, "..") == 0) {
|
||||||
|
// Move up to the parent directory
|
||||||
|
current = current->parent;
|
||||||
|
if (current == NULL) {
|
||||||
|
// If there's no parent, we've reached the top of the tree, but root itself is same
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (strcmp(segment, ".") == 0) {
|
||||||
|
// Stay in the current directory (no action needed)
|
||||||
|
}
|
||||||
|
else{
|
||||||
file = lookupHash(current->contents, segment);
|
file = lookupHash(current->contents, segment);
|
||||||
if (file != NULL && file->subdirectory == NULL) {
|
if (file != NULL && file->subdirectory == NULL) {
|
||||||
free(pathCopy);
|
free(pathCopy);
|
||||||
@ -163,10 +188,16 @@ FileNode *fischl_find_entry(TreeNode *root, const char *path){
|
|||||||
//return current; return filenode
|
//return current; return filenode
|
||||||
}
|
}
|
||||||
current = file ? file->subdirectory : NULL;
|
current = file ? file->subdirectory : NULL;
|
||||||
|
}
|
||||||
segment = strtok(NULL, "/");
|
segment = strtok(NULL, "/");
|
||||||
}
|
}
|
||||||
|
|
||||||
free(pathCopy);
|
free(pathCopy);
|
||||||
|
|
||||||
|
if (current != NULL && file == NULL) {
|
||||||
|
// If we've stopped at a directory and not a file, return the directory's self info
|
||||||
|
return current->self_info;
|
||||||
|
}
|
||||||
|
|
||||||
return file; // NULL if not found
|
return file; // NULL if not found
|
||||||
//return current; return filenode
|
|
||||||
}
|
}
|
@ -12,19 +12,25 @@
|
|||||||
#include "direntry.h"
|
#include "direntry.h"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
TreeNode *root = createDirectory("/", NULL, 20);
|
//Init fake root directory
|
||||||
|
INode inode_root;
|
||||||
|
u_int64_t file_permissions = 0;
|
||||||
|
inode_root.permissions = file_permissions | S_IFDIR;
|
||||||
|
TreeNode *root = fischl_init_entry(0, "/", &inode_root);//0 is inode number assigned by inode_allocate()
|
||||||
|
//add file or dir under fake root
|
||||||
INode inode_file1;
|
INode inode_file1;
|
||||||
fischl_add_entry(root, 2, "file1",&inode_file1);
|
fischl_add_entry(root, 2, "file1",&inode_file1);
|
||||||
//I will put this function in create_new_inode function, there will inode number(2) when inode_allocate
|
//I will put this function in create_new_inode function, there will inode number(2) when inode_allocate
|
||||||
INode inode_dir1;
|
INode inode_dir1;
|
||||||
//permission is necessary there to create treeNode or not
|
//permission is necessary there to create treeNode or not
|
||||||
u_int64_t ddd_permissions = 0;
|
file_permissions = 0;
|
||||||
inode_dir1.permissions = ddd_permissions | S_IFDIR;
|
inode_dir1.permissions = file_permissions | S_IFDIR;
|
||||||
fischl_add_entry(root, 3, "dir1",&inode_dir1);
|
fischl_add_entry(root, 3, "dir1",&inode_dir1);
|
||||||
//find dir file (from root directory view, root contains dir1/ subdirectory)
|
//find dir file (from root directory view, root contains dir1/ subdirectory)
|
||||||
FileNode *get_dir1 = fischl_find_entry(root,"/dir1/");
|
FileNode *get_dir1 = fischl_find_entry(root,"/dir1/");
|
||||||
if(get_dir1 == NULL){
|
if(get_dir1 == NULL){
|
||||||
printf("No dir1 under %s\n",root->dirName);
|
printf("No dir1 under %s\n",root->dirName);
|
||||||
|
freeTree(root);
|
||||||
return -1;
|
return -1;
|
||||||
}else{
|
}else{
|
||||||
fprintf(stderr,"[%s ,%d]",__func__,__LINE__);
|
fprintf(stderr,"[%s ,%d]",__func__,__LINE__);
|
||||||
@ -54,6 +60,7 @@ int main() {
|
|||||||
get_file2 = fischl_find_entry(root,"/dir1/file2");
|
get_file2 = fischl_find_entry(root,"/dir1/file2");
|
||||||
if(get_file2 == NULL){
|
if(get_file2 == NULL){
|
||||||
printf("No dir1 under dir1\n");
|
printf("No dir1 under dir1\n");
|
||||||
|
freeTree(root);
|
||||||
return -1;
|
return -1;
|
||||||
}else{
|
}else{
|
||||||
fprintf(stderr,"[%s ,%d]",__func__,__LINE__);
|
fprintf(stderr,"[%s ,%d]",__func__,__LINE__);
|
||||||
@ -63,6 +70,7 @@ int main() {
|
|||||||
get_file2 = fischl_find_entry(get_dir1->subdirectory,"/file2");
|
get_file2 = fischl_find_entry(get_dir1->subdirectory,"/file2");
|
||||||
if(get_file2 == NULL){
|
if(get_file2 == NULL){
|
||||||
printf("No dir1 under %s\n",get_dir1->subdirectory->dirName);
|
printf("No dir1 under %s\n",get_dir1->subdirectory->dirName);
|
||||||
|
freeTree(root);
|
||||||
return -1;
|
return -1;
|
||||||
}else{
|
}else{
|
||||||
fprintf(stderr,"[%s ,%d]",__func__,__LINE__);
|
fprintf(stderr,"[%s ,%d]",__func__,__LINE__);
|
||||||
@ -80,10 +88,21 @@ int main() {
|
|||||||
get_file3 = fischl_find_entry(get_dir1_tree,"/file3");
|
get_file3 = fischl_find_entry(get_dir1_tree,"/file3");
|
||||||
if(get_file3 == NULL){
|
if(get_file3 == NULL){
|
||||||
printf("No dir1 under %s\n",get_dir1_tree->dirName);
|
printf("No dir1 under %s\n",get_dir1_tree->dirName);
|
||||||
|
freeTree(root);
|
||||||
return -1;
|
return -1;
|
||||||
}else{
|
}else{
|
||||||
printf(" %s under %s\n",get_file3->name,get_dir1_tree->dirName);
|
printf(" %s under %s\n",get_file3->name,get_dir1_tree->dirName);
|
||||||
}
|
}
|
||||||
|
FileNode *get_file1 = NULL;//under root
|
||||||
|
//use .. to find
|
||||||
|
get_file1 = fischl_find_entry(get_dir1_tree,"../file1");
|
||||||
|
if(get_file1 == NULL){
|
||||||
|
printf("No file1\n");
|
||||||
|
freeTree(root);
|
||||||
|
return -1;
|
||||||
|
}else{
|
||||||
|
printf(" %s under root(..)\n",get_file1->name);
|
||||||
|
}
|
||||||
// Cleanup
|
// Cleanup
|
||||||
freeTree(root);
|
freeTree(root);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user