From 2dfd5b7ce1ae99608d65c96274d82e7740c69987 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Mon, 30 Mar 2020 12:52:48 -0400 Subject: [PATCH 01/41] . --- ext2_cp.c | 16 +++++++-------- test.sh | 59 +++++++++++++++++++++++++++++------------------------ utilities.c | 15 ++++++-------- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 9bbec5c..5c515af 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -14,14 +14,11 @@ unsigned char *disk; struct ext2_inode *inodeTable; int main(int argc, char **argv) { - int src_fd; + FILE *src_fd; char parentDirPath[EXT2_NAME_LEN]; char fileName[EXT2_NAME_LEN]; - int fileSize; int parentInodeNum, childInodeNum; - struct ext2_inode parentInode, childInode; - struct ext2_dir_entry_2 *dir_entry = NULL; - int total_rec_len; + struct ext2_inode parentInode; if(argc!=4) { fprintf(stderr, "Usage: ext2_cp \n"); @@ -51,7 +48,7 @@ int main(int argc, char **argv) { } else { getParentDirPath(parentDirPath); } - parentInodeNum = getInodeFromPath(getParentDirPath); + parentInodeNum = getInodeFromPath(parentDirPath); if (parentInodeNum == 0) { fprintf(stderr, "No such file or directory\n"); return ENOENT; @@ -70,15 +67,16 @@ int main(int argc, char **argv) { childInodeNum = initInode('f'); unsigned int *singleIndirect; int nextBlockNum, byteRead; + int fileSize = 0; int i = 0; while (feof(src_fd)) { - nextBlockNum = allocateBlock(); + nextBlockNum = allocateNewBlock(); if (i<12) { inodeTable[childInodeNum].i_block[i] = nextBlockNum; } else if (i==12) { inodeTable[childInodeNum].i_block[i] = nextBlockNum; - singleIndirect = getBlock(nextBlockNum); - nextBlockNum = allocateBlock(); + singleIndirect = (unsigned int *)getBlock(nextBlockNum); + nextBlockNum = allocateNewBlock(); } else { singleIndirect[i-13] = nextBlockNum; } diff --git a/test.sh b/test.sh index e42194f..844eef8 100755 --- a/test.sh +++ b/test.sh @@ -1,42 +1,47 @@ #./readimage twolevel.img # ls -echo "-----test root: <<<./ext2_ls twolevel.img />>>-----" -./ext2_ls twolevel.img / +# echo "-----test root: <<<./ext2_ls twolevel.img />>>-----" +# ./ext2_ls twolevel.img / -echo "-----test root with flag: <<<./ext2_ls twolevel.img -a />>>-----" -./ext2_ls twolevel.img -a / +# echo "-----test root with flag: <<<./ext2_ls twolevel.img -a />>>-----" +# ./ext2_ls twolevel.img -a / -echo "-----test afile: <<<./ext2_ls twolevel.img /afile>>>-----" -./ext2_ls twolevel.img /afile +# echo "-----test afile: <<<./ext2_ls twolevel.img /afile>>>-----" +# ./ext2_ls twolevel.img /afile -echo "-----test afile, <<>>-----" -./ext2_ls twolevel.img -a /afile +# echo "-----test afile, <<>>-----" +# ./ext2_ls twolevel.img -a /afile -echo "-----test afile, this should fail: <<<./ext2_ls twolevel.img -a /afile/>>>-----" -./ext2_ls twolevel.img -a /afile/ +# echo "-----test afile, this should fail: <<<./ext2_ls twolevel.img -a /afile/>>>-----" +# ./ext2_ls twolevel.img -a /afile/ -echo "-----test level1: <<<./ext2_ls twolevel.img /level1>>>-----" -./ext2_ls twolevel.img /level1 +# echo "-----test level1: <<<./ext2_ls twolevel.img /level1>>>-----" +# ./ext2_ls twolevel.img /level1 -echo "-----test level 1 end with '/': <<<./ext2_ls twolevel.img -a /level1/>>>-----" -./ext2_ls twolevel.img -a /level1/ +# echo "-----test level 1 end with '/': <<<./ext2_ls twolevel.img -a /level1/>>>-----" +# ./ext2_ls twolevel.img -a /level1/ -echo "-----test level2: <<<./ext2_ls twolevel.img -a /level1/level2>>>-----" -./ext2_ls twolevel.img -a /level1/level2 +# echo "-----test level2: <<<./ext2_ls twolevel.img -a /level1/level2>>>-----" +# ./ext2_ls twolevel.img -a /level1/level2 -echo "-----test bfile: <<<./ext2_ls twolevel.img -a /level1/level2/bfile>>>-----" -./ext2_ls twolevel.img -a /level1/level2/bfile +# echo "-----test bfile: <<<./ext2_ls twolevel.img -a /level1/level2/bfile>>>-----" +# ./ext2_ls twolevel.img -a /level1/level2/bfile -echo "-----test bfile, this should fail: <<<./ext2_ls twolevel.img -a /level1/level2/bfile/>>>-----" -./ext2_ls twolevel.img -a /level1/level2/bfile/ +# echo "-----test bfile, this should fail: <<<./ext2_ls twolevel.img -a /level1/level2/bfile/>>>-----" +# ./ext2_ls twolevel.img -a /level1/level2/bfile/ -echo "-----test non-exist path, this should fail: <<<./ext2_ls twolevel.img -a /level1/level2/cfile>>>-----" -./ext2_ls twolevel.img -a /level1/level2/cfile +# echo "-----test non-exist path, this should fail: <<<./ext2_ls twolevel.img -a /level1/level2/cfile>>>-----" +# ./ext2_ls twolevel.img -a /level1/level2/cfile -echo "-----test no input image file, this should fail: <<<./ext2_ls twolevel.img>>>-----" -./ext2_ls twolevel.img +# echo "-----test no input image file, this should fail: <<<./ext2_ls twolevel.img>>>-----" +# ./ext2_ls twolevel.img -# note: the bfilee.s file in the disk contain an 16 character! below testcase should actually fail -echo "-----test print a file name, this should work but fail: <<<./ext2_ls onedirectory.img /level1/bfilee.s>>>-----" -./ext2_ls onedirectory.img /level1/bfilee.s +# # note: the bfilee.s file in the disk contain an 16 character! below testcase should actually fail +# echo "-----test print a file name, this should work but fail: <<<./ext2_ls onedirectory.img /level1/bfilee.s>>>-----" +# ./ext2_ls onedirectory.img /level1/bfilee.s + +# cp +./readimage emptydisk.img +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /hello.txt +./readimage emptydisk.img \ No newline at end of file diff --git a/utilities.c b/utilities.c index e2c5523..471967c 100644 --- a/utilities.c +++ b/utilities.c @@ -165,7 +165,7 @@ int searchFileInDir(struct ext2_inode *inode, char *fileName) { // search in single indirect block if (inode->i_block[12] != 0) { // for each block number in single indirect block - singleIndirect = getBlock(inode->i_block[12]); + singleIndirect = (unsigned int *)getBlock(inode->i_block[12]); for(int i = 0; ii_block[12] != 0); + if (parent_inode->i_block[12] != 0) { // for each block number in single indirect block - singleIndirect = getBlock(parent_inode->i_block[12]); + singleIndirect = (unsigned int *)getBlock(parent_inode->i_block[12]); for(int i = 0; iinode = childInodeNum; newDirent->file_type = type; - newDirent->name_len = strlen; + newDirent->name_len = (unsigned char) strlen; strcpy(newDirent->name, fileName); return newDirent; } From 7c7a7882e3957672b3ac436eb28c2b3b4c206e67 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Mon, 30 Mar 2020 13:43:37 -0400 Subject: [PATCH 02/41] . --- ext2_cp.c | 5 ++++- utilities.c | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 5c515af..b99537f 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -36,6 +36,7 @@ int main(int argc, char **argv) { // open native file for read if((src_fd = fopen(argv[2], "r")) == NULL) { + perror("src_fd"); fprintf(stderr, "No such file or directory\n"); return ENOENT; } @@ -43,6 +44,7 @@ int main(int argc, char **argv) { // get the parent directory inode strcpy(parentDirPath, argv[3]); if (parentDirPath[0]!='/') { + perror("Invalid parentDirPath"); fprintf(stderr, "No such file or directory\n"); return ENOENT; } else { @@ -50,6 +52,7 @@ int main(int argc, char **argv) { } parentInodeNum = getInodeFromPath(parentDirPath); if (parentInodeNum == 0) { + perror("parentDirPath not exist"); fprintf(stderr, "No such file or directory\n"); return ENOENT; } @@ -58,7 +61,7 @@ int main(int argc, char **argv) { // check file exist getFileNameFromPath(fileName, argv[3]); childInodeNum = searchFileInDir(&parentInode, fileName); - if (parentInodeNum != 0) { + if (childInodeNum != 0) { fprintf(stderr, "File or directory already exist\n"); return EEXIST; } diff --git a/utilities.c b/utilities.c index 471967c..98338c4 100644 --- a/utilities.c +++ b/utilities.c @@ -258,7 +258,7 @@ struct ext2_dir_entry_2 *allocateNewDirent(struct ext2_inode *parentInode, int c // initialize new dir_entry newDirent->inode = childInodeNum; newDirent->file_type = type; - newDirent->name_len = (unsigned char) strlen; + newDirent->name_len = (unsigned char) name_len; strcpy(newDirent->name, fileName); return newDirent; } From 50c05e601754441958875d39d721f0502f39148f Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Mon, 30 Mar 2020 14:58:57 -0400 Subject: [PATCH 03/41] . --- ext2_cp.c | 20 ++++++++++++-------- utilities.c | 18 ++++++++++++++++-- utilities.h | 4 +++- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index b99537f..970b19f 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -18,7 +18,7 @@ int main(int argc, char **argv) { char parentDirPath[EXT2_NAME_LEN]; char fileName[EXT2_NAME_LEN]; int parentInodeNum, childInodeNum; - struct ext2_inode parentInode; + struct ext2_inode parentInode, childInode; if(argc!=4) { fprintf(stderr, "Usage: ext2_cp \n"); @@ -67,17 +67,19 @@ int main(int argc, char **argv) { } // create file and cp - childInodeNum = initInode('f'); + childInodeNum = initInode(EXT2_S_IFREG)+1; + childInode = inodeTable[parentInodeNum-1]; unsigned int *singleIndirect; int nextBlockNum, byteRead; int fileSize = 0; int i = 0; - while (feof(src_fd)) { + while (!feof(src_fd)) { nextBlockNum = allocateNewBlock(); +printf("Block %d is allocated for cp content with content:\n", nextBlockNum); if (i<12) { - inodeTable[childInodeNum].i_block[i] = nextBlockNum; + childInode.i_block[i] = nextBlockNum; } else if (i==12) { - inodeTable[childInodeNum].i_block[i] = nextBlockNum; + childInode.i_block[i] = nextBlockNum; singleIndirect = (unsigned int *)getBlock(nextBlockNum); nextBlockNum = allocateNewBlock(); } else { @@ -85,13 +87,15 @@ int main(int argc, char **argv) { } byteRead = fread(getBlock(nextBlockNum), 1024, 1, src_fd); +printf("%s\n", getBlock(nextBlockNum)); fileSize += byteRead; i++; } + fclose(src_fd); // uptate inode filed - inodeTable[childInodeNum].i_size = fileSize; - inodeTable[childInodeNum].i_blocks = (fileSize+511)/512; - + childInode.i_size = fileSize; + childInode.i_blocks = (fileSize+511)/512; +printInode(&childInode); // add dir_entry fot this file into parent dir allocateNewDirent(&parentInode, childInodeNum, 'f', fileName); } \ No newline at end of file diff --git a/utilities.c b/utilities.c index 98338c4..7230028 100644 --- a/utilities.c +++ b/utilities.c @@ -69,7 +69,7 @@ struct ext2_inode *getInodeTable() { } -int initInode(char mode) { +int initInode(unsigned short mode) { // find the first free inode int index = getFirstEmptyBitIndex(getInodeBitmap(), getSuperblock()->s_inodes_count); @@ -121,6 +121,20 @@ void deleteInode(int index) { } } +void printInode(struct ext2_inode *inode) +{ + printf("i_mode: %d\n", inode->i_mode); + printf("i_size: %d\n", inode->i_size); + printf("i_links_count: %d\n", inode->i_links_count); + printf("i_blocks: %d\n", inode->i_blocks); + printf("i_block:\n\t"); + for(int i=0; i<15; i++) { + printf("[%d]: %d ", i, inode->i_block[i]); + } + printf("\n\n"); +} + + // block char unsigned *getBlock(int blockNum) { return (char unsigned*)(disk+blockNum*EXT2_BLOCK_SIZE); @@ -129,7 +143,7 @@ char unsigned *getBlock(int blockNum) { int allocateNewBlock() { int index = getFirstEmptyBitIndex(getBlockBitmap(), getSuperblock()->s_blocks_count); changeBitmap(getBlockBitmap(), index, 'a'); - return index; + return index+1; } // dir_entry diff --git a/utilities.h b/utilities.h index 72ae72b..36be478 100644 --- a/utilities.h +++ b/utilities.h @@ -33,10 +33,12 @@ void changeBitmap(char unsigned *bitmap, int idx, char mode); // inode struct ext2_inode *getInodeTable(void); -int initInode(char mode); +int initInode(unsigned short mode); void deleteInode(int index); +void printInode(struct ext2_inode *inode); + // block char unsigned *getBlock(int blockNum); From eb566634cf95551d990037d56d66f37d28ae2a7d Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Mon, 30 Mar 2020 15:55:11 -0400 Subject: [PATCH 04/41] . --- ext2_cp.c | 2 +- ext2_ls.c | 4 ++-- utilities.c | 8 ++++++++ utilities.h | 2 ++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 970b19f..c7c7afe 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -68,7 +68,7 @@ int main(int argc, char **argv) { // create file and cp childInodeNum = initInode(EXT2_S_IFREG)+1; - childInode = inodeTable[parentInodeNum-1]; + childInode = inodeTable[childInodeNum-1]; unsigned int *singleIndirect; int nextBlockNum, byteRead; int fileSize = 0; diff --git a/ext2_ls.c b/ext2_ls.c index 1cbfbe1..6ca7339 100644 --- a/ext2_ls.c +++ b/ext2_ls.c @@ -21,7 +21,7 @@ int main(int argc, char **argv) { struct ext2_inode inode; struct ext2_dir_entry_2 *dir_entry = NULL; int total_rec_len; - unsigned char *singleIndirect; + unsigned int *singleIndirect; if(argc!=3 && argc!=4) { fprintf(stderr, "Usage: ext2_ls \n"); @@ -82,7 +82,7 @@ int main(int argc, char **argv) { // print file in single indirect blocks if (inode.i_block[12] != 0) { - singleIndirect = getBlock(inode.i_block[12]); + singleIndirect = initSingleIndirect(inode.i_block[12]); for(int i = 0; i Date: Mon, 30 Mar 2020 15:56:16 -0400 Subject: [PATCH 05/41] . --- ext2_cp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext2_cp.c b/ext2_cp.c index c7c7afe..ab85dd4 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -80,7 +80,7 @@ printf("Block %d is allocated for cp content with content:\n", nextBlockNum); childInode.i_block[i] = nextBlockNum; } else if (i==12) { childInode.i_block[i] = nextBlockNum; - singleIndirect = (unsigned int *)getBlock(nextBlockNum); + singleIndirect = initSingleIndirect(nextBlockNum); nextBlockNum = allocateNewBlock(); } else { singleIndirect[i-13] = nextBlockNum; From 887899db9be8c8a8d940cdaa5a28618537aaf0fb Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Mon, 30 Mar 2020 17:25:51 -0400 Subject: [PATCH 06/41] . --- ext2_cp.c | 6 ++++-- ext2_ls.c | 2 +- test.sh | 4 +++- utilities.c | 30 +++++++++++++++++++++--------- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index ab85dd4..7a1552e 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -75,7 +75,7 @@ int main(int argc, char **argv) { int i = 0; while (!feof(src_fd)) { nextBlockNum = allocateNewBlock(); -printf("Block %d is allocated for cp content with content:\n", nextBlockNum); +printf("Block %d is allocated for cp, content is:\n", nextBlockNum); if (i<12) { childInode.i_block[i] = nextBlockNum; } else if (i==12) { @@ -86,13 +86,15 @@ printf("Block %d is allocated for cp content with content:\n", nextBlockNum); singleIndirect[i-13] = nextBlockNum; } - byteRead = fread(getBlock(nextBlockNum), 1024, 1, src_fd); + byteRead = fread(getBlock(nextBlockNum), 1, 1024, src_fd); printf("%s\n", getBlock(nextBlockNum)); +printf("total %d bytes in this block\n", byteRead); fileSize += byteRead; i++; } fclose(src_fd); // uptate inode filed +printf("file size: %d\n", fileSize); childInode.i_size = fileSize; childInode.i_blocks = (fileSize+511)/512; printInode(&childInode); diff --git a/ext2_ls.c b/ext2_ls.c index 6ca7339..ce7e75e 100644 --- a/ext2_ls.c +++ b/ext2_ls.c @@ -82,7 +82,7 @@ int main(int argc, char **argv) { // print file in single indirect blocks if (inode.i_block[12] != 0) { - singleIndirect = initSingleIndirect(inode.i_block[12]); + singleIndirect = (unsigned int *)getBlock(inode.i_block[12]); for(int i = 0; is_inodes_count); - // change its bitmap + // change its bitmap and update field in gd char unsigned *bitmap = getInodeBitmap(); changeBitmap(bitmap, index, 'a'); + getGroupDesc()->bg_free_inodes_count--; // initialize inode attribute struct ext2_inode *inode_table = getInodeTable(); @@ -97,26 +98,29 @@ void deleteInode(int index) { // change inode bitmap changeBitmap(inode_bitmap, index, 'd'); + getGroupDesc()->bg_free_inodes_count++; struct ext2_inode *inode_table = getInodeTable(); struct ext2_inode target = inode_table[index]; // delete the block bitmap int i; - int block_num; for(i = 0; i<12;i++) { - block_num = target.i_block[i]; - changeBitmap(block_bitmap, block_num, 'd'); + if (target.i_block[i] != 0) { + changeBitmap(block_bitmap, target.i_block[i], 'd'); + getGroupDesc()->bg_free_blocks_count++; + } } // delete single indirect int bp = target.i_block[12]; if (bp != 0) { - unsigned char *single = getBlock(bp); - i=0; - while(single[i] != 0) { - changeBitmap(block_bitmap, single[i], 'd'); - i++; + unsigned int *single = (unsigned int*)getBlock(bp); + for (int i=0; ibg_free_blocks_count++; + } } } } @@ -131,6 +135,13 @@ void printInode(struct ext2_inode *inode) for(int i=0; i<15; i++) { printf("[%d]: %d ", i, inode->i_block[i]); } + if(inode->i_block[12] != 0) { + printf("\nfirst 15 single indirect:\n\t"); + unsigned int *singleIndirect = (unsigned int *)getBlock(inode->i_block[12]); + for(int i=0; i<15; i++) { + printf("[%d]: %d ", i, singleIndirect[i]); + } + } printf("\n\n"); } @@ -143,6 +154,7 @@ char unsigned *getBlock(int blockNum) { int allocateNewBlock() { int index = getFirstEmptyBitIndex(getBlockBitmap(), getSuperblock()->s_blocks_count); changeBitmap(getBlockBitmap(), index, 'a'); + getGroupDesc()->bg_free_blocks_count--; return index+1; } From 80edc57c01c1e405d6aec28e11ee8ca5362d0433 Mon Sep 17 00:00:00 2001 From: GuikangZhong Date: Mon, 30 Mar 2020 19:09:10 -0400 Subject: [PATCH 07/41] debug print in ls --- ext2_ls.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/ext2_ls.c b/ext2_ls.c index ce7e75e..f7a9974 100644 --- a/ext2_ls.c +++ b/ext2_ls.c @@ -21,7 +21,7 @@ int main(int argc, char **argv) { struct ext2_inode inode; struct ext2_dir_entry_2 *dir_entry = NULL; int total_rec_len; - unsigned int *singleIndirect; + unsigned char *singleIndirect; if(argc!=3 && argc!=4) { fprintf(stderr, "Usage: ext2_ls \n"); @@ -57,32 +57,29 @@ int main(int argc, char **argv) { return ENOENT; } inode = inodeTable[inodeNum-1]; - + // print all file nemes in directory data block if (inode.i_mode & EXT2_S_IFDIR) { // print file names in direct blocks for (int i=0; i<12; i++) { - if (inode.i_block[i] == 0){ - continue; - } else { + if (inode.i_block[i] != 0){ dir_entry = (struct ext2_dir_entry_2 *)getBlock(inode.i_block[i]); - } - - // for each dir entry in the block - total_rec_len = 0; - while (total_rec_len < EXT2_BLOCK_SIZE) { - if (dir_entry->name[0]!='.' || flagged) { - printf("%s\n", dir_entry->name); + // for each dir entry in the block + total_rec_len = 0; + while (total_rec_len < EXT2_BLOCK_SIZE) { + if ((dir_entry->name[0]!='.' || flagged) && (dir_entry->name[0] != '\0')) { + printf("%s\n", dir_entry->name); + } + total_rec_len = total_rec_len + dir_entry->rec_len; + dir_entry = (void *) dir_entry + dir_entry->rec_len; } - total_rec_len = total_rec_len + dir_entry->rec_len; - dir_entry = (void *) dir_entry + dir_entry->rec_len; } } // print file in single indirect blocks if (inode.i_block[12] != 0) { - singleIndirect = (unsigned int *)getBlock(inode.i_block[12]); + singleIndirect = getBlock(inode.i_block[12]); for(int i = 0; i Date: Mon, 30 Mar 2020 21:07:23 -0400 Subject: [PATCH 08/41] change index in getFirstEmptyBitIndex --- utilities.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utilities.c b/utilities.c index 5d91b85..0f1c551 100644 --- a/utilities.c +++ b/utilities.c @@ -34,7 +34,7 @@ int getBit(char unsigned * bitmap, int index) { } int getFirstEmptyBitIndex(char unsigned * bitmap, int maxLength) { - int index = 0; + int index = 11; while (index < maxLength) { if (getBit(bitmap, index) == 0) { return index; @@ -363,4 +363,4 @@ void getParentDirPath(char *path) { path[len-1] = '\0'; char *target = strrchr(path, '/'); *(target+1) = '\0'; -} \ No newline at end of file +} From a1e7d071a7c53a92bd94ad8c22d28f04c9c38042 Mon Sep 17 00:00:00 2001 From: GuikangZhong <48389832+GuikangZhong@users.noreply.github.com> Date: Mon, 30 Mar 2020 21:28:43 -0400 Subject: [PATCH 09/41] use s_first_ino --- utilities.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utilities.c b/utilities.c index 0f1c551..0ed6962 100644 --- a/utilities.c +++ b/utilities.c @@ -34,7 +34,7 @@ int getBit(char unsigned * bitmap, int index) { } int getFirstEmptyBitIndex(char unsigned * bitmap, int maxLength) { - int index = 11; + int index = s_first_ino - 1; while (index < maxLength) { if (getBit(bitmap, index) == 0) { return index; From e31474e8870c22fd5a4b12a00c7dac32496f6362 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Mon, 30 Mar 2020 23:39:20 -0400 Subject: [PATCH 10/41] .. --- utilities.c | 18 ++++++++++++++---- utilities.h | 9 ++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/utilities.c b/utilities.c index 0ed6962..9e317ac 100644 --- a/utilities.c +++ b/utilities.c @@ -33,8 +33,18 @@ int getBit(char unsigned * bitmap, int index) { return (bitmap[index/8]>>index%8)&1; } -int getFirstEmptyBitIndex(char unsigned * bitmap, int maxLength) { - int index = s_first_ino - 1; +int getFirstEmptyBitIndex(int bitmapNum) { + int index, maxLength; + unsigned char *bitmap; + if (bitmapNum == INODE_BITMAP) { + index = EXT2_GOOD_OLD_FIRST_INO; + maxLength = getSuperblock()->s_inodes_count; + bitmap = getInodeBitmap(); + } else { + index = 0; + maxLength = getSuperblock()->s_blocks_count; + bitmap = getBlockBitmap(); + } while (index < maxLength) { if (getBit(bitmap, index) == 0) { return index; @@ -72,7 +82,7 @@ struct ext2_inode *getInodeTable() { int initInode(unsigned short mode) { // find the first free inode - int index = getFirstEmptyBitIndex(getInodeBitmap(), getSuperblock()->s_inodes_count); + int index = getFirstEmptyBitIndex(INODE_BITMAP); // change its bitmap and update field in gd char unsigned *bitmap = getInodeBitmap(); @@ -152,7 +162,7 @@ char unsigned *getBlock(int blockNum) { } int allocateNewBlock() { - int index = getFirstEmptyBitIndex(getBlockBitmap(), getSuperblock()->s_blocks_count); + int index = getFirstEmptyBitIndex(BLOCK_BITMAP); changeBitmap(getBlockBitmap(), index, 'a'); getGroupDesc()->bg_free_blocks_count--; return index+1; diff --git a/utilities.h b/utilities.h index 270c51e..c165ac4 100644 --- a/utilities.h +++ b/utilities.h @@ -9,8 +9,11 @@ #include #include "ext2.h" -#define TRUE 1; -#define FALSE 0; +#define TRUE 1 +#define FALSE 0 + +#define INODE_BITMAP 1 +#define BLOCK_BITMAP 0 extern char unsigned *disk; @@ -26,7 +29,7 @@ char unsigned *getInodeBitmap(void); int getBit(char unsigned * bitmap, int index); -int getFirstEmptyBitIndex(char unsigned * bitmap, int maxLength); +int getFirstEmptyBitIndex(int bitmap); void changeBitmap(char unsigned *bitmap, int idx, char mode); From da7fc49f51697ec1c07299705ee8ad8a058d7244 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Tue, 31 Mar 2020 01:20:47 -0400 Subject: [PATCH 11/41] . --- ext2_cp.c | 2 +- utilities.c | 50 +++++++++++++++++++++++++++++++++++++------------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 7a1552e..61236b6 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -81,7 +81,7 @@ printf("Block %d is allocated for cp, content is:\n", nextBlockNum); } else if (i==12) { childInode.i_block[i] = nextBlockNum; singleIndirect = initSingleIndirect(nextBlockNum); - nextBlockNum = allocateNewBlock(); + continue; } else { singleIndirect[i-13] = nextBlockNum; } diff --git a/utilities.c b/utilities.c index 9e317ac..9d3f74a 100644 --- a/utilities.c +++ b/utilities.c @@ -228,29 +228,53 @@ int calculateActuralSize(struct ext2_dir_entry_2 *dirent) { } struct ext2_dir_entry_2 *initDirent(struct ext2_inode *parent_inode, int size) { - struct ext2_dir_entry_2 *new_dir_entry; unsigned int *singleIndirect; - - // search in direct block + struct ext2_dir_entry_2 *new_dir_entry = NULL; + // search in all used direct block for(int i = 0; i<12;i++) { - if (parent_inode->i_block[i] == 0) - continue; - new_dir_entry = initDirentDDB(parent_inode->i_block[i], size); - if (new_dir_entry!=NULL) - return new_dir_entry; + if (parent_inode->i_block[i] != 0) { + new_dir_entry = initDirentDDB(parent_inode->i_block[i], size); + if (new_dir_entry!=NULL) + return new_dir_entry; + } } + // search in single indirect block if (parent_inode->i_block[12] != 0) { // for each block number in single indirect block singleIndirect = (unsigned int *)getBlock(parent_inode->i_block[12]); for(int i = 0; ii_block[i] != 0) { + continue; } + + int newBlockNum = allocateNewBlock(); + if (i<12) { + parent_inode->i_block[i] = newBlockNum; + } else if (i==12) { + parent_inode->i_block[i] = newBlockNum; + singleIndirect = initSingleIndirect(parent_inode->i_block[i]); + continue; + } else { + singleIndirect[i-13] = newBlockNum; + } + + new_dir_entry = (struct ext2_dir_entry_2 *)getBlock(newBlockNum); + parent_inode->i_blocks+=EXT2_BLOCK_SIZE/512; + parent_inode->i_size+=EXT2_BLOCK_SIZE; + new_dir_entry->rec_len=EXT2_BLOCK_SIZE; + return new_dir_entry; } return NULL; } From 7b5e56358e437ce5c83b85beadb548873b83bd3d Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Tue, 31 Mar 2020 01:27:24 -0400 Subject: [PATCH 12/41] . --- utilities.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utilities.c b/utilities.c index 9d3f74a..2ac4b85 100644 --- a/utilities.c +++ b/utilities.c @@ -254,7 +254,7 @@ struct ext2_dir_entry_2 *initDirent(struct ext2_inode *parent_inode, int size) { } // if we cannot find a space, try to allocate a new direct block - for(int i = 0; i<12;i++) { + for(int i = 0; i<13+EXT2_BLOCK_SIZE/4;i++) { if (parent_inode->i_block[i] != 0) { continue; } From c770a2a2e0f17d96825d4476caddb5eb7cee39a3 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Tue, 31 Mar 2020 01:39:05 -0400 Subject: [PATCH 13/41] .. --- ext2_cp.c | 2 +- utilities.c | 12 ++++++------ utilities.h | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 61236b6..d541292 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -99,5 +99,5 @@ printf("file size: %d\n", fileSize); childInode.i_blocks = (fileSize+511)/512; printInode(&childInode); // add dir_entry fot this file into parent dir - allocateNewDirent(&parentInode, childInodeNum, 'f', fileName); + initNewDirent(&parentInode, childInodeNum, EXT2_FT_REG_FILE, fileName); } \ No newline at end of file diff --git a/utilities.c b/utilities.c index 2ac4b85..46e444b 100644 --- a/utilities.c +++ b/utilities.c @@ -227,13 +227,13 @@ int calculateActuralSize(struct ext2_dir_entry_2 *dirent) { return sizeof(struct ext2_dir_entry_2) + ((dirent->name_len+4)/4)*4; } -struct ext2_dir_entry_2 *initDirent(struct ext2_inode *parent_inode, int size) { +struct ext2_dir_entry_2 *allocateNewDirent(struct ext2_inode *parent_inode, int size) { unsigned int *singleIndirect; struct ext2_dir_entry_2 *new_dir_entry = NULL; // search in all used direct block for(int i = 0; i<12;i++) { if (parent_inode->i_block[i] != 0) { - new_dir_entry = initDirentDDB(parent_inode->i_block[i], size); + new_dir_entry = allocateDirentHelper(parent_inode->i_block[i], size); if (new_dir_entry!=NULL) return new_dir_entry; } @@ -246,7 +246,7 @@ struct ext2_dir_entry_2 *initDirent(struct ext2_inode *parent_inode, int size) { singleIndirect = (unsigned int *)getBlock(parent_inode->i_block[12]); for(int i = 0; iinode = childInodeNum; diff --git a/utilities.h b/utilities.h index c165ac4..c495a6f 100644 --- a/utilities.h +++ b/utilities.h @@ -52,11 +52,11 @@ int searchFileInDir(struct ext2_inode *inode, char *fileName); int calculateActuralSize(struct ext2_dir_entry_2 *dirent); -struct ext2_dir_entry_2 *initDirent(struct ext2_inode *parent_inode, int size); +struct ext2_dir_entry_2 *allocateNewDirent(struct ext2_inode *parent_inode, int size); -struct ext2_dir_entry_2 *initDirentDDB(int blockNum, int size); +struct ext2_dir_entry_2 *allocateDirentHelper(int blockNum, int size); -struct ext2_dir_entry_2 *allocateNewDirent(struct ext2_inode *parentInode, int childInodeNum, char type, char *fileName); +struct ext2_dir_entry_2 *initNewDirent(struct ext2_inode *parentInode, int childInodeNum, int type, char *fileName); unsigned int *initSingleIndirect(int blockNum); From f77e20bedb6a3c2e417fe3fd831e6e49e3cd91af Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Tue, 31 Mar 2020 08:58:32 -0400 Subject: [PATCH 14/41] , --- ext2_cp.c | 7 +++++-- utilities.c | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index d541292..a1738ff 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -69,7 +69,7 @@ int main(int argc, char **argv) { // create file and cp childInodeNum = initInode(EXT2_S_IFREG)+1; childInode = inodeTable[childInodeNum-1]; - unsigned int *singleIndirect; + unsigned int *singleIndirect = NULL; int nextBlockNum, byteRead; int fileSize = 0; int i = 0; @@ -96,7 +96,10 @@ printf("total %d bytes in this block\n", byteRead); // uptate inode filed printf("file size: %d\n", fileSize); childInode.i_size = fileSize; - childInode.i_blocks = (fileSize+511)/512; + if (singleIndirect == NULL) + childInode.i_blocks = ((fileSize+1023)/1024)*2; + else + childInode.i_blocks = ((fileSize+1023)/1024)*2+1; printInode(&childInode); // add dir_entry fot this file into parent dir initNewDirent(&parentInode, childInodeNum, EXT2_FT_REG_FILE, fileName); diff --git a/utilities.c b/utilities.c index 46e444b..af20b17 100644 --- a/utilities.c +++ b/utilities.c @@ -125,6 +125,7 @@ void deleteInode(int index) { int bp = target.i_block[12]; if (bp != 0) { + // delete blocks in single unsigned int *single = (unsigned int*)getBlock(bp); for (int i=0; ibg_free_blocks_count++; } } + + // delte single itself + changeBitmap(block_bitmap, target.i_block[12], 'd'); + getGroupDesc()->bg_free_blocks_count++; } } From 99e6d6c27d8c7e2798ba82795a19b08706ba6cea Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Tue, 31 Mar 2020 09:25:38 -0400 Subject: [PATCH 15/41] .. --- ext2_ls.c | 55 +++++++++++++++++++++-------------------------------- utilities.c | 12 +++++++----- 2 files changed, 29 insertions(+), 38 deletions(-) diff --git a/ext2_ls.c b/ext2_ls.c index f7a9974..c8dd99b 100644 --- a/ext2_ls.c +++ b/ext2_ls.c @@ -19,9 +19,6 @@ int main(int argc, char **argv) { char fileName[EXT2_NAME_LEN]; int flagged = FALSE; struct ext2_inode inode; - struct ext2_dir_entry_2 *dir_entry = NULL; - int total_rec_len; - unsigned char *singleIndirect; if(argc!=3 && argc!=4) { fprintf(stderr, "Usage: ext2_ls \n"); @@ -60,41 +57,33 @@ int main(int argc, char **argv) { // print all file nemes in directory data block if (inode.i_mode & EXT2_S_IFDIR) { + struct ext2_dir_entry_2 *dir_entry = NULL; + unsigned int *singleIndirect = NULL; + int total_rec_len = 0; // print file names in direct blocks - for (int i=0; i<12; i++) { - if (inode.i_block[i] != 0){ + for (int i=0; i<13+EXT2_BLOCK_SIZE/4; i++) { + + if (i<12) { + if (inode.i_block[i] == 0) continue; dir_entry = (struct ext2_dir_entry_2 *)getBlock(inode.i_block[i]); - // for each dir entry in the block - total_rec_len = 0; - while (total_rec_len < EXT2_BLOCK_SIZE) { - if ((dir_entry->name[0]!='.' || flagged) && (dir_entry->name[0] != '\0')) { - printf("%s\n", dir_entry->name); - } - total_rec_len = total_rec_len + dir_entry->rec_len; - dir_entry = (void *) dir_entry + dir_entry->rec_len; - } + } else if (i==12) { + if (inode.i_block[i] == 0) break; + singleIndirect = (unsigned int *)getBlock(inode.i_block[12]); + continue; + } else { + if (singleIndirect[i-13] == 0) continue; + dir_entry = (struct ext2_dir_entry_2 *)getBlock(singleIndirect[i-13]); } - } - - // print file in single indirect blocks - if (inode.i_block[12] != 0) { - singleIndirect = getBlock(inode.i_block[12]); - for(int i = 0; iname[0]!='.' || flagged) { - printf("%s\n", dir_entry->name); - } - total_rec_len = total_rec_len + dir_entry->rec_len; - dir_entry = (void *) dir_entry + dir_entry->rec_len; + + // for each dir entry in the block + total_rec_len = 0; + while (total_rec_len < EXT2_BLOCK_SIZE) { + if ((dir_entry->name[0]!='.' || flagged) && (dir_entry->name[0] != '\0')) { + printf("%s\n", dir_entry->name); } + total_rec_len = total_rec_len + dir_entry->rec_len; + dir_entry = (void *) dir_entry + dir_entry->rec_len; } } diff --git a/utilities.c b/utilities.c index af20b17..099398d 100644 --- a/utilities.c +++ b/utilities.c @@ -259,19 +259,21 @@ struct ext2_dir_entry_2 *allocateNewDirent(struct ext2_inode *parent_inode, int } // if we cannot find a space, try to allocate a new direct block + int newBlockNum = 0; for(int i = 0; i<13+EXT2_BLOCK_SIZE/4;i++) { - if (parent_inode->i_block[i] != 0) { - continue; - } - - int newBlockNum = allocateNewBlock(); if (i<12) { + if (parent_inode->i_block[i] != 0) continue; + newBlockNum = allocateNewBlock(); parent_inode->i_block[i] = newBlockNum; } else if (i==12) { + if (parent_inode->i_block[i] != 0) break; + newBlockNum = allocateNewBlock(); parent_inode->i_block[i] = newBlockNum; singleIndirect = initSingleIndirect(parent_inode->i_block[i]); continue; } else { + if (singleIndirect[i-13] != 0) continue; + newBlockNum = allocateNewBlock(); singleIndirect[i-13] = newBlockNum; } From ff7ff0728cc01ebfe8d051b54dfbf6f644a8d00f Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Tue, 31 Mar 2020 10:23:36 -0400 Subject: [PATCH 16/41] . --- utilities.c | 22 +++++++++++++++++----- utilities.h | 4 +++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/utilities.c b/utilities.c index 099398d..289525e 100644 --- a/utilities.c +++ b/utilities.c @@ -78,7 +78,14 @@ struct ext2_inode *getInodeTable() { return (struct ext2_inode *)(disk+gd->bg_inode_table*EXT2_BLOCK_SIZE); } +struct ext2_inode *getInode(int inodeNum) { + struct ext2_inode *inodeTable = getInodeTable(); + return &inodeTable[inodeNum-1]; +} +/** + * return new intialized inode number + */ int initInode(unsigned short mode) { // find the first free inode @@ -98,20 +105,20 @@ int initInode(unsigned short mode) { for(int i=0; i<15; i++) { inode_table[index].i_block[i] = 0; } - return index; + return index+1; } -void deleteInode(int index) { +void deleteInode(int inodeNum) { char unsigned *inode_bitmap = getInodeBitmap(); char unsigned *block_bitmap = getBlockBitmap(); // change inode bitmap - changeBitmap(inode_bitmap, index, 'd'); + changeBitmap(inode_bitmap, inodeNum-1, 'd'); getGroupDesc()->bg_free_inodes_count++; struct ext2_inode *inode_table = getInodeTable(); - struct ext2_inode target = inode_table[index]; + struct ext2_inode target = inode_table[inodeNum-1]; // delete the block bitmap int i; @@ -163,9 +170,14 @@ void printInode(struct ext2_inode *inode) // block char unsigned *getBlock(int blockNum) { - return (char unsigned*)(disk+blockNum*EXT2_BLOCK_SIZE); + if (blockNum < 1) + perror("getBlock (numbering start at 1)"); + return (char unsigned*)(disk+(blockNum-1)*EXT2_BLOCK_SIZE); } +/** + * return new allocated block number + */ int allocateNewBlock() { int index = getFirstEmptyBitIndex(BLOCK_BITMAP); changeBitmap(getBlockBitmap(), index, 'a'); diff --git a/utilities.h b/utilities.h index c495a6f..6a9a00d 100644 --- a/utilities.h +++ b/utilities.h @@ -36,9 +36,11 @@ void changeBitmap(char unsigned *bitmap, int idx, char mode); // inode struct ext2_inode *getInodeTable(void); +struct ext2_inode *getInode(int inodeNum); + int initInode(unsigned short mode); -void deleteInode(int index); +void deleteInode(int inodeNum); void printInode(struct ext2_inode *inode); From 79cf7ed87ac15bbfebda7b16919f3be4a9d21826 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Tue, 31 Mar 2020 10:45:35 -0400 Subject: [PATCH 17/41] .. --- utilities.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utilities.c b/utilities.c index 289525e..0e6b1b4 100644 --- a/utilities.c +++ b/utilities.c @@ -170,9 +170,9 @@ void printInode(struct ext2_inode *inode) // block char unsigned *getBlock(int blockNum) { - if (blockNum < 1) - perror("getBlock (numbering start at 1)"); - return (char unsigned*)(disk+(blockNum-1)*EXT2_BLOCK_SIZE); + // block index start at 1, so block Number == block Index + // since "block[0]" is allocated for superblock + return (char unsigned*)(disk+blockNum*EXT2_BLOCK_SIZE); } /** From 1e74935e4556b99b7480b2030d3b502674cea0a1 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Tue, 31 Mar 2020 11:51:01 -0400 Subject: [PATCH 18/41] , --- ext2_cp.c | 29 +++++++++++++++++------------ readimage.c | 35 ++++++++++++++++++++--------------- test.c | 35 +++++++++++++++++++++++++++++++++++ utilities.c | 26 +++++++++++++------------- 4 files changed, 85 insertions(+), 40 deletions(-) create mode 100644 test.c diff --git a/ext2_cp.c b/ext2_cp.c index a1738ff..5c10632 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -11,14 +11,14 @@ #include "utilities.h" unsigned char *disk; -struct ext2_inode *inodeTable; int main(int argc, char **argv) { FILE *src_fd; char parentDirPath[EXT2_NAME_LEN]; char fileName[EXT2_NAME_LEN]; int parentInodeNum, childInodeNum; - struct ext2_inode parentInode, childInode; + struct ext2_inode *inodeTable; + struct ext2_inode *parentInode, *childInode; if(argc!=4) { fprintf(stderr, "Usage: ext2_cp \n"); @@ -56,11 +56,11 @@ int main(int argc, char **argv) { fprintf(stderr, "No such file or directory\n"); return ENOENT; } - parentInode = inodeTable[parentInodeNum-1]; + parentInode = &inodeTable[parentInodeNum-1]; // check file exist getFileNameFromPath(fileName, argv[3]); - childInodeNum = searchFileInDir(&parentInode, fileName); + childInodeNum = searchFileInDir(parentInode, fileName); if (childInodeNum != 0) { fprintf(stderr, "File or directory already exist\n"); return EEXIST; @@ -68,7 +68,7 @@ int main(int argc, char **argv) { // create file and cp childInodeNum = initInode(EXT2_S_IFREG)+1; - childInode = inodeTable[childInodeNum-1]; + childInode = &inodeTable[childInodeNum-1]; unsigned int *singleIndirect = NULL; int nextBlockNum, byteRead; int fileSize = 0; @@ -77,10 +77,12 @@ int main(int argc, char **argv) { nextBlockNum = allocateNewBlock(); printf("Block %d is allocated for cp, content is:\n", nextBlockNum); if (i<12) { - childInode.i_block[i] = nextBlockNum; + childInode->i_block[i] = nextBlockNum; } else if (i==12) { - childInode.i_block[i] = nextBlockNum; + childInode->i_block[i] = nextBlockNum; singleIndirect = initSingleIndirect(nextBlockNum); +printf("N/A, since this block is for singleindirect.\n"); + i++; continue; } else { singleIndirect[i-13] = nextBlockNum; @@ -95,12 +97,15 @@ printf("total %d bytes in this block\n", byteRead); fclose(src_fd); // uptate inode filed printf("file size: %d\n", fileSize); - childInode.i_size = fileSize; + childInode->i_size = fileSize; if (singleIndirect == NULL) - childInode.i_blocks = ((fileSize+1023)/1024)*2; + childInode->i_blocks = ((fileSize+1023)/1024)*2; else - childInode.i_blocks = ((fileSize+1023)/1024)*2+1; -printInode(&childInode); + childInode->i_blocks = ((fileSize+1023)/1024)*2+1; +printf("childInode: \n"); +printInode(childInode); // add dir_entry fot this file into parent dir - initNewDirent(&parentInode, childInodeNum, EXT2_FT_REG_FILE, fileName); + initNewDirent(parentInode, childInodeNum, EXT2_FT_REG_FILE, fileName); + printf("parentInode: \n"); +printInode(parentInode); } \ No newline at end of file diff --git a/readimage.c b/readimage.c index 0251ac3..41dc3ae 100644 --- a/readimage.c +++ b/readimage.c @@ -97,23 +97,28 @@ int main(int argc, char **argv) { if (!(inodeTable[i].i_mode & EXT2_S_IFDIR)) continue; - printf("\tDIR BLOCK NUM: %d (for inode %d)\n", inodeTable[i].i_block[0], i+1); - dir_entries = (struct ext2_dir_entry_2 *)getBlock(inodeTable[i].i_block[0]); - // while not hit the end og the block - while ((int)dir_entries < (int)(disk+(inodeTable[i].i_block[0]+1)*EXT2_BLOCK_SIZE)) { - if (dir_entries->file_type == EXT2_FT_UNKNOWN) - type = 'u'; - else if (dir_entries->file_type == EXT2_FT_REG_FILE) - type = 'f'; - else if (dir_entries->file_type == EXT2_FT_DIR) - type = 'd'; - else if (dir_entries->file_type == EXT2_FT_SYMLINK) - type = 'l'; - printf("Inode: %d rec_len: %d name_len: %d type= %c name=%s\n", dir_entries->inode, dir_entries->rec_len, dir_entries->name_len, type, dir_entries->name); - dir_entries = (void *) dir_entries + dir_entries->rec_len; - } + for (int j=0; j<12; j++) { + if (inodeTable[i].i_block[j] == 0) continue; + printf("\tDIR BLOCK NUM: %d (for inode %d)\n", inodeTable[i].i_block[j], i+1); + dir_entries = (struct ext2_dir_entry_2 *)getBlock(inodeTable[i].i_block[j]); + // while not hit the end og the block + while ((int)dir_entries < (int)(disk+(inodeTable[i].i_block[0]+1)*EXT2_BLOCK_SIZE)) { + if (dir_entries->file_type == EXT2_FT_UNKNOWN) + type = 'u'; + else if (dir_entries->file_type == EXT2_FT_REG_FILE) + type = 'f'; + else if (dir_entries->file_type == EXT2_FT_DIR) + type = 'd'; + else if (dir_entries->file_type == EXT2_FT_SYMLINK) + type = 'l'; + printf("Inode: %d rec_len: %d name_len: %d type= %c name=%s\n", dir_entries->inode, dir_entries->rec_len, dir_entries->name_len, type, dir_entries->name); + dir_entries = (void *) dir_entries + dir_entries->rec_len; + } + } } } + + return 0; } diff --git a/test.c b/test.c new file mode 100644 index 0000000..7758628 --- /dev/null +++ b/test.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ext2.h" +#include "utilities.h" + +unsigned char *disk; +struct ext2_inode *inodeTable; + +int main(int argc, char **argv) { + char path[EXT2_NAME_LEN]; + char pathCopy[EXT2_NAME_LEN]; + char fileName[EXT2_NAME_LEN]; + int flagged = FALSE; + struct ext2_inode inode; + struct ext2_dir_entry_2 *dir_entry = NULL; + int total_rec_len; + unsigned char *singleIndirect; + + int fd = open("largefile.img", O_RDWR); + disk = mmap(NULL, 128 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if(disk == MAP_FAILED) { + perror("mmap"); + exit(1); + } + inodeTable = getInodeTable(); + + +} \ No newline at end of file diff --git a/utilities.c b/utilities.c index 0e6b1b4..be55482 100644 --- a/utilities.c +++ b/utilities.c @@ -118,18 +118,18 @@ void deleteInode(int inodeNum) { getGroupDesc()->bg_free_inodes_count++; struct ext2_inode *inode_table = getInodeTable(); - struct ext2_inode target = inode_table[inodeNum-1]; + struct ext2_inode *target = &inode_table[inodeNum-1]; // delete the block bitmap int i; for(i = 0; i<12;i++) { - if (target.i_block[i] != 0) { - changeBitmap(block_bitmap, target.i_block[i], 'd'); + if (target->i_block[i] != 0) { + changeBitmap(block_bitmap, target->i_block[i], 'd'); getGroupDesc()->bg_free_blocks_count++; } } // delete single indirect - int bp = target.i_block[12]; + int bp = target->i_block[12]; if (bp != 0) { // delete blocks in single @@ -142,7 +142,7 @@ void deleteInode(int inodeNum) { } // delte single itself - changeBitmap(block_bitmap, target.i_block[12], 'd'); + changeBitmap(block_bitmap, target->i_block[12], 'd'); getGroupDesc()->bg_free_blocks_count++; } } @@ -270,13 +270,14 @@ struct ext2_dir_entry_2 *allocateNewDirent(struct ext2_inode *parent_inode, int } } - // if we cannot find a space, try to allocate a new direct block + // if we cannot find a space, try to allocate a new block int newBlockNum = 0; for(int i = 0; i<13+EXT2_BLOCK_SIZE/4;i++) { if (i<12) { if (parent_inode->i_block[i] != 0) continue; newBlockNum = allocateNewBlock(); parent_inode->i_block[i] = newBlockNum; +printf("new block: %d, is allocated for the directory at i_block[%d]\n", parent_inode->i_block[i], i); } else if (i==12) { if (parent_inode->i_block[i] != 0) break; newBlockNum = allocateNewBlock(); @@ -290,7 +291,7 @@ struct ext2_dir_entry_2 *allocateNewDirent(struct ext2_inode *parent_inode, int } new_dir_entry = (struct ext2_dir_entry_2 *)getBlock(newBlockNum); - parent_inode->i_blocks+=EXT2_BLOCK_SIZE/512; + parent_inode->i_blocks+=(EXT2_BLOCK_SIZE+511)/512; parent_inode->i_size+=EXT2_BLOCK_SIZE; new_dir_entry->rec_len=EXT2_BLOCK_SIZE; return new_dir_entry; @@ -357,7 +358,7 @@ int getInodeFromPath(char *path) { */ struct ext2_inode *inodeTable = getInodeTable(); int inode_num = EXT2_ROOT_INO; - struct ext2_inode cur_inode = inodeTable[inode_num-1]; + struct ext2_inode *cur_inode = &inodeTable[inode_num-1]; char *next_file; int endWithDir = path[strlen(path)-1] == '/'; // is path endwith '/' ? @@ -370,16 +371,16 @@ int getInodeFromPath(char *path) { next_file = strtok(path, "/"); while(next_file != NULL) { // cannot have a non-directory type file in the middle of path - if (!(cur_inode.i_mode & EXT2_S_IFDIR)) { + if (!(cur_inode->i_mode & EXT2_S_IFDIR)) { // Invalid path; non-dir type file inside path return 0; } // get next inode from current directory - inode_num = searchFileInDir(&cur_inode, next_file); + inode_num = searchFileInDir(cur_inode, next_file); // update inode to next file with next_file if (inode_num != 0) { - cur_inode = inodeTable[inode_num-1]; + cur_inode = &inodeTable[inode_num-1]; } else { // invalid path: file name not found return 0; @@ -388,11 +389,10 @@ int getInodeFromPath(char *path) { next_file = strtok(NULL, "/"); } - if (!(cur_inode.i_mode & EXT2_S_IFDIR) && endWithDir) { + if (!(cur_inode->i_mode & EXT2_S_IFDIR) && endWithDir) { // invalid path: path endwith '/' but have a non-dir type file at the end return 0; } - return inode_num; } From e3f7152adc845d91bd6d4beeb97ecd5a44e3abe8 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Tue, 31 Mar 2020 12:10:27 -0400 Subject: [PATCH 19/41] . --- ext2_cp.c | 6 +++--- readimage.c | 26 +++++++++++++++----------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 5c10632..c053f39 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -75,7 +75,7 @@ int main(int argc, char **argv) { int i = 0; while (!feof(src_fd)) { nextBlockNum = allocateNewBlock(); -printf("Block %d is allocated for cp, content is:\n", nextBlockNum); +printf("Block %d is allocated for: %s\n", nextBlockNum, fileName); if (i<12) { childInode->i_block[i] = nextBlockNum; } else if (i==12) { @@ -102,10 +102,10 @@ printf("file size: %d\n", fileSize); childInode->i_blocks = ((fileSize+1023)/1024)*2; else childInode->i_blocks = ((fileSize+1023)/1024)*2+1; -printf("childInode: \n"); +printf("\n--childInode: --\n"); printInode(childInode); // add dir_entry fot this file into parent dir initNewDirent(parentInode, childInodeNum, EXT2_FT_REG_FILE, fileName); - printf("parentInode: \n"); +printf("\n--parentInode: --\n"); printInode(parentInode); } \ No newline at end of file diff --git a/readimage.c b/readimage.c index 41dc3ae..5ef0d79 100644 --- a/readimage.c +++ b/readimage.c @@ -86,7 +86,8 @@ int main(int argc, char **argv) { // task3, print directory enties char type='\0'; - struct ext2_dir_entry_2 *dir_entries; + struct ext2_dir_entry_2 *dir_entry; + int total_rec_len; printf("Directory Blocks:\n"); for(i = 0; i < sb->s_inodes_count; i++) { @@ -100,25 +101,28 @@ int main(int argc, char **argv) { for (int j=0; j<12; j++) { if (inodeTable[i].i_block[j] == 0) continue; printf("\tDIR BLOCK NUM: %d (for inode %d)\n", inodeTable[i].i_block[j], i+1); - dir_entries = (struct ext2_dir_entry_2 *)getBlock(inodeTable[i].i_block[j]); - // while not hit the end og the block - while ((int)dir_entries < (int)(disk+(inodeTable[i].i_block[0]+1)*EXT2_BLOCK_SIZE)) { - if (dir_entries->file_type == EXT2_FT_UNKNOWN) + dir_entry = (struct ext2_dir_entry_2 *)getBlock(inodeTable[i].i_block[j]); + + // while not hit the end of the block + total_rec_len = 0; + while (total_rec_len < EXT2_BLOCK_SIZE) { + if (dir_entry->file_type == EXT2_FT_UNKNOWN) type = 'u'; - else if (dir_entries->file_type == EXT2_FT_REG_FILE) + else if (dir_entry->file_type == EXT2_FT_REG_FILE) type = 'f'; - else if (dir_entries->file_type == EXT2_FT_DIR) + else if (dir_entry->file_type == EXT2_FT_DIR) type = 'd'; - else if (dir_entries->file_type == EXT2_FT_SYMLINK) + else if (dir_entry->file_type == EXT2_FT_SYMLINK) type = 'l'; - printf("Inode: %d rec_len: %d name_len: %d type= %c name=%s\n", dir_entries->inode, dir_entries->rec_len, dir_entries->name_len, type, dir_entries->name); - dir_entries = (void *) dir_entries + dir_entries->rec_len; + printf("Inode: %d rec_len: %d name_len: %d type= %c name=%s\n", dir_entry->inode, dir_entry->rec_len, dir_entry->name_len, type, dir_entry->name); + total_rec_len = total_rec_len + dir_entry->rec_len; + dir_entry = (void *) dir_entry + dir_entry->rec_len; } } } } - + return 0; } From 59bcd80a9cd8f7e3676bf15a309ae97eeda213cd Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Tue, 31 Mar 2020 23:43:42 -0400 Subject: [PATCH 20/41] .. --- Makefile | 5 +++- ext2_cp.c | 3 --- ext2_mkdir.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++--- ext2_rm.c | 59 ++++++++++++++++++++++++++++++++++++++++++- test.c | 65 +++++++++++++++++++++++++++++++++++++++++------- test.sh | 41 +++++++++++++++++++++++++++--- utilities.c | 30 ++++++++++++++++++---- 7 files changed, 247 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index e8f6baf..27c3727 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PROGS = ext2_cp ext2_ln ext2_ls ext2_mkdir ext2_rm ext2_rm_bonus readimage +PROGS = ext2_cp ext2_ln ext2_ls ext2_mkdir ext2_rm ext2_rm_bonus readimage test all : $(PROGS) readimage : readimage.o utilities.o @@ -22,6 +22,9 @@ ext2_rm : ext2_rm.o utilities.o ext2_rm_bonus : ext2_rm_bonus.o utilities.o gcc -Wall -g -o ext2_rm_bonus $^ +test : test.o utilities.o + gcc -Wall -g -o test $^ + %.o : %.c ext2.h utilities.h gcc -Wall -g -c $^ diff --git a/ext2_cp.c b/ext2_cp.c index c053f39..0805d46 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -36,7 +36,6 @@ int main(int argc, char **argv) { // open native file for read if((src_fd = fopen(argv[2], "r")) == NULL) { - perror("src_fd"); fprintf(stderr, "No such file or directory\n"); return ENOENT; } @@ -44,7 +43,6 @@ int main(int argc, char **argv) { // get the parent directory inode strcpy(parentDirPath, argv[3]); if (parentDirPath[0]!='/') { - perror("Invalid parentDirPath"); fprintf(stderr, "No such file or directory\n"); return ENOENT; } else { @@ -52,7 +50,6 @@ int main(int argc, char **argv) { } parentInodeNum = getInodeFromPath(parentDirPath); if (parentInodeNum == 0) { - perror("parentDirPath not exist"); fprintf(stderr, "No such file or directory\n"); return ENOENT; } diff --git a/ext2_mkdir.c b/ext2_mkdir.c index 7cbac38..749f603 100644 --- a/ext2_mkdir.c +++ b/ext2_mkdir.c @@ -5,13 +5,77 @@ #include #include #include -#include #include "ext2.h" +#include +#include #include "utilities.h" unsigned char *disk; int main(int argc, char **argv) { - + char path[EXT2_NAME_LEN]; + char pathCopy[EXT2_NAME_LEN]; + char dirName[EXT2_NAME_LEN]; + struct ext2_inode *parent_inode, *inode_table, *target_inode; + + if(argc!=3) { + fprintf(stderr, "Usage: ./ext2_mkdir \n"); + exit(1); + } + int fd = open(argv[1], O_RDWR); + + // read disk and get inode table + disk = mmap(NULL, 128 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if(disk == MAP_FAILED) { + perror("mmap"); + exit(1); + } + + strcpy(path, argv[2]); + strcpy(pathCopy, argv[2]); + // if input is root, return EEXIST + if (strlen(pathCopy) == 1) { + fprintf(stderr, "Specified directory already exists\n"); + return EEXIST; + } + // get the parent directory of the specified directory + getParentDirPath(pathCopy); + int parent_inode_num = getInodeFromPath(pathCopy); + // if any component on the path of parent directory does not exist, + // return ENOENT + if (parent_inode_num == 0) { + fprintf(stderr, "One of the compoenets on the path does not exist\n"); + return ENOENT; + } + + // get the parent directory inode + inode_table = getInodeTable(); + parent_inode = &inode_table[parent_inode_num-1]; + // get the directory name from input + strcpy(pathCopy, path); + getFileNameFromPath(dirName, pathCopy); + int target_inode_num = searchFileInDir(parent_inode, dirName); + // if specified dir already exists, return EEXIST + if (target_inode_num != 0) { + fprintf(stderr, "Specified directory already exists\n"); + return EEXIST; + } + + // initialize an inode for the specified directory + target_inode_num = initInode(EXT2_S_IFDIR); + target_inode = &inode_table[target_inode_num-1]; + //create an directory entry for the specified directory + initNewDirent(parent_inode, target_inode_num, EXT2_FT_DIR, dirName); + + // allocate a new block for the specified directory + int newBlockNum = allocateNewBlock(); + target_inode->i_block[0] = newBlockNum; + struct ext2_dir_entry_2 *firstDirent = (struct ext2_dir_entry_2 *)getBlock(newBlockNum); + firstDirent->file_type = EXT2_FT_DIR; + firstDirent->inode = target_inode_num; + strcpy(firstDirent->name, "."); + firstDirent->name_len = 1; + firstDirent->rec_len = EXT2_BLOCK_SIZE; + initNewDirent(target_inode, parent_inode_num, EXT2_FT_DIR, ".."); return 0; -} \ No newline at end of file +} diff --git a/ext2_rm.c b/ext2_rm.c index c6eefa1..1cadff7 100644 --- a/ext2_rm.c +++ b/ext2_rm.c @@ -5,10 +5,67 @@ #include #include #include +#include +#include #include "ext2.h" +#include "utilities.h" unsigned char *disk; int main(int argc, char **argv) { - return 0; + char parentDirPath[EXT2_NAME_LEN]; + char fileName[EXT2_NAME_LEN]; + int parentInodeNum, childInodeNum; + struct ext2_inode *inodeTable; + struct ext2_inode *parentInode, *childInode; + + if(argc!=3) { + fprintf(stderr, "Usage: ext2_rm \n"); + exit(1); + } + + // read disk and get inode table + int fd = open(argv[1], O_RDWR); + disk = mmap(NULL, 128 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if(disk == MAP_FAILED) { + perror("mmap"); + exit(1); + } + inodeTable = getInodeTable(); + + // get the parent directory inode + strcpy(parentDirPath, argv[2]); + if (parentDirPath[0]!='/') { + fprintf(stderr, "No such file or directory\n"); + return ENOENT; + } else { + getParentDirPath(parentDirPath); + } + parentInodeNum = getInodeFromPath(parentDirPath); + if (parentInodeNum == 0) { + fprintf(stderr, "No such file or directory\n"); + return ENOENT; + } + parentInode = &inodeTable[parentInodeNum-1]; + + // check file exist + getFileNameFromPath(fileName, argv[3]); + childInodeNum = searchFileInDir(parentInode, fileName); + if (childInodeNum == 0) { + fprintf(stderr, "No such file or directory\n"); + return ENOENT; + } + childInode = &inodeTable[childInodeNum-1]; + + // if the file is a directory + if (childInode->i_mode & EXT2_S_IFDIR) { + fprintf(stderr, "Cannot remove a directory\n"); + return ENOENT; + } + + deleteInode(childInodeNum); + // remove direct + //removeFileInDir(parentInode, childInodeNum); + + } \ No newline at end of file diff --git a/test.c b/test.c index 7758628..519fc61 100644 --- a/test.c +++ b/test.c @@ -14,16 +14,9 @@ unsigned char *disk; struct ext2_inode *inodeTable; int main(int argc, char **argv) { - char path[EXT2_NAME_LEN]; - char pathCopy[EXT2_NAME_LEN]; - char fileName[EXT2_NAME_LEN]; - int flagged = FALSE; - struct ext2_inode inode; - struct ext2_dir_entry_2 *dir_entry = NULL; - int total_rec_len; - unsigned char *singleIndirect; + struct ext2_inode *inode = NULL; - int fd = open("largefile.img", O_RDWR); + int fd = open(argv[1], O_RDWR); disk = mmap(NULL, 128 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(disk == MAP_FAILED) { perror("mmap"); @@ -31,5 +24,59 @@ int main(int argc, char **argv) { } inodeTable = getInodeTable(); + int inodeNum = getInodeFromPath(argv[2]); + inode = &inodeTable[inodeNum-1]; + unsigned int * single; + // print file content for this inode + if(inode->i_mode & EXT2_S_IFDIR) { + int total_len = 0; + struct ext2_dir_entry_2 *dir_entry = NULL; + for (int i=0; i<12; i++) { + if (inode->i_block[i] != 0) { + total_len = 0; + dir_entry = (struct ext2_dir_entry_2 *)getBlock(inode->i_block[i]); + printf("inode->i_block[%d]: %d\n", i, inode->i_block[i]); + while (total_leninode, dir_entry->rec_len, dir_entry->name_len, dir_entry->file_type, dir_entry->name); + total_len+=dir_entry->rec_len; + dir_entry = (void*)dir_entry + dir_entry->rec_len; + } + } + } + if (inode->i_block[12] != 0) { + single = (unsigned int *)getBlock(inode->i_block[12]); + for (int j=0; jinode, dir_entry->rec_len, dir_entry->name_len, dir_entry->file_type, dir_entry->name); + total_len+=dir_entry->rec_len; + dir_entry = (void*)dir_entry + dir_entry->rec_len; + } + } + } + } + // print dirent for this inode + } else { + for (int i=0; i<12; i++) { + if (inode->i_block[i] != 0) { + printf("inode->i_block[%d]: %d\n", i, inode->i_block[i]); + printf("%s\n", getBlock(inode->i_block[i])); + } + } + if (inode->i_block[12] != 0) { + single = (unsigned int *)getBlock(inode->i_block[12]); + for (int j=0; j>>-----" # ./ext2_ls twolevel.img -a / +# echo "-----test root with flag: <<<./ext2_ls twolevel.img -a /lost+found>>>-----" +# ./ext2_ls twolevel.img -a /lost+found + # echo "-----test afile: <<<./ext2_ls twolevel.img /afile>>>-----" # ./ext2_ls twolevel.img /afile @@ -42,8 +45,38 @@ # ./ext2_ls onedirectory.img /level1/bfilee.s # cp +# ./readimage emptydisk.img +# echo "\n---------------------\n" +# # ./ext2_cp emptydisk.img /Users/javiewang/Desktop/large.txt /large.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename0.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename1.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename2.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename3.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename4.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename5.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename6.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename7.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename8.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename9.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename10.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename11.txt +# echo "\n---------------------\n" +# ./readimage emptydisk.img + +# rm + + + +# mkdir + ls +echo "\n----------mkdir--------\n" +./ext2_mkdir emptydisk.img /123 +echo "\n----------ls-----------\n" +./ext2_ls emptydisk.img / +echo "\n---------readimage----\n" ./readimage emptydisk.img -echo "\n---------------------\n" -./ext2_cp emptydisk.img /Users/javiewang/Desktop/large.txt /large.txt -echo "\n---------------------\n" -./readimage emptydisk.img \ No newline at end of file +echo "\n---------test---------\n" +./test emptydisk.img / +echo "\n---------test---------\n" +./test emptydisk.img /123 +echo "\n---------test---------\n" +./test emptydisk.img /lost+found diff --git a/utilities.c b/utilities.c index be55482..6961fc7 100644 --- a/utilities.c +++ b/utilities.c @@ -113,14 +113,14 @@ void deleteInode(int inodeNum) { char unsigned *inode_bitmap = getInodeBitmap(); char unsigned *block_bitmap = getBlockBitmap(); - // change inode bitmap + // delete inode changeBitmap(inode_bitmap, inodeNum-1, 'd'); getGroupDesc()->bg_free_inodes_count++; struct ext2_inode *inode_table = getInodeTable(); struct ext2_inode *target = &inode_table[inodeNum-1]; - // delete the block bitmap + // delete block int i; for(i = 0; i<12;i++) { if (target->i_block[i] != 0) { @@ -128,6 +128,7 @@ void deleteInode(int inodeNum) { getGroupDesc()->bg_free_blocks_count++; } } + // delete single indirect int bp = target->i_block[12]; if (bp != 0) @@ -241,7 +242,7 @@ int searchFileInDir(struct ext2_inode *inode, char *fileName) { } int calculateActuralSize(struct ext2_dir_entry_2 *dirent) { - return sizeof(struct ext2_dir_entry_2) + ((dirent->name_len+4)/4)*4; + return ((sizeof(struct ext2_dir_entry_2)+(dirent->name_len+4))/4)*4; } struct ext2_dir_entry_2 *allocateNewDirent(struct ext2_inode *parent_inode, int size) { @@ -290,10 +291,21 @@ printf("new block: %d, is allocated for the directory at i_block[%d]\n", parent_ singleIndirect[i-13] = newBlockNum; } - new_dir_entry = (struct ext2_dir_entry_2 *)getBlock(newBlockNum); + + // increse parentdir size parent_inode->i_blocks+=(EXT2_BLOCK_SIZE+511)/512; parent_inode->i_size+=EXT2_BLOCK_SIZE; - new_dir_entry->rec_len=EXT2_BLOCK_SIZE; + + // insert dummy head + new_dir_entry = (struct ext2_dir_entry_2 *)getBlock(newBlockNum); + new_dir_entry->file_type = EXT2_FT_UNKNOWN; + new_dir_entry->inode = 0; + new_dir_entry->name[0] = '\0'; + new_dir_entry->rec_len = ((sizeof(struct ext2_dir_entry_2)+3)/4)*4; + + // return new setted dir_entry + new_dir_entry = (void *)new_dir_entry + new_dir_entry->rec_len; + new_dir_entry->rec_len=EXT2_BLOCK_SIZE-((sizeof(struct ext2_dir_entry_2)+3)/4)*4; return new_dir_entry; } return NULL; @@ -343,6 +355,10 @@ struct ext2_dir_entry_2 *initNewDirent(struct ext2_inode *parentInode, int child return newDirent; } +void deleteDirent(struct ext2_inode *parentInode, int childInodeNum) { + +} + unsigned int *initSingleIndirect(int blockNum) { unsigned int *singleIndirect = (unsigned int *)getBlock(blockNum); for (int i=0; i<(EXT2_BLOCK_SIZE/4); i++) { @@ -417,3 +433,7 @@ void getParentDirPath(char *path) { char *target = strrchr(path, '/'); *(target+1) = '\0'; } + +void removeFileInDir(struct ext2_inode *parentInode, int fileName) { + +} \ No newline at end of file From 0b8c01829681270b2587ba581f53dbfbf7eb6989 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Wed, 1 Apr 2020 00:25:13 -0400 Subject: [PATCH 21/41] .. --- ext2_ln.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ test.sh | 30 +++++++-------- 2 files changed, 127 insertions(+), 16 deletions(-) diff --git a/ext2_ln.c b/ext2_ln.c index c6eefa1..045d375 100644 --- a/ext2_ln.c +++ b/ext2_ln.c @@ -5,10 +5,123 @@ #include #include #include +#include +#include #include "ext2.h" +#include "utilities.h" unsigned char *disk; +struct ext2_inode *inodeTable; int main(int argc, char **argv) { + + char pathTo[EXT2_NAME_LEN]; + char pathFrom[EXT2_NAME_LEN]; + char pathToCopy[EXT2_NAME_LEN]; + char pathFromCopy[EXT2_NAME_LEN]; + char parentOfPathFrom[EXT2_NAME_LEN]; + char linkName[EXT2_NAME_LEN]; + + int flagged = FALSE; + int parentInodeNum, childInodeNum; + + struct ext2_inode *targetInode, *parentInode, *childInode; + + if(argc!=4 && argc!=5) { + fprintf(stderr, "Usage: ext2_ln \n"); + exit(1); + } + + // read disk and get inode table + int fd = open(argv[1], O_RDWR); + disk = mmap(NULL, 128 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if(disk == MAP_FAILED) { + perror("mmap"); + exit(1); + } + inodeTable = getInodeTable(); + + // read other arguments + if(argc == 4) { + strcpy(pathTo, argv[2]); + strcpy(pathFrom, argv[3]); + } else { + if (strcmp(argv[2], "-s") != 0) { + fprintf(stderr, "Invalid Flag\n"); + exit(1); + } + flagged = TRUE; + strcpy(pathTo, argv[3]); + strcpy(pathFrom, argv[4]); + } + + // get the inode from pathTo + strcpy(pathToCopy, pathTo); + int inodeNum = getInodeFromPath(pathToCopy); + if (inodeNum == 0) { + fprintf(stderr, "No such file or directory\n"); + return ENOENT; + } + targetInode = &inodeTable[inodeNum-1]; + if (targetInode->i_mode == EXT2_S_IFDIR){ + fprintf(stderr, "No link to a directory\n"); + return EISDIR; + } + + // get the upper level inode from pathFrom + strcpy(pathFromCopy, pathFrom); + strcpy(parentOfPathFrom, pathFrom); + + if (parentOfPathFrom[0]!='/') { + perror("Invalid parentDirPath"); + fprintf(stderr, "No such file or directory\n"); + return ENOENT; + } else { + getParentDirPath(parentOfPathFrom); + } + + parentInodeNum = getInodeFromPath(parentOfPathFrom); + if (parentInodeNum == 0) { + perror("parentDirPath not exist"); + fprintf(stderr, "No such file or directory\n"); + return ENOENT; + } + parentInode = &inodeTable[parentInodeNum-1]; + + // check whether the link has already existed + getFileNameFromPath(linkName, pathFromCopy); + childInodeNum = searchFileInDir(parentInode, linkName); + if (childInodeNum != 0) { + fprintf(stderr, "File or directory already exist\n"); + return EEXIST; + } + + if (!flagged){ + + // implementation for the hard link + initNewDirent(parentInode, inodeNum, EXT2_FT_REG_FILE, linkName); + // increment the link count of the target inode + targetInode->i_links_count++; + + }else{ + + // implementation for the symbolic link + childInodeNum = initInode(EXT2_S_IFLNK)+1; + childInode = &inodeTable[childInodeNum-1]; + childInode->i_size = strlen(pathFromCopy); + + initNewDirent(parentInode, childInodeNum, EXT2_FT_SYMLINK, linkName); + + if (childInode->i_size < 60){ + strcpy((char *)childInode->i_block, pathTo); + }else{ + // append path to the inode block + int block_num = allocateNewBlock(); + strcpy((char *)getBlock(block_num), pathTo); + childInode->i_block[0] = block_num; + } + + } + return 0; } \ No newline at end of file diff --git a/test.sh b/test.sh index a6c5add..67c0acd 100755 --- a/test.sh +++ b/test.sh @@ -63,20 +63,18 @@ # echo "\n---------------------\n" # ./readimage emptydisk.img -# rm - - - # mkdir + ls -echo "\n----------mkdir--------\n" -./ext2_mkdir emptydisk.img /123 -echo "\n----------ls-----------\n" -./ext2_ls emptydisk.img / -echo "\n---------readimage----\n" -./readimage emptydisk.img -echo "\n---------test---------\n" -./test emptydisk.img / -echo "\n---------test---------\n" -./test emptydisk.img /123 -echo "\n---------test---------\n" -./test emptydisk.img /lost+found +# echo "\n----------mkdir--------\n" +# ./ext2_mkdir emptydisk.img /123 +# echo "\n----------ls-----------\n" +# ./ext2_ls emptydisk.img / +# echo "\n---------readimage----\n" +# ./readimage emptydisk.img +# echo "\n---------test---------\n" +# ./test emptydisk.img / +# echo "\n---------test---------\n" +# ./test emptydisk.img /123 +# echo "\n---------test---------\n" +# ./test emptydisk.img /lost+found + +# rm From e4430b53f02a572150623357f3ba4ab19cdaf471 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Wed, 1 Apr 2020 20:31:49 -0400 Subject: [PATCH 22/41] .. --- ext2_cp.c | 2 +- ext2_ln.c | 14 +++++-- ext2_rm.c | 7 ++-- utilities.c | 110 +++++++++++++++++++++++++--------------------------- utilities.h | 4 ++ 5 files changed, 73 insertions(+), 64 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 0805d46..3bc4468 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -43,7 +43,7 @@ int main(int argc, char **argv) { // get the parent directory inode strcpy(parentDirPath, argv[3]); if (parentDirPath[0]!='/') { - fprintf(stderr, "No such file or directory\n"); + fprintf(stderr, "Must be absolute path\n"); return ENOENT; } else { getParentDirPath(parentDirPath); diff --git a/ext2_ln.c b/ext2_ln.c index 045d375..c9375dd 100644 --- a/ext2_ln.c +++ b/ext2_ln.c @@ -23,7 +23,8 @@ int main(int argc, char **argv) { char linkName[EXT2_NAME_LEN]; int flagged = FALSE; - int parentInodeNum, childInodeNum; + int inodeNum, parentInodeNum, childInodeNum; + struct ext2_inode *targetInode, *parentInode, *childInode; @@ -57,7 +58,14 @@ int main(int argc, char **argv) { // get the inode from pathTo strcpy(pathToCopy, pathTo); - int inodeNum = getInodeFromPath(pathToCopy); + if (pathToCopy[0]!='/') { + perror("Invalid path argument"); + fprintf(stderr, "No such file or directory\n"); + return ENOENT; + } else { + inodeNum = getInodeFromPath(pathToCopy); + } + if (inodeNum == 0) { fprintf(stderr, "No such file or directory\n"); return ENOENT; @@ -106,7 +114,7 @@ int main(int argc, char **argv) { }else{ // implementation for the symbolic link - childInodeNum = initInode(EXT2_S_IFLNK)+1; + childInodeNum = initInode(EXT2_S_IFLNK); childInode = &inodeTable[childInodeNum-1]; childInode->i_size = strlen(pathFromCopy); diff --git a/ext2_rm.c b/ext2_rm.c index 1cadff7..53dd9f9 100644 --- a/ext2_rm.c +++ b/ext2_rm.c @@ -63,9 +63,10 @@ int main(int argc, char **argv) { return ENOENT; } - deleteInode(childInodeNum); - // remove direct - //removeFileInDir(parentInode, childInodeNum); + // remove dir_entry from parent dir + // decrease i_links_count of childInode + + // if i_links_count } \ No newline at end of file diff --git a/utilities.c b/utilities.c index 6961fc7..b9f7857 100644 --- a/utilities.c +++ b/utilities.c @@ -187,57 +187,13 @@ int allocateNewBlock() { } // dir_entry -int searchFileInDir(struct ext2_inode *inode, char *fileName) { - /* - * return inode number of file if the file is found, o/w return 0 - */ - struct ext2_dir_entry_2 * dir_entry; - int total_rec_len; - unsigned int *singleIndirect; - - // first argument must be directory type - assert(inode->i_mode & EXT2_S_IFDIR); - - // search in direct block - for (int i=0; i<12; i++) { - if (inode->i_block[i] == 0) { - continue; - } else { - dir_entry = (struct ext2_dir_entry_2 *)getBlock(inode->i_block[i]); - } - - // for each dir entry in the block - total_rec_len = 0; - while (total_rec_len < EXT2_BLOCK_SIZE) { - if(strcmp(dir_entry->name, fileName)==0) { - return dir_entry->inode; - } - total_rec_len = total_rec_len + dir_entry->rec_len; - dir_entry = (void *) dir_entry + dir_entry->rec_len; - } - } - // search in single indirect block - if (inode->i_block[12] != 0) { - // for each block number in single indirect block - singleIndirect = (unsigned int *)getBlock(inode->i_block[12]); - for(int i = 0; iname, fileName)==0) { - return dir_entry->inode; - } - total_rec_len = total_rec_len + dir_entry->rec_len; - dir_entry = (void *) dir_entry + dir_entry->rec_len; - } - } - } +int searchFileInDir(struct ext2_inode *parentInode, char *childFileName) { + /** + * return inode num if childFile is found, o/w 0 + */ + struct ext2_dir_entry_2 *pre_dir_entry = getPreDirent(parentInode, childFileName); + if (pre_dir_entry != NULL) + return pre_dir_entry->inode; return 0; } @@ -355,10 +311,6 @@ struct ext2_dir_entry_2 *initNewDirent(struct ext2_inode *parentInode, int child return newDirent; } -void deleteDirent(struct ext2_inode *parentInode, int childInodeNum) { - -} - unsigned int *initSingleIndirect(int blockNum) { unsigned int *singleIndirect = (unsigned int *)getBlock(blockNum); for (int i=0; i<(EXT2_BLOCK_SIZE/4); i++) { @@ -434,6 +386,50 @@ void getParentDirPath(char *path) { *(target+1) = '\0'; } -void removeFileInDir(struct ext2_inode *parentInode, int fileName) { +struct ext2_dir_entry_2 *getPreDirent(struct ext2_inode *parentInode, char *childFileName) { + struct ext2_dir_entry_2 * pre_dir_entry; + struct ext2_dir_entry_2 * cur_dir_entry; + int total_rec_len; + + // search in direct block + for (int i=0; i<12; i++) { + if (parentInode->i_block[i] == 0) { + continue; + } else { + pre_dir_entry = (struct ext2_dir_entry_2 *)getBlock(parentInode->i_block[i]); + total_rec_len = pre_dir_entry->rec_len; + cur_dir_entry = (void *) pre_dir_entry + pre_dir_entry->rec_len; + } -} \ No newline at end of file + // for each dir entry in the block + while (total_rec_len < EXT2_BLOCK_SIZE) { + if(strcmp(cur_dir_entry->name, childFileName)==0) { + return pre_dir_entry; + } + total_rec_len = total_rec_len + cur_dir_entry->rec_len; + pre_dir_entry = cur_dir_entry; + cur_dir_entry = (void *) cur_dir_entry + cur_dir_entry->rec_len; + } + } + return NULL; +} + +// void remove(struct ext2_inode *parentInode, char *childFileName) { +// // delete childFile from parentDir and get childInode + +// // base case1, if childInode is a link +// // delete dir_entry from parent dir + +// // base case2, if childInode is a file +// // delete dir_entry from parent dir +// // reduce link count +// // if link count == 0 remove inode + +// // recursive case, if childInode is a dir +// // delete . (reduce link count for self) +// // delete .. (reduce link count for parent) +// // for each file name (other than . and ..) in child dir +// // call recusion +// // if child link count == 0 remove inode + +// } \ No newline at end of file diff --git a/utilities.h b/utilities.h index 6a9a00d..1644037 100644 --- a/utilities.h +++ b/utilities.h @@ -50,6 +50,8 @@ char unsigned *getBlock(int blockNum); int allocateNewBlock(void); // dir_entry +struct ext2_dir_entry_2 *getPreDirent(struct ext2_inode *parentInode, char *childFileName); + int searchFileInDir(struct ext2_inode *inode, char *fileName); int calculateActuralSize(struct ext2_dir_entry_2 *dirent); @@ -68,3 +70,5 @@ int getInodeFromPath(char *path); void getFileNameFromPath(char *fileName, char *path); void getParentDirPath(char *path); + + From a2f4852269d0d523c6b24608e92f9386bcaa51d8 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Wed, 1 Apr 2020 22:32:22 -0400 Subject: [PATCH 23/41] . --- utilities.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utilities.c b/utilities.c index b9f7857..02b0f66 100644 --- a/utilities.c +++ b/utilities.c @@ -191,9 +191,11 @@ int searchFileInDir(struct ext2_inode *parentInode, char *childFileName) { /** * return inode num if childFile is found, o/w 0 */ + struct ext2_dir_entry_2 *cur_dir_entry = NULL; struct ext2_dir_entry_2 *pre_dir_entry = getPreDirent(parentInode, childFileName); if (pre_dir_entry != NULL) - return pre_dir_entry->inode; + cur_dir_entry = (void *)pre_dir_entry + pre_dir_entry->rec_len; + return cur_dir_entry->inode; return 0; } From 2744d7f95a79cdef8893ab9bd32aa27c74421a95 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Thu, 2 Apr 2020 01:42:28 -0400 Subject: [PATCH 24/41] .. --- ext2_ln.c | 1 + ext2_ls.c | 4 +-- ext2_rm.c | 11 ++----- ext2_rm_bonus.c | 69 +++++++++++++++++++++++++++++++++++++++++- utilities.c | 80 +++++++++++++++++++++++++++++++++++++------------ utilities.h | 2 +- 6 files changed, 136 insertions(+), 31 deletions(-) diff --git a/ext2_ln.c b/ext2_ln.c index c9375dd..4344b03 100644 --- a/ext2_ln.c +++ b/ext2_ln.c @@ -117,6 +117,7 @@ int main(int argc, char **argv) { childInodeNum = initInode(EXT2_S_IFLNK); childInode = &inodeTable[childInodeNum-1]; childInode->i_size = strlen(pathFromCopy); + childInode->i_blocks = 0; initNewDirent(parentInode, childInodeNum, EXT2_FT_SYMLINK, linkName); diff --git a/ext2_ls.c b/ext2_ls.c index c8dd99b..1782e64 100644 --- a/ext2_ls.c +++ b/ext2_ls.c @@ -17,7 +17,7 @@ int main(int argc, char **argv) { char path[EXT2_NAME_LEN]; char pathCopy[EXT2_NAME_LEN]; char fileName[EXT2_NAME_LEN]; - int flagged = FALSE; + int flagged = 0; struct ext2_inode inode; if(argc!=3 && argc!=4) { @@ -42,7 +42,7 @@ int main(int argc, char **argv) { fprintf(stderr, "Invalid Flag\n"); exit(1); } - flagged = TRUE; + flagged = 1; strcpy(path, argv[3]); } diff --git a/ext2_rm.c b/ext2_rm.c index 53dd9f9..c66bb9f 100644 --- a/ext2_rm.c +++ b/ext2_rm.c @@ -20,7 +20,7 @@ int main(int argc, char **argv) { struct ext2_inode *parentInode, *childInode; if(argc!=3) { - fprintf(stderr, "Usage: ext2_rm \n"); + fprintf(stderr, "Usage: ext2_rm \n"); exit(1); } @@ -49,7 +49,7 @@ int main(int argc, char **argv) { parentInode = &inodeTable[parentInodeNum-1]; // check file exist - getFileNameFromPath(fileName, argv[3]); + getFileNameFromPath(fileName, argv[2]); childInodeNum = searchFileInDir(parentInode, fileName); if (childInodeNum == 0) { fprintf(stderr, "No such file or directory\n"); @@ -63,10 +63,5 @@ int main(int argc, char **argv) { return ENOENT; } - // remove dir_entry from parent dir - - // decrease i_links_count of childInode - - // if i_links_count - + rm(parentInode, fileName); } \ No newline at end of file diff --git a/ext2_rm_bonus.c b/ext2_rm_bonus.c index c6eefa1..3a7d7f8 100644 --- a/ext2_rm_bonus.c +++ b/ext2_rm_bonus.c @@ -5,10 +5,77 @@ #include #include #include +#include +#include #include "ext2.h" +#include "utilities.h" unsigned char *disk; int main(int argc, char **argv) { - return 0; + char parentDirPath[EXT2_NAME_LEN]; + char parentDirPathCopy[EXT2_NAME_LEN]; + char fileName[EXT2_NAME_LEN]; + int parentInodeNum, childInodeNum; + struct ext2_inode *inodeTable; + struct ext2_inode *parentInode, *childInode; + int flagged = 0; + + if(argc!=3 && argc!=4) { + fprintf(stderr, "Usage: ext2_rm \n"); + exit(1); + } + + // read disk and get inode table + int fd = open(argv[1], O_RDWR); + disk = mmap(NULL, 128 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if(disk == MAP_FAILED) { + perror("mmap"); + exit(1); + } + inodeTable = getInodeTable(); + + // read other arguments + if(argc == 3) { + strcpy(parentDirPath, argv[2]); + } else { + if (strcmp(argv[2], "-r")!=0) { + fprintf(stderr, "Invalid Flag\n"); + exit(1); + } + flagged = 1; + strcpy(parentDirPath, argv[3]); + } + strcpy(parentDirPathCopy, parentDirPath); + + // get the parent directory inode + if (parentDirPath[0]!='/') { + fprintf(stderr, "No such file or directory\n"); + return ENOENT; + } else { + getParentDirPath(parentDirPath); + } + parentInodeNum = getInodeFromPath(parentDirPath); + if (parentInodeNum == 0) { + fprintf(stderr, "No such file or directory\n"); + return ENOENT; + } + parentInode = &inodeTable[parentInodeNum-1]; + + // check file exist + getFileNameFromPath(fileName, parentDirPathCopy); + childInodeNum = searchFileInDir(parentInode, fileName); + if (childInodeNum == 0) { + fprintf(stderr, "No such file or directory\n"); + return ENOENT; + } + childInode = &inodeTable[childInodeNum-1]; + + // if the file is a directory + if ((childInode->i_mode & EXT2_S_IFDIR) && !flagged){ + fprintf(stderr, "Cannot remove a directory without -r flag\n"); + return ENOENT; + } + + rm(parentInode, fileName); } \ No newline at end of file diff --git a/utilities.c b/utilities.c index 02b0f66..584b6cf 100644 --- a/utilities.c +++ b/utilities.c @@ -83,6 +83,7 @@ struct ext2_inode *getInode(int inodeNum) { return &inodeTable[inodeNum-1]; } +///////////////refactoring: high//////////////////// /** * return new intialized inode number */ @@ -193,9 +194,10 @@ int searchFileInDir(struct ext2_inode *parentInode, char *childFileName) { */ struct ext2_dir_entry_2 *cur_dir_entry = NULL; struct ext2_dir_entry_2 *pre_dir_entry = getPreDirent(parentInode, childFileName); - if (pre_dir_entry != NULL) + if (pre_dir_entry != NULL) { cur_dir_entry = (void *)pre_dir_entry + pre_dir_entry->rec_len; return cur_dir_entry->inode; + } return 0; } @@ -416,22 +418,62 @@ struct ext2_dir_entry_2 *getPreDirent(struct ext2_inode *parentInode, char *chil return NULL; } -// void remove(struct ext2_inode *parentInode, char *childFileName) { -// // delete childFile from parentDir and get childInode - -// // base case1, if childInode is a link -// // delete dir_entry from parent dir - -// // base case2, if childInode is a file -// // delete dir_entry from parent dir -// // reduce link count -// // if link count == 0 remove inode +void rm(struct ext2_inode *parentInode, char *childFileName) { + struct ext2_dir_entry_2 *pre_dir_entry = NULL; + struct ext2_dir_entry_2 *cur_dir_entry = NULL; + struct ext2_dir_entry_2 *child_dir_entry = NULL; + struct ext2_inode *childInode = NULL; + int total_rec_len; -// // recursive case, if childInode is a dir -// // delete . (reduce link count for self) -// // delete .. (reduce link count for parent) -// // for each file name (other than . and ..) in child dir -// // call recusion -// // if child link count == 0 remove inode - -// } \ No newline at end of file + // delete childFile from parentDir and get childInode + pre_dir_entry = getPreDirent(parentInode, childFileName); + pre_dir_entry->rec_len += cur_dir_entry->rec_len; + childInode = getInode(cur_dir_entry->inode); + + // base case1, if childInode is Symbolic link + if (cur_dir_entry->file_type == EXT2_FT_SYMLINK) + { + // just delete the inode since + deleteInode(cur_dir_entry->inode); + } + // base case2, if childInode is a file + else if (cur_dir_entry->file_type == EXT2_FT_REG_FILE) + { + // reduce link count + childInode->i_links_count--; + + // if link count == 0 remove inode + if (childInode->i_links_count == 0) + deleteInode(cur_dir_entry->inode); + } + // recursive case, if childInode is a dir + else if (cur_dir_entry->file_type == EXT2_FT_DIR) + { + // reduce link count for self and parent (. and ..) + childInode->i_links_count--; + parentInode->i_links_count--; + + // for each file name (other than . and ..) in child dir, call recursion + for (int i=0; i<12; i++) { + if (childInode->i_block[i] == 0) + continue; + + child_dir_entry = (struct ext2_dir_entry_2 *)getBlock(childInode->i_block[i]); + total_rec_len = 0; + // for each dir entry in the block + while (total_rec_len < EXT2_BLOCK_SIZE) { + if (strcmp(cur_dir_entry->name, "")!=0 && + strcmp(cur_dir_entry->name, ".")!=0 && + strcmp(cur_dir_entry->name, "..")!=0) + rm(childInode, cur_dir_entry->name); + + total_rec_len = total_rec_len + cur_dir_entry->rec_len; + cur_dir_entry = (void *) cur_dir_entry + cur_dir_entry->rec_len; + } + } + + // if child link count == 0 remove inode + if (childInode->i_links_count == 0) + deleteInode(cur_dir_entry->inode); + } +} \ No newline at end of file diff --git a/utilities.h b/utilities.h index 1644037..1bf289f 100644 --- a/utilities.h +++ b/utilities.h @@ -71,4 +71,4 @@ void getFileNameFromPath(char *fileName, char *path); void getParentDirPath(char *path); - +void rm(struct ext2_inode *parentInode, char *childFileName); From 64c2e5c93813484cbcacdb09b2df6be1e13e97a0 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Thu, 2 Apr 2020 09:45:56 -0400 Subject: [PATCH 25/41] . --- readimage.c | 4 ++-- test.c | 22 ++++------------------ utilities.c | 38 +++++++++++++++++++++++--------------- utilities.h | 4 +--- 4 files changed, 30 insertions(+), 38 deletions(-) diff --git a/readimage.c b/readimage.c index 5ef0d79..b794c4c 100644 --- a/readimage.c +++ b/readimage.c @@ -40,8 +40,8 @@ int main(int argc, char **argv) { // task1, print bitmap int i,j; - char unsigned *block_bitmap = getBlockBitmap(); - char unsigned *inode_bitmap = getInodeBitmap(); + char unsigned *block_bitmap = getBitmap(BLOCK_BITMAP); + char unsigned *inode_bitmap = getBitmap(INODE_BITMAP); printf("Block bitmap:"); for (i=0; is_blocks_count/8; i++) { printf(" "); diff --git a/test.c b/test.c index 519fc61..4341df5 100644 --- a/test.c +++ b/test.c @@ -25,9 +25,11 @@ int main(int argc, char **argv) { inodeTable = getInodeTable(); int inodeNum = getInodeFromPath(argv[2]); + // inodeNum = 1; inode = &inodeTable[inodeNum-1]; unsigned int * single; - // print file content for this inode + printInode(inode); + // print file dirent for this inode if(inode->i_mode & EXT2_S_IFDIR) { int total_len = 0; struct ext2_dir_entry_2 *dir_entry = NULL; @@ -43,23 +45,7 @@ int main(int argc, char **argv) { } } } - if (inode->i_block[12] != 0) { - single = (unsigned int *)getBlock(inode->i_block[12]); - for (int j=0; jinode, dir_entry->rec_len, dir_entry->name_len, dir_entry->file_type, dir_entry->name); - total_len+=dir_entry->rec_len; - dir_entry = (void*)dir_entry + dir_entry->rec_len; - } - } - } - } - - // print dirent for this inode + // print content for this inode } else { for (int i=0; i<12; i++) { if (inode->i_block[i] != 0) { diff --git a/utilities.c b/utilities.c index 584b6cf..91552f5 100644 --- a/utilities.c +++ b/utilities.c @@ -19,17 +19,15 @@ struct ext2_group_desc *getGroupDesc() { } // bitmaps, bit -char unsigned *getBlockBitmap() { +char unsigned *getBitmap(int bitmapNum) { struct ext2_group_desc *gd = getGroupDesc(); - return (char unsigned *)(disk+gd->bg_block_bitmap*EXT2_BLOCK_SIZE); + if (bitmapNum == INODE_BITMAP) + return (char unsigned *)(disk+gd->bg_block_bitmap*EXT2_BLOCK_SIZE); + else + return (char unsigned *)(disk+gd->bg_inode_bitmap*EXT2_BLOCK_SIZE); } -char unsigned *getInodeBitmap() { - struct ext2_group_desc *gd = getGroupDesc(); - return (char unsigned *)(disk+gd->bg_inode_bitmap*EXT2_BLOCK_SIZE); -} - -int getBit(char unsigned * bitmap, int index) { +int getBit(char unsigned *bitmap, int index) { return (bitmap[index/8]>>index%8)&1; } @@ -39,11 +37,11 @@ int getFirstEmptyBitIndex(int bitmapNum) { if (bitmapNum == INODE_BITMAP) { index = EXT2_GOOD_OLD_FIRST_INO; maxLength = getSuperblock()->s_inodes_count; - bitmap = getInodeBitmap(); + bitmap = getBitmap(INODE_BITMAP); } else { index = 0; maxLength = getSuperblock()->s_blocks_count; - bitmap = getBlockBitmap(); + bitmap = getBitmap(BLOCK_BITMAP); } while (index < maxLength) { if (getBit(bitmap, index) == 0) { @@ -83,7 +81,6 @@ struct ext2_inode *getInode(int inodeNum) { return &inodeTable[inodeNum-1]; } -///////////////refactoring: high//////////////////// /** * return new intialized inode number */ @@ -93,7 +90,7 @@ int initInode(unsigned short mode) { int index = getFirstEmptyBitIndex(INODE_BITMAP); // change its bitmap and update field in gd - char unsigned *bitmap = getInodeBitmap(); + char unsigned *bitmap = getBitmap(INODE_BITMAP); changeBitmap(bitmap, index, 'a'); getGroupDesc()->bg_free_inodes_count--; @@ -106,13 +103,18 @@ int initInode(unsigned short mode) { for(int i=0; i<15; i++) { inode_table[index].i_block[i] = 0; } + + // set creation time for this inode + struct ext2_super_block *sb = getSuperblock(); + inode_table[index].i_ctime = sb->s_mtime; + sb->s_mtime++; return index+1; } void deleteInode(int inodeNum) { - char unsigned *inode_bitmap = getInodeBitmap(); - char unsigned *block_bitmap = getBlockBitmap(); + char unsigned *inode_bitmap = getBitmap(INODE_BITMAP); + char unsigned *block_bitmap = getBitmap(BLOCK_BITMAP); // delete inode changeBitmap(inode_bitmap, inodeNum-1, 'd'); @@ -120,6 +122,10 @@ void deleteInode(int inodeNum) { struct ext2_inode *inode_table = getInodeTable(); struct ext2_inode *target = &inode_table[inodeNum-1]; + struct ext2_super_block *sb = getSuperblock(); + + target->i_dtime = sb->s_mtime; + sb->s_mtime++; // delete block int i; @@ -151,6 +157,8 @@ void deleteInode(int inodeNum) { void printInode(struct ext2_inode *inode) { + printf("i_ctime: %d\n", inode->i_ctime); + printf("i_dtime: %d\n", inode->i_dtime); printf("i_mode: %d\n", inode->i_mode); printf("i_size: %d\n", inode->i_size); printf("i_links_count: %d\n", inode->i_links_count); @@ -182,7 +190,7 @@ char unsigned *getBlock(int blockNum) { */ int allocateNewBlock() { int index = getFirstEmptyBitIndex(BLOCK_BITMAP); - changeBitmap(getBlockBitmap(), index, 'a'); + changeBitmap(getBitmap(BLOCK_BITMAP), index, 'a'); getGroupDesc()->bg_free_blocks_count--; return index+1; } diff --git a/utilities.h b/utilities.h index 1bf289f..7878cd7 100644 --- a/utilities.h +++ b/utilities.h @@ -23,9 +23,7 @@ struct ext2_super_block *getSuperblock(void); struct ext2_group_desc *getGroupDesc(void); // bitmap -char unsigned *getBlockBitmap(void); - -char unsigned *getInodeBitmap(void); +char unsigned *getBitmap(int bitmapNum); int getBit(char unsigned * bitmap, int index); From dbee41fc06a92ecebd0b275dee7f6c38e09b7211 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Thu, 2 Apr 2020 15:14:45 -0400 Subject: [PATCH 26/41] . --- utilities.c | 1 + 1 file changed, 1 insertion(+) diff --git a/utilities.c b/utilities.c index 91552f5..20f8927 100644 --- a/utilities.c +++ b/utilities.c @@ -157,6 +157,7 @@ void deleteInode(int inodeNum) { void printInode(struct ext2_inode *inode) { + printf("sb_mtime: %d\n", getSuperblock()->s_mtime); printf("i_ctime: %d\n", inode->i_ctime); printf("i_dtime: %d\n", inode->i_dtime); printf("i_mode: %d\n", inode->i_mode); From f38d74e38dc3e86e93e6b886375b3adc23bc9991 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Thu, 2 Apr 2020 17:03:20 -0400 Subject: [PATCH 27/41] . --- ext2_cp.c | 2 +- ext2_ls.c | 2 +- readimage.c | 3 ++- test.sh | 15 +++++++++++++-- utilities.c | 49 ++++++++++++------------------------------------- 5 files changed, 29 insertions(+), 42 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 3bc4468..1ecf256 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -64,7 +64,7 @@ int main(int argc, char **argv) { } // create file and cp - childInodeNum = initInode(EXT2_S_IFREG)+1; + childInodeNum = initInode(EXT2_S_IFREG); childInode = &inodeTable[childInodeNum-1]; unsigned int *singleIndirect = NULL; int nextBlockNum, byteRead; diff --git a/ext2_ls.c b/ext2_ls.c index 1782e64..6209486 100644 --- a/ext2_ls.c +++ b/ext2_ls.c @@ -79,7 +79,7 @@ int main(int argc, char **argv) { // for each dir entry in the block total_rec_len = 0; while (total_rec_len < EXT2_BLOCK_SIZE) { - if ((dir_entry->name[0]!='.' || flagged) && (dir_entry->name[0] != '\0')) { + if ((dir_entry->name[0]!='.' || flagged) && (dir_entry->name_len!=0)) { printf("%s\n", dir_entry->name); } total_rec_len = total_rec_len + dir_entry->rec_len; diff --git a/readimage.c b/readimage.c index b794c4c..3f3af72 100644 --- a/readimage.c +++ b/readimage.c @@ -114,7 +114,8 @@ int main(int argc, char **argv) { type = 'd'; else if (dir_entry->file_type == EXT2_FT_SYMLINK) type = 'l'; - printf("Inode: %d rec_len: %d name_len: %d type= %c name=%s\n", dir_entry->inode, dir_entry->rec_len, dir_entry->name_len, type, dir_entry->name); + if (dir_entry->name_len != 0) + printf("Inode: %d rec_len: %d name_len: %d type= %c name=%s\n", dir_entry->inode, dir_entry->rec_len, dir_entry->name_len, type, dir_entry->name); total_rec_len = total_rec_len + dir_entry->rec_len; dir_entry = (void *) dir_entry + dir_entry->rec_len; } diff --git a/test.sh b/test.sh index 67c0acd..39ec071 100755 --- a/test.sh +++ b/test.sh @@ -1,6 +1,7 @@ #./readimage twolevel.img -# ls +# ls test case: (dir, file, link) * (n/a, -a) + (invalid path, not exist) +# check: correctness of output # echo "-----test root: <<<./ext2_ls twolevel.img />>>-----" # ./ext2_ls twolevel.img / @@ -47,7 +48,7 @@ # cp # ./readimage emptydisk.img # echo "\n---------------------\n" -# # ./ext2_cp emptydisk.img /Users/javiewang/Desktop/large.txt /large.txt +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/large.txt /large.txt # ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename0.txt # ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename1.txt # ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename2.txt @@ -62,6 +63,16 @@ # ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename11.txt # echo "\n---------------------\n" # ./readimage emptydisk.img +# ./ext2_ls emptydisk.img -a / + +# rm +./readimage emptydisk.img +echo "\n---------------------\n" +./ext2_rm emptydisk.img /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename2.txt +echo "\n---------------------\n" +./readimage emptydisk.img +./ext2_ls emptydisk.img -a / + # mkdir + ls # echo "\n----------mkdir--------\n" diff --git a/utilities.c b/utilities.c index 20f8927..e195f6e 100644 --- a/utilities.c +++ b/utilities.c @@ -22,9 +22,10 @@ struct ext2_group_desc *getGroupDesc() { char unsigned *getBitmap(int bitmapNum) { struct ext2_group_desc *gd = getGroupDesc(); if (bitmapNum == INODE_BITMAP) - return (char unsigned *)(disk+gd->bg_block_bitmap*EXT2_BLOCK_SIZE); - else return (char unsigned *)(disk+gd->bg_inode_bitmap*EXT2_BLOCK_SIZE); + else if (bitmapNum == BLOCK_BITMAP) + return (char unsigned *)(disk+gd->bg_block_bitmap*EXT2_BLOCK_SIZE); + return NULL; } int getBit(char unsigned *bitmap, int index) { @@ -215,7 +216,6 @@ int calculateActuralSize(struct ext2_dir_entry_2 *dirent) { } struct ext2_dir_entry_2 *allocateNewDirent(struct ext2_inode *parent_inode, int size) { - unsigned int *singleIndirect; struct ext2_dir_entry_2 *new_dir_entry = NULL; // search in all used direct block for(int i = 0; i<12;i++) { @@ -226,40 +226,12 @@ struct ext2_dir_entry_2 *allocateNewDirent(struct ext2_inode *parent_inode, int } } - // search in single indirect block - if (parent_inode->i_block[12] != 0) - { - // for each block number in single indirect block - singleIndirect = (unsigned int *)getBlock(parent_inode->i_block[12]); - for(int i = 0; ii_block[i] != 0) continue; - newBlockNum = allocateNewBlock(); - parent_inode->i_block[i] = newBlockNum; -printf("new block: %d, is allocated for the directory at i_block[%d]\n", parent_inode->i_block[i], i); - } else if (i==12) { - if (parent_inode->i_block[i] != 0) break; - newBlockNum = allocateNewBlock(); - parent_inode->i_block[i] = newBlockNum; - singleIndirect = initSingleIndirect(parent_inode->i_block[i]); - continue; - } else { - if (singleIndirect[i-13] != 0) continue; - newBlockNum = allocateNewBlock(); - singleIndirect[i-13] = newBlockNum; - } - + for(int i = 0; i<12;i++) { + if (parent_inode->i_block[i] != 0) continue; + newBlockNum = allocateNewBlock(); + parent_inode->i_block[i] = newBlockNum; // increse parentdir size parent_inode->i_blocks+=(EXT2_BLOCK_SIZE+511)/512; @@ -269,7 +241,7 @@ printf("new block: %d, is allocated for the directory at i_block[%d]\n", parent_ new_dir_entry = (struct ext2_dir_entry_2 *)getBlock(newBlockNum); new_dir_entry->file_type = EXT2_FT_UNKNOWN; new_dir_entry->inode = 0; - new_dir_entry->name[0] = '\0'; + new_dir_entry->name_len = 0; new_dir_entry->rec_len = ((sizeof(struct ext2_dir_entry_2)+3)/4)*4; // return new setted dir_entry @@ -436,6 +408,7 @@ void rm(struct ext2_inode *parentInode, char *childFileName) { // delete childFile from parentDir and get childInode pre_dir_entry = getPreDirent(parentInode, childFileName); + cur_dir_entry = (void *)pre_dir_entry + pre_dir_entry->rec_len; pre_dir_entry->rec_len += cur_dir_entry->rec_len; childInode = getInode(cur_dir_entry->inode); @@ -482,7 +455,9 @@ void rm(struct ext2_inode *parentInode, char *childFileName) { } // if child link count == 0 remove inode - if (childInode->i_links_count == 0) + if (childInode->i_links_count == 0) { deleteInode(cur_dir_entry->inode); + getGroupDesc()->bg_used_dirs_count--; + } } } \ No newline at end of file From 153cafc4df04a26480b73dd80a2722b8bc19f8e1 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Thu, 2 Apr 2020 17:08:07 -0400 Subject: [PATCH 28/41] add line to update used dir counter --- ext2_ls.c | 113 +++++++++++++++++++++++++----------------------------- 1 file changed, 53 insertions(+), 60 deletions(-) diff --git a/ext2_ls.c b/ext2_ls.c index 6209486..30becde 100644 --- a/ext2_ls.c +++ b/ext2_ls.c @@ -5,23 +5,21 @@ #include #include #include +#include "ext2.h" #include #include -#include "ext2.h" #include "utilities.h" unsigned char *disk; -struct ext2_inode *inodeTable; int main(int argc, char **argv) { char path[EXT2_NAME_LEN]; char pathCopy[EXT2_NAME_LEN]; - char fileName[EXT2_NAME_LEN]; - int flagged = 0; - struct ext2_inode inode; + char dirName[EXT2_NAME_LEN]; + struct ext2_inode *parent_inode, *inode_table, *target_inode; - if(argc!=3 && argc!=4) { - fprintf(stderr, "Usage: ext2_ls \n"); + if(argc!=3) { + fprintf(stderr, "Usage: ./ext2_mkdir \n"); exit(1); } int fd = open(argv[1], O_RDWR); @@ -32,65 +30,60 @@ int main(int argc, char **argv) { perror("mmap"); exit(1); } - inodeTable = getInodeTable(); - // read other arguments - if(argc == 3) { - strcpy(path, argv[2]); - } else { - if (strcmp(argv[2], "-a")!=0) { - fprintf(stderr, "Invalid Flag\n"); - exit(1); - } - flagged = 1; - strcpy(path, argv[3]); + strcpy(path, argv[2]); + strcpy(pathCopy, argv[2]); + // if input is root, return EEXIST + if (strlen(pathCopy) == 1) { + fprintf(stderr, "Specified directory already exists\n"); + return EEXIST; + } + // get the parent directory of the specified directory + getParentDirPath(pathCopy); + int parent_inode_num = getInodeFromPath(pathCopy); + // if any component on the path of parent directory does not exist, + // return ENOENT + if (parent_inode_num == 0) { + fprintf(stderr, "One of the compoenets on the path does not exist\n"); + return ENOENT; } - // get the inode from path + // get the parent directory inode + inode_table = getInodeTable(); + parent_inode = &inode_table[parent_inode_num-1]; + // get the directory name from input strcpy(pathCopy, path); - int inodeNum = getInodeFromPath(pathCopy); - if (inodeNum == 0) { - fprintf(stderr, "No such file or directory\n"); - return ENOENT; + getFileNameFromPath(dirName, pathCopy); + int target_inode_num = searchFileInDir(parent_inode, dirName); + // if specified dir already exists, return EEXIST + if (target_inode_num != 0) { + fprintf(stderr, "Specified directory already exists\n"); + return EEXIST; } - inode = inodeTable[inodeNum-1]; - - // print all file nemes in directory data block - if (inode.i_mode & EXT2_S_IFDIR) { - struct ext2_dir_entry_2 *dir_entry = NULL; - unsigned int *singleIndirect = NULL; - int total_rec_len = 0; - // print file names in direct blocks - for (int i=0; i<13+EXT2_BLOCK_SIZE/4; i++) { + // initialize an inode for the specified directory + target_inode_num = initInode(EXT2_S_IFDIR); + target_inode = &inode_table[target_inode_num-1]; + //create an directory entry for the specified directory + initNewDirent(parent_inode, target_inode_num, EXT2_FT_DIR, dirName); - if (i<12) { - if (inode.i_block[i] == 0) continue; - dir_entry = (struct ext2_dir_entry_2 *)getBlock(inode.i_block[i]); - } else if (i==12) { - if (inode.i_block[i] == 0) break; - singleIndirect = (unsigned int *)getBlock(inode.i_block[12]); - continue; - } else { - if (singleIndirect[i-13] == 0) continue; - dir_entry = (struct ext2_dir_entry_2 *)getBlock(singleIndirect[i-13]); - } - - // for each dir entry in the block - total_rec_len = 0; - while (total_rec_len < EXT2_BLOCK_SIZE) { - if ((dir_entry->name[0]!='.' || flagged) && (dir_entry->name_len!=0)) { - printf("%s\n", dir_entry->name); - } - total_rec_len = total_rec_len + dir_entry->rec_len; - dir_entry = (void *) dir_entry + dir_entry->rec_len; - } - } + // allocate a new block for the specified directory + int newBlockNum = allocateNewBlock(); + target_inode->i_block[0] = newBlockNum; + struct ext2_dir_entry_2 *firstDirent = (struct ext2_dir_entry_2 *)getBlock(newBlockNum); + // initialize the data block information for the target directory + firstDirent->file_type = EXT2_FT_DIR; + firstDirent->inode = target_inode_num; + // create an entry for . + strcpy(firstDirent->name, "."); + firstDirent->name_len = 1; + firstDirent->rec_len = EXT2_BLOCK_SIZE; + // create an entry for .. + initNewDirent(target_inode, parent_inode_num, EXT2_FT_DIR, ".."); - // print file name - } else if (inode.i_mode&EXT2_S_IFREG || inode.i_mode&EXT2_S_IFLNK) { - getFileNameFromPath(fileName, path); - printf("%s\n", fileName); - } + // update the revelent information + getGroupDesc()->bg_used_dirs_count++; + parent_inode->i_links_count++; + target_inode->i_links_count = 2; return 0; -} \ No newline at end of file +} From 4ab5aa0e41f87885313e99fbad93c40f70a6e3f5 Mon Sep 17 00:00:00 2001 From: GuikangZhong <48389832+GuikangZhong@users.noreply.github.com> Date: Thu, 2 Apr 2020 17:22:41 -0400 Subject: [PATCH 29/41] Update ext2_mkdir.c --- ext2_mkdir.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ext2_mkdir.c b/ext2_mkdir.c index 749f603..30becde 100644 --- a/ext2_mkdir.c +++ b/ext2_mkdir.c @@ -71,11 +71,19 @@ int main(int argc, char **argv) { int newBlockNum = allocateNewBlock(); target_inode->i_block[0] = newBlockNum; struct ext2_dir_entry_2 *firstDirent = (struct ext2_dir_entry_2 *)getBlock(newBlockNum); + // initialize the data block information for the target directory firstDirent->file_type = EXT2_FT_DIR; firstDirent->inode = target_inode_num; + // create an entry for . strcpy(firstDirent->name, "."); firstDirent->name_len = 1; firstDirent->rec_len = EXT2_BLOCK_SIZE; + // create an entry for .. initNewDirent(target_inode, parent_inode_num, EXT2_FT_DIR, ".."); + + // update the revelent information + getGroupDesc()->bg_used_dirs_count++; + parent_inode->i_links_count++; + target_inode->i_links_count = 2; return 0; } From 7fa3e33a05f08b0c7508172192bd62290c67fc01 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Thu, 2 Apr 2020 17:38:33 -0400 Subject: [PATCH 30/41] , --- ext2_ls.c | 113 +++++++++++++++++++++++++++------------------------ ext2_mkdir.c | 8 ++++ 2 files changed, 68 insertions(+), 53 deletions(-) diff --git a/ext2_ls.c b/ext2_ls.c index 30becde..6209486 100644 --- a/ext2_ls.c +++ b/ext2_ls.c @@ -5,21 +5,23 @@ #include #include #include -#include "ext2.h" #include #include +#include "ext2.h" #include "utilities.h" unsigned char *disk; +struct ext2_inode *inodeTable; int main(int argc, char **argv) { char path[EXT2_NAME_LEN]; char pathCopy[EXT2_NAME_LEN]; - char dirName[EXT2_NAME_LEN]; - struct ext2_inode *parent_inode, *inode_table, *target_inode; + char fileName[EXT2_NAME_LEN]; + int flagged = 0; + struct ext2_inode inode; - if(argc!=3) { - fprintf(stderr, "Usage: ./ext2_mkdir \n"); + if(argc!=3 && argc!=4) { + fprintf(stderr, "Usage: ext2_ls \n"); exit(1); } int fd = open(argv[1], O_RDWR); @@ -30,60 +32,65 @@ int main(int argc, char **argv) { perror("mmap"); exit(1); } + inodeTable = getInodeTable(); - strcpy(path, argv[2]); - strcpy(pathCopy, argv[2]); - // if input is root, return EEXIST - if (strlen(pathCopy) == 1) { - fprintf(stderr, "Specified directory already exists\n"); - return EEXIST; - } - // get the parent directory of the specified directory - getParentDirPath(pathCopy); - int parent_inode_num = getInodeFromPath(pathCopy); - // if any component on the path of parent directory does not exist, - // return ENOENT - if (parent_inode_num == 0) { - fprintf(stderr, "One of the compoenets on the path does not exist\n"); - return ENOENT; + // read other arguments + if(argc == 3) { + strcpy(path, argv[2]); + } else { + if (strcmp(argv[2], "-a")!=0) { + fprintf(stderr, "Invalid Flag\n"); + exit(1); + } + flagged = 1; + strcpy(path, argv[3]); } - // get the parent directory inode - inode_table = getInodeTable(); - parent_inode = &inode_table[parent_inode_num-1]; - // get the directory name from input + // get the inode from path strcpy(pathCopy, path); - getFileNameFromPath(dirName, pathCopy); - int target_inode_num = searchFileInDir(parent_inode, dirName); - // if specified dir already exists, return EEXIST - if (target_inode_num != 0) { - fprintf(stderr, "Specified directory already exists\n"); - return EEXIST; + int inodeNum = getInodeFromPath(pathCopy); + if (inodeNum == 0) { + fprintf(stderr, "No such file or directory\n"); + return ENOENT; } + inode = inodeTable[inodeNum-1]; + + // print all file nemes in directory data block + if (inode.i_mode & EXT2_S_IFDIR) { + struct ext2_dir_entry_2 *dir_entry = NULL; + unsigned int *singleIndirect = NULL; + int total_rec_len = 0; - // initialize an inode for the specified directory - target_inode_num = initInode(EXT2_S_IFDIR); - target_inode = &inode_table[target_inode_num-1]; - //create an directory entry for the specified directory - initNewDirent(parent_inode, target_inode_num, EXT2_FT_DIR, dirName); + // print file names in direct blocks + for (int i=0; i<13+EXT2_BLOCK_SIZE/4; i++) { - // allocate a new block for the specified directory - int newBlockNum = allocateNewBlock(); - target_inode->i_block[0] = newBlockNum; - struct ext2_dir_entry_2 *firstDirent = (struct ext2_dir_entry_2 *)getBlock(newBlockNum); - // initialize the data block information for the target directory - firstDirent->file_type = EXT2_FT_DIR; - firstDirent->inode = target_inode_num; - // create an entry for . - strcpy(firstDirent->name, "."); - firstDirent->name_len = 1; - firstDirent->rec_len = EXT2_BLOCK_SIZE; - // create an entry for .. - initNewDirent(target_inode, parent_inode_num, EXT2_FT_DIR, ".."); + if (i<12) { + if (inode.i_block[i] == 0) continue; + dir_entry = (struct ext2_dir_entry_2 *)getBlock(inode.i_block[i]); + } else if (i==12) { + if (inode.i_block[i] == 0) break; + singleIndirect = (unsigned int *)getBlock(inode.i_block[12]); + continue; + } else { + if (singleIndirect[i-13] == 0) continue; + dir_entry = (struct ext2_dir_entry_2 *)getBlock(singleIndirect[i-13]); + } + + // for each dir entry in the block + total_rec_len = 0; + while (total_rec_len < EXT2_BLOCK_SIZE) { + if ((dir_entry->name[0]!='.' || flagged) && (dir_entry->name_len!=0)) { + printf("%s\n", dir_entry->name); + } + total_rec_len = total_rec_len + dir_entry->rec_len; + dir_entry = (void *) dir_entry + dir_entry->rec_len; + } + } - // update the revelent information - getGroupDesc()->bg_used_dirs_count++; - parent_inode->i_links_count++; - target_inode->i_links_count = 2; + // print file name + } else if (inode.i_mode&EXT2_S_IFREG || inode.i_mode&EXT2_S_IFLNK) { + getFileNameFromPath(fileName, path); + printf("%s\n", fileName); + } return 0; -} +} \ No newline at end of file diff --git a/ext2_mkdir.c b/ext2_mkdir.c index 749f603..30becde 100644 --- a/ext2_mkdir.c +++ b/ext2_mkdir.c @@ -71,11 +71,19 @@ int main(int argc, char **argv) { int newBlockNum = allocateNewBlock(); target_inode->i_block[0] = newBlockNum; struct ext2_dir_entry_2 *firstDirent = (struct ext2_dir_entry_2 *)getBlock(newBlockNum); + // initialize the data block information for the target directory firstDirent->file_type = EXT2_FT_DIR; firstDirent->inode = target_inode_num; + // create an entry for . strcpy(firstDirent->name, "."); firstDirent->name_len = 1; firstDirent->rec_len = EXT2_BLOCK_SIZE; + // create an entry for .. initNewDirent(target_inode, parent_inode_num, EXT2_FT_DIR, ".."); + + // update the revelent information + getGroupDesc()->bg_used_dirs_count++; + parent_inode->i_links_count++; + target_inode->i_links_count = 2; return 0; } From cc441808c361913f002b366c45d58a4a980913c0 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Thu, 2 Apr 2020 18:27:01 -0400 Subject: [PATCH 31/41] . --- utilities.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/utilities.c b/utilities.c index e195f6e..9683e2b 100644 --- a/utilities.c +++ b/utilities.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "ext2.h" #include "utilities.h" @@ -106,9 +107,7 @@ int initInode(unsigned short mode) { } // set creation time for this inode - struct ext2_super_block *sb = getSuperblock(); - inode_table[index].i_ctime = sb->s_mtime; - sb->s_mtime++; + inode_table[index].i_ctime = time(NULL); return index+1; } @@ -123,10 +122,8 @@ void deleteInode(int inodeNum) { struct ext2_inode *inode_table = getInodeTable(); struct ext2_inode *target = &inode_table[inodeNum-1]; - struct ext2_super_block *sb = getSuperblock(); - target->i_dtime = sb->s_mtime; - sb->s_mtime++; + target->i_dtime = time(NULL); // delete block int i; From 3e3ff515b957e29126bd5c469fdc79cecd5a192e Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Thu, 2 Apr 2020 19:45:07 -0400 Subject: [PATCH 32/41] . --- ext2_cp.c | 2 +- test.sh | 44 ++++++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 1ecf256..2edefb2 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -98,7 +98,7 @@ printf("file size: %d\n", fileSize); if (singleIndirect == NULL) childInode->i_blocks = ((fileSize+1023)/1024)*2; else - childInode->i_blocks = ((fileSize+1023)/1024)*2+1; + childInode->i_blocks = ((fileSize+1023)/1024+1)*2; printf("\n--childInode: --\n"); printInode(childInode); // add dir_entry fot this file into parent dir diff --git a/test.sh b/test.sh index 39ec071..5005444 100755 --- a/test.sh +++ b/test.sh @@ -1,7 +1,7 @@ -#./readimage twolevel.img +# #./readimage twolevel.img -# ls test case: (dir, file, link) * (n/a, -a) + (invalid path, not exist) -# check: correctness of output +# # ls test case: (dir, file, link) * (n/a, -a) + (invalid path, not exist) +# # check: correctness of output # echo "-----test root: <<<./ext2_ls twolevel.img />>>-----" # ./ext2_ls twolevel.img / @@ -45,7 +45,7 @@ # echo "-----test print a file name, this should work but fail: <<<./ext2_ls onedirectory.img /level1/bfilee.s>>>-----" # ./ext2_ls onedirectory.img /level1/bfilee.s -# cp +# # cp # ./readimage emptydisk.img # echo "\n---------------------\n" # ./ext2_cp emptydisk.img /Users/javiewang/Desktop/large.txt /large.txt @@ -66,26 +66,26 @@ # ./ext2_ls emptydisk.img -a / # rm -./readimage emptydisk.img -echo "\n---------------------\n" -./ext2_rm emptydisk.img /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename2.txt -echo "\n---------------------\n" -./readimage emptydisk.img -./ext2_ls emptydisk.img -a / +# ./readimage emptydisk.img +# echo "\n---------------------\n" +# ./ext2_rm emptydisk.img /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename7.txt +# echo "\n---------------------\n" +# ./readimage emptydisk.img +# ./ext2_ls emptydisk.img -a / # mkdir + ls -# echo "\n----------mkdir--------\n" -# ./ext2_mkdir emptydisk.img /123 -# echo "\n----------ls-----------\n" -# ./ext2_ls emptydisk.img / -# echo "\n---------readimage----\n" -# ./readimage emptydisk.img -# echo "\n---------test---------\n" -# ./test emptydisk.img / -# echo "\n---------test---------\n" -# ./test emptydisk.img /123 -# echo "\n---------test---------\n" -# ./test emptydisk.img /lost+found +echo "\n----------mkdir--------\n" +./ext2_mkdir emptydisk.img /123 +echo "\n----------ls-----------\n" +./ext2_ls emptydisk.img / +echo "\n---------readimage----\n" +./readimage emptydisk.img +echo "\n---------test---------\n" +./test emptydisk.img / +echo "\n---------test---------\n" +./test emptydisk.img /123 +echo "\n---------test---------\n" +./test emptydisk.img /lost+found # rm From 05b6482104cddb42a07f77a11ea9f9192153605e Mon Sep 17 00:00:00 2001 From: GuikangZhong <48389832+GuikangZhong@users.noreply.github.com> Date: Thu, 2 Apr 2020 19:45:41 -0400 Subject: [PATCH 33/41] Update test.sh --- test.sh | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/test.sh b/test.sh index 5005444..50dafff 100755 --- a/test.sh +++ b/test.sh @@ -88,4 +88,33 @@ echo "\n---------test---------\n" echo "\n---------test---------\n" ./test emptydisk.img /lost+found +#mkdir +echo "-----test mkdir at root, this should fail: <<<./ext2_mkdir emptydisk.img />>>-----" +./ext2_mkdir emptydisk.img / +echo "-----test mkdir lost+found, this should fail: <<<./ext2_mkdir emptydisk.img /lost+found>>>-----" +./ext2_mkdir emptydisk.img /lost+found +echo "-----test mkdir hello at root, this should work: <<<./ext2_mkdir emptydisk.img /hello>>>-----" +./ext2_mkdir emptydisk.img /hello +./ext2_ls emptydisk.img / +echo "-----test mkdir hello at root again, this should fail: <<<./ext2_mkdir emptydisk.img /hello/>>>-----" +./ext2_mkdir emptydisk.img /hello/ +./ext2_ls emptydisk.img / +echo "-----test mkdir world at non-existing dir, this should fail: <<<./ext2_mkdir emptydisk.img /hi/world>>>-----" +./ext2_mkdir emptydisk.img /hi/world +echo "-----test mkdir world at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/world>>>-----" +./ext2_mkdir emptydisk.img /hello/world +./ext2_ls emptydisk.img /hello +echo "-----test mkdir good at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/good>>>-----" +./ext2_mkdir emptydisk.img /hello/good +./ext2_ls emptydisk.img /hello +echo "-----test mkdir world at file afile, this should fail: <<<./ext2_mkdir twolevel.img /afile/world>>>-----" +./ext2_mkdir twolevel.img /afile/world +echo "-----test mkdir . and .. at hello dir, this should fail: <<<./ext2_mkdir emptydisk.img /hello/.(..)>>>-----" +./ext2_mkdir emptydisk.img /hello/. +./ext2_mkdir emptydisk.img /hello/.. +echo "-----test mkdir with no input img file, this should fail: <<<./ext2_mkdir /hello/>>>-----" +./ext2_mkdir /hello/ +echo "-----test mkdir with no wrong img file, this should fail: <<<./ext2_mkdir haha.img /hello/>>>-----" +./ext2_mkdir haha.img /hello/ + # rm From fef58b51dfee113e2d6d7644060048f4c585d488 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Thu, 2 Apr 2020 21:17:18 -0400 Subject: [PATCH 34/41] .. --- ext2_cp.c | 3 +++ ext2_ln.c | 7 +++++-- ext2_rm.c | 6 ++++++ ext2_rm_bonus.c | 3 +++ test.sh | 24 ++++++++++++------------ utilities.c | 3 ++- 6 files changed, 31 insertions(+), 15 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 2edefb2..847e908 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -45,6 +45,9 @@ int main(int argc, char **argv) { if (parentDirPath[0]!='/') { fprintf(stderr, "Must be absolute path\n"); return ENOENT; + } else if (parentDirPath[1]=='\0'){ + fprintf(stderr, "Destination cannot be root directory\n"); + return EEXIST; } else { getParentDirPath(parentDirPath); } diff --git a/ext2_ln.c b/ext2_ln.c index 4344b03..a8e4672 100644 --- a/ext2_ln.c +++ b/ext2_ln.c @@ -71,7 +71,7 @@ int main(int argc, char **argv) { return ENOENT; } targetInode = &inodeTable[inodeNum-1]; - if (targetInode->i_mode == EXT2_S_IFDIR){ + if (targetInode->i_mode & EXT2_S_IFDIR){ fprintf(stderr, "No link to a directory\n"); return EISDIR; } @@ -84,6 +84,9 @@ int main(int argc, char **argv) { perror("Invalid parentDirPath"); fprintf(stderr, "No such file or directory\n"); return ENOENT; + } else if (parentOfPathFrom[1]=='\0'){ + fprintf(stderr, "No link from a directory\n"); + return EISDIR; } else { getParentDirPath(parentOfPathFrom); } @@ -133,4 +136,4 @@ int main(int argc, char **argv) { } return 0; -} \ No newline at end of file +} diff --git a/ext2_rm.c b/ext2_rm.c index c66bb9f..e5803ae 100644 --- a/ext2_rm.c +++ b/ext2_rm.c @@ -35,9 +35,15 @@ int main(int argc, char **argv) { // get the parent directory inode strcpy(parentDirPath, argv[2]); + // if it's not a absolute path if (parentDirPath[0]!='/') { fprintf(stderr, "No such file or directory\n"); return ENOENT; + // if it's a root directory + } else if (parentDirPath[1]=='\0'){ + fprintf(stderr, "Cannot remove root directory\n"); + return ENOENT; + // general case } else { getParentDirPath(parentDirPath); } diff --git a/ext2_rm_bonus.c b/ext2_rm_bonus.c index 3a7d7f8..bce8e12 100644 --- a/ext2_rm_bonus.c +++ b/ext2_rm_bonus.c @@ -52,6 +52,9 @@ int main(int argc, char **argv) { if (parentDirPath[0]!='/') { fprintf(stderr, "No such file or directory\n"); return ENOENT; + } else if (parentDirPath[1]=='\0'){ + fprintf(stderr, "Cannot remove root directory\n"); + return ENOENT; } else { getParentDirPath(parentDirPath); } diff --git a/test.sh b/test.sh index 50dafff..f0b2876 100755 --- a/test.sh +++ b/test.sh @@ -75,18 +75,18 @@ # mkdir + ls -echo "\n----------mkdir--------\n" -./ext2_mkdir emptydisk.img /123 -echo "\n----------ls-----------\n" -./ext2_ls emptydisk.img / -echo "\n---------readimage----\n" -./readimage emptydisk.img -echo "\n---------test---------\n" -./test emptydisk.img / -echo "\n---------test---------\n" -./test emptydisk.img /123 -echo "\n---------test---------\n" -./test emptydisk.img /lost+found +# echo "\n----------mkdir--------\n" +# ./ext2_mkdir emptydisk.img /123 +# echo "\n----------ls-----------\n" +# ./ext2_ls emptydisk.img / +# echo "\n---------readimage----\n" +# ./readimage emptydisk.img +# echo "\n---------test---------\n" +# ./test emptydisk.img / +# echo "\n---------test---------\n" +# ./test emptydisk.img /123 +# echo "\n---------test---------\n" +# ./test emptydisk.img /lost+found #mkdir echo "-----test mkdir at root, this should fail: <<<./ext2_mkdir emptydisk.img />>>-----" diff --git a/utilities.c b/utilities.c index 9683e2b..9111dcf 100644 --- a/utilities.c +++ b/utilities.c @@ -155,7 +155,6 @@ void deleteInode(int inodeNum) { void printInode(struct ext2_inode *inode) { - printf("sb_mtime: %d\n", getSuperblock()->s_mtime); printf("i_ctime: %d\n", inode->i_ctime); printf("i_dtime: %d\n", inode->i_dtime); printf("i_mode: %d\n", inode->i_mode); @@ -361,6 +360,8 @@ void getParentDirPath(char *path) { /* * modify input path */ + assert (strcmp(path, "/")!=0); + int len = strlen(path); if (path[len-1]=='/') path[len-1] = '\0'; From 455c905afea3dc9c91d29760aea729edb6762cf5 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Thu, 2 Apr 2020 21:27:25 -0400 Subject: [PATCH 35/41] . --- utilities.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utilities.c b/utilities.c index 9111dcf..664d189 100644 --- a/utilities.c +++ b/utilities.c @@ -361,7 +361,7 @@ void getParentDirPath(char *path) { * modify input path */ assert (strcmp(path, "/")!=0); - + int len = strlen(path); if (path[len-1]=='/') path[len-1] = '\0'; @@ -432,7 +432,7 @@ void rm(struct ext2_inode *parentInode, char *childFileName) { // reduce link count for self and parent (. and ..) childInode->i_links_count--; parentInode->i_links_count--; - + printf("1\n"); // for each file name (other than . and ..) in child dir, call recursion for (int i=0; i<12; i++) { if (childInode->i_block[i] == 0) @@ -442,7 +442,7 @@ void rm(struct ext2_inode *parentInode, char *childFileName) { total_rec_len = 0; // for each dir entry in the block while (total_rec_len < EXT2_BLOCK_SIZE) { - if (strcmp(cur_dir_entry->name, "")!=0 && + if (cur_dir_entry->name_len == 0 && strcmp(cur_dir_entry->name, ".")!=0 && strcmp(cur_dir_entry->name, "..")!=0) rm(childInode, cur_dir_entry->name); @@ -451,7 +451,7 @@ void rm(struct ext2_inode *parentInode, char *childFileName) { cur_dir_entry = (void *) cur_dir_entry + cur_dir_entry->rec_len; } } - + printf("2\n"); // if child link count == 0 remove inode if (childInode->i_links_count == 0) { deleteInode(cur_dir_entry->inode); From 352f7244e023815c3c3292c1f62a1fdb5f0f8621 Mon Sep 17 00:00:00 2001 From: GuikangZhong Date: Thu, 2 Apr 2020 21:55:06 -0400 Subject: [PATCH 36/41] fixed bugs --- utilities.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utilities.c b/utilities.c index 664d189..6606389 100644 --- a/utilities.c +++ b/utilities.c @@ -203,6 +203,8 @@ int searchFileInDir(struct ext2_inode *parentInode, char *childFileName) { if (pre_dir_entry != NULL) { cur_dir_entry = (void *)pre_dir_entry + pre_dir_entry->rec_len; return cur_dir_entry->inode; + } else if (strcmp(childFileName, ".") == 0) { + return ((struct ext2_dir_entry_2 *)getBlock(parentInode->i_block[0]))->inode; } return 0; } From 2e73a19d542098c55958944a0c7a56ba710d4546 Mon Sep 17 00:00:00 2001 From: Guikang Zhong Date: Thu, 2 Apr 2020 23:07:27 -0400 Subject: [PATCH 37/41] update --- test.sh | 68 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/test.sh b/test.sh index f0b2876..44b5c75 100755 --- a/test.sh +++ b/test.sh @@ -89,32 +89,46 @@ # ./test emptydisk.img /lost+found #mkdir -echo "-----test mkdir at root, this should fail: <<<./ext2_mkdir emptydisk.img />>>-----" -./ext2_mkdir emptydisk.img / -echo "-----test mkdir lost+found, this should fail: <<<./ext2_mkdir emptydisk.img /lost+found>>>-----" -./ext2_mkdir emptydisk.img /lost+found -echo "-----test mkdir hello at root, this should work: <<<./ext2_mkdir emptydisk.img /hello>>>-----" -./ext2_mkdir emptydisk.img /hello -./ext2_ls emptydisk.img / -echo "-----test mkdir hello at root again, this should fail: <<<./ext2_mkdir emptydisk.img /hello/>>>-----" -./ext2_mkdir emptydisk.img /hello/ -./ext2_ls emptydisk.img / -echo "-----test mkdir world at non-existing dir, this should fail: <<<./ext2_mkdir emptydisk.img /hi/world>>>-----" -./ext2_mkdir emptydisk.img /hi/world -echo "-----test mkdir world at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/world>>>-----" -./ext2_mkdir emptydisk.img /hello/world -./ext2_ls emptydisk.img /hello -echo "-----test mkdir good at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/good>>>-----" -./ext2_mkdir emptydisk.img /hello/good -./ext2_ls emptydisk.img /hello -echo "-----test mkdir world at file afile, this should fail: <<<./ext2_mkdir twolevel.img /afile/world>>>-----" -./ext2_mkdir twolevel.img /afile/world -echo "-----test mkdir . and .. at hello dir, this should fail: <<<./ext2_mkdir emptydisk.img /hello/.(..)>>>-----" -./ext2_mkdir emptydisk.img /hello/. -./ext2_mkdir emptydisk.img /hello/.. -echo "-----test mkdir with no input img file, this should fail: <<<./ext2_mkdir /hello/>>>-----" -./ext2_mkdir /hello/ -echo "-----test mkdir with no wrong img file, this should fail: <<<./ext2_mkdir haha.img /hello/>>>-----" -./ext2_mkdir haha.img /hello/ +# echo "-----test mkdir at root, this should fail: <<<./ext2_mkdir emptydisk.img />>>-----" +# ./ext2_mkdir emptydisk.img / +# echo "-----test mkdir lost+found, this should fail: <<<./ext2_mkdir emptydisk.img /lost+found>>>-----" +# ./ext2_mkdir emptydisk.img /lost+found +# echo "-----test mkdir hello at root, this should work: <<<./ext2_mkdir emptydisk.img /hello>>>-----" +# ./ext2_mkdir emptydisk.img /hello +# ./ext2_ls emptydisk.img / +# echo "-----test mkdir hello at root again, this should fail: <<<./ext2_mkdir emptydisk.img /hello/>>>-----" +# ./ext2_mkdir emptydisk.img /hello/ +# ./ext2_ls emptydisk.img / +# echo "-----test mkdir world at non-existing dir, this should fail: <<<./ext2_mkdir emptydisk.img /hi/world>>>-----" +# ./ext2_mkdir emptydisk.img /hi/world +# echo "-----test mkdir world at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/world>>>-----" +# ./ext2_mkdir emptydisk.img /hello/world +# ./ext2_ls emptydisk.img /hello +# echo "-----test mkdir good at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/good>>>-----" +# ./ext2_mkdir emptydisk.img /hello/good +# ./ext2_ls emptydisk.img /hello +# echo "-----test mkdir world at file afile, this should fail: <<<./ext2_mkdir twolevel.img /afile/world>>>-----" +# ./ext2_mkdir twolevel.img /afile/world +# echo "-----test mkdir . and .. at hello dir, this should fail: <<<./ext2_mkdir emptydisk.img /hello/.(..)>>>-----" +# ./ext2_mkdir emptydisk.img /hello/. +# ./ext2_mkdir emptydisk.img /hello/.. +# echo "-----test mkdir with no input img file, this should fail: <<<./ext2_mkdir /hello/>>>-----" +# ./ext2_mkdir /hello/ +# echo "-----test mkdir with no wrong img file, this should fail: <<<./ext2_mkdir haha.img /hello/>>>-----" +# ./ext2_mkdir haha.img /hello/ # rm +./ext2_mkdir emptydisk.img /dir1 +./ext2_mkdir emptydisk.img /dir1/dir2 +./ext2_mkdir emptydisk.img /dir1/dir2/dir3 +./ext2_cp emptydisk.img file1.txt /file1 +./ext2_cp emptydisk.img file2.txt /dir1/file2 +./ext2_cp emptydisk.img file3.txt /dir1/dir2/file3 +./ext2_ln emptydisk.img -s /dir1/file2 /slink1 +./ext2_ln emptydisk.img /dir1/file2 /hlink1 +./ext2_ln emptydisk.img -s /dir1/dir2/file3 /dir1/slink2 +./ext2_ln emptydisk.img /dir1/dir2/file3 /dir1/hlink2 +./ext2_ln emptydisk.img -s /file1 /dir1/dir2/slink3 +./ext2_ln emptydisk.img /file1 /dir1/dir2/hlink3 + + From 93e3b7c238f0a731280925275ab830eb75e42558 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Fri, 3 Apr 2020 23:13:02 -0400 Subject: [PATCH 38/41] newest update --- ext2_cp.c | 16 +++---- ext2_ln.c | 2 +- test.sh | 118 +++++++++++++++++++++++++++++++++++++++------------- utilities.c | 57 ++++++++++++++----------- 4 files changed, 130 insertions(+), 63 deletions(-) diff --git a/ext2_cp.c b/ext2_cp.c index 847e908..11bf772 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -81,7 +81,7 @@ printf("Block %d is allocated for: %s\n", nextBlockNum, fileName); } else if (i==12) { childInode->i_block[i] = nextBlockNum; singleIndirect = initSingleIndirect(nextBlockNum); -printf("N/A, since this block is for singleindirect.\n"); +printf("\nabove block is for singleindirect.\n"); i++; continue; } else { @@ -89,23 +89,23 @@ printf("N/A, since this block is for singleindirect.\n"); } byteRead = fread(getBlock(nextBlockNum), 1, 1024, src_fd); -printf("%s\n", getBlock(nextBlockNum)); -printf("total %d bytes in this block\n", byteRead); +//printf("%s\n", getBlock(nextBlockNum)); +//printf("total %d bytes in this block\n", byteRead); fileSize += byteRead; i++; } fclose(src_fd); // uptate inode filed -printf("file size: %d\n", fileSize); +//printf("file size: %d\n", fileSize); childInode->i_size = fileSize; if (singleIndirect == NULL) childInode->i_blocks = ((fileSize+1023)/1024)*2; else childInode->i_blocks = ((fileSize+1023)/1024+1)*2; -printf("\n--childInode: --\n"); -printInode(childInode); +//printf("\n--childInode: --\n"); +//printInode(childInode); // add dir_entry fot this file into parent dir initNewDirent(parentInode, childInodeNum, EXT2_FT_REG_FILE, fileName); -printf("\n--parentInode: --\n"); -printInode(parentInode); +//printf("\n--parentInode: --\n"); +//printInode(parentInode); } \ No newline at end of file diff --git a/ext2_ln.c b/ext2_ln.c index a8e4672..ce68045 100644 --- a/ext2_ln.c +++ b/ext2_ln.c @@ -124,7 +124,7 @@ int main(int argc, char **argv) { initNewDirent(parentInode, childInodeNum, EXT2_FT_SYMLINK, linkName); - if (childInode->i_size < 60){ + if (childInode->i_size <= 60){ strcpy((char *)childInode->i_block, pathTo); }else{ // append path to the inode block diff --git a/test.sh b/test.sh index f0b2876..38b417a 100755 --- a/test.sh +++ b/test.sh @@ -89,32 +89,92 @@ # ./test emptydisk.img /lost+found #mkdir -echo "-----test mkdir at root, this should fail: <<<./ext2_mkdir emptydisk.img />>>-----" -./ext2_mkdir emptydisk.img / -echo "-----test mkdir lost+found, this should fail: <<<./ext2_mkdir emptydisk.img /lost+found>>>-----" -./ext2_mkdir emptydisk.img /lost+found -echo "-----test mkdir hello at root, this should work: <<<./ext2_mkdir emptydisk.img /hello>>>-----" -./ext2_mkdir emptydisk.img /hello -./ext2_ls emptydisk.img / -echo "-----test mkdir hello at root again, this should fail: <<<./ext2_mkdir emptydisk.img /hello/>>>-----" -./ext2_mkdir emptydisk.img /hello/ -./ext2_ls emptydisk.img / -echo "-----test mkdir world at non-existing dir, this should fail: <<<./ext2_mkdir emptydisk.img /hi/world>>>-----" -./ext2_mkdir emptydisk.img /hi/world -echo "-----test mkdir world at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/world>>>-----" -./ext2_mkdir emptydisk.img /hello/world -./ext2_ls emptydisk.img /hello -echo "-----test mkdir good at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/good>>>-----" -./ext2_mkdir emptydisk.img /hello/good -./ext2_ls emptydisk.img /hello -echo "-----test mkdir world at file afile, this should fail: <<<./ext2_mkdir twolevel.img /afile/world>>>-----" -./ext2_mkdir twolevel.img /afile/world -echo "-----test mkdir . and .. at hello dir, this should fail: <<<./ext2_mkdir emptydisk.img /hello/.(..)>>>-----" -./ext2_mkdir emptydisk.img /hello/. -./ext2_mkdir emptydisk.img /hello/.. -echo "-----test mkdir with no input img file, this should fail: <<<./ext2_mkdir /hello/>>>-----" -./ext2_mkdir /hello/ -echo "-----test mkdir with no wrong img file, this should fail: <<<./ext2_mkdir haha.img /hello/>>>-----" -./ext2_mkdir haha.img /hello/ - -# rm +# echo "-----test mkdir at root, this should fail: <<<./ext2_mkdir emptydisk.img />>>-----" +# ./ext2_mkdir emptydisk.img / +# echo "-----test mkdir lost+found, this should fail: <<<./ext2_mkdir emptydisk.img /lost+found>>>-----" +# ./ext2_mkdir emptydisk.img /lost+found +# echo "-----test mkdir hello at root, this should work: <<<./ext2_mkdir emptydisk.img /hello>>>-----" +# ./ext2_mkdir emptydisk.img /hello +# ./ext2_ls emptydisk.img / +# echo "-----test mkdir hello at root again, this should fail: <<<./ext2_mkdir emptydisk.img /hello/>>>-----" +# ./ext2_mkdir emptydisk.img /hello/ +# ./ext2_ls emptydisk.img / +# echo "-----test mkdir world at non-existing dir, this should fail: <<<./ext2_mkdir emptydisk.img /hi/world>>>-----" +# ./ext2_mkdir emptydisk.img /hi/world +# echo "-----test mkdir world at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/world>>>-----" +# ./ext2_mkdir emptydisk.img /hello/world +# ./ext2_ls emptydisk.img /hello +# echo "-----test mkdir good at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/good>>>-----" +# ./ext2_mkdir emptydisk.img /hello/good +# ./ext2_ls emptydisk.img /hello +# echo "-----test mkdir world at file afile, this should fail: <<<./ext2_mkdir twolevel.img /afile/world>>>-----" +# ./ext2_mkdir twolevel.img /afile/world +# echo "-----test mkdir . and .. at hello dir, this should fail: <<<./ext2_mkdir emptydisk.img /hello/.(..)>>>-----" +# ./ext2_mkdir emptydisk.img /hello/. +# ./ext2_mkdir emptydisk.img /hello/.. +# echo "-----test mkdir with no input img file, this should fail: <<<./ext2_mkdir /hello/>>>-----" +# ./ext2_mkdir /hello/ +# echo "-----test mkdir with no wrong img file, this should fail: <<<./ext2_mkdir haha.img /hello/>>>-----" +# ./ext2_mkdir haha.img /hello/ + +# rm (file, link, dir)*(target link count 1, 2, more) + +# cp /Users/javiewang/Desktop/emptydisk.img /Users/javiewang/Desktop/CSCC69A3/emptydisk.img +# ./ext2_mkdir emptydisk.img /1 +# ./ext2_mkdir emptydisk.img /1/2 +# ./ext2_mkdir emptydisk.img /1/3 +# ./ext2_mkdir emptydisk.img /1/3/4 +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /1/f1 +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /1/2/f2 +# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /1/3/f3 +# ./ext2_ln emptydisk.img -s /1/f1 /1/2/sl1 +# ./ext2_ln emptydisk.img /1/2/f2 /1/hl2 +# echo "\n ---------- \n" +# ./ext2_ls emptydisk.img / +# echo "\n ---------- \n" +# ./readimage emptydisk.img +# echo "\n ---------- \n" +# ./ext2_rm_bonus emptydisk.img -r /1 +# echo "\n ---------- \n" +# ./readimage emptydisk.img +# rm_bonus + +cp /Users/javiewang/Desktop/emptydisk.img /Users/javiewang/Desktop/CSCC69A3/emptydisk.img +./ext2_mkdir emptydisk.img /dir1 +./ext2_mkdir emptydisk.img /dir1/dir2 +./ext2_mkdir emptydisk.img /dir1/dir2/dir3 +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /file1 +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/file2 +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/file3 +./ext2_ln emptydisk.img -s /dir1/file2 /slink1 +./ext2_ln emptydisk.img /dir1/file2 /hlink1 +./ext2_ln emptydisk.img -s /dir1/dir2/file3 /dir1/slink2 +./ext2_ln emptydisk.img /dir1/dir2/file3 /dir1/hlink2 +./ext2_ln emptydisk.img -s /file1 /dir1/dir2/slink3 +./ext2_ln emptydisk.img -s /file1 /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelink +./ext2_ln emptydisk.img /file1 /dir1/dir2/hlink3 +./ext2_cp emptydisk.img /Users/javiewang/Desktop/large.txt /dir1/dir2/large.txt +echo "\n---------------------\n" +./readimage emptydisk.img +echo "\n---------------------\n" +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename0.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename1.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename2.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename3.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename4.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename5.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename6.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename7.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename8.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename9.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename10.txt +./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename11.txt +./ext2_ln emptydisk.img /dir1/dir2/large.txt /large +./ext2_ln emptydisk.img /dir1/dir2/large.txt /dir1/large +echo "\n---------------------\n" +./readimage emptydisk.img +echo "\n---------------------\n" +./ext2_rm_bonus emptydisk.img -r /dir1 +echo "\n---------------------\n" +./readimage emptydisk.img +echo "\n---------------------\n" \ No newline at end of file diff --git a/utilities.c b/utilities.c index 6606389..d1bf986 100644 --- a/utilities.c +++ b/utilities.c @@ -119,17 +119,16 @@ void deleteInode(int inodeNum) { // delete inode changeBitmap(inode_bitmap, inodeNum-1, 'd'); getGroupDesc()->bg_free_inodes_count++; - struct ext2_inode *inode_table = getInodeTable(); struct ext2_inode *target = &inode_table[inodeNum-1]; - target->i_dtime = time(NULL); - + // delete block int i; for(i = 0; i<12;i++) { if (target->i_block[i] != 0) { - changeBitmap(block_bitmap, target->i_block[i], 'd'); +printf("\n--inodeNum: %d, type: f/d, block_number: %d--\n\n", inodeNum, target->i_block[i]); + changeBitmap(block_bitmap, target->i_block[i]-1, 'd'); getGroupDesc()->bg_free_blocks_count++; } } @@ -142,13 +141,14 @@ void deleteInode(int inodeNum) { unsigned int *single = (unsigned int*)getBlock(bp); for (int i=0; ibg_free_blocks_count++; } } - +printf("\n--inodeNum: %d, type: f/d, block_number: %d--\n\n", inodeNum, target->i_block[12]); // delte single itself - changeBitmap(block_bitmap, target->i_block[12], 'd'); + changeBitmap(block_bitmap, target->i_block[12]-1, 'd'); getGroupDesc()->bg_free_blocks_count++; } } @@ -409,24 +409,29 @@ void rm(struct ext2_inode *parentInode, char *childFileName) { // delete childFile from parentDir and get childInode pre_dir_entry = getPreDirent(parentInode, childFileName); cur_dir_entry = (void *)pre_dir_entry + pre_dir_entry->rec_len; - pre_dir_entry->rec_len += cur_dir_entry->rec_len; childInode = getInode(cur_dir_entry->inode); // base case1, if childInode is Symbolic link if (cur_dir_entry->file_type == EXT2_FT_SYMLINK) { - // just delete the inode since - deleteInode(cur_dir_entry->inode); + if (childInode->i_size > 60) { + changeBitmap(getBitmap(BLOCK_BITMAP), childInode->i_block[0]-1, 'd'); + getGroupDesc()->bg_free_blocks_count++; + } + changeBitmap(getBitmap(INODE_BITMAP), cur_dir_entry->inode-1, 'd'); + getGroupDesc()->bg_free_inodes_count++; +printf("inode num: %d, filename: %s, type: l, is deleted\n", cur_dir_entry->inode, cur_dir_entry->name); } // base case2, if childInode is a file else if (cur_dir_entry->file_type == EXT2_FT_REG_FILE) { - // reduce link count - childInode->i_links_count--; - // if link count == 0 remove inode - if (childInode->i_links_count == 0) + if (childInode->i_links_count == 1) { +printf("inode num: %d, filename: %s, type: f , link_count: %d, is deleted\n", cur_dir_entry->inode, cur_dir_entry->name, childInode->i_links_count); deleteInode(cur_dir_entry->inode); + } else { + childInode->i_links_count--; + } } // recursive case, if childInode is a dir else if (cur_dir_entry->file_type == EXT2_FT_DIR) @@ -434,30 +439,32 @@ void rm(struct ext2_inode *parentInode, char *childFileName) { // reduce link count for self and parent (. and ..) childInode->i_links_count--; parentInode->i_links_count--; - printf("1\n"); + // for each file name (other than . and ..) in child dir, call recursion for (int i=0; i<12; i++) { if (childInode->i_block[i] == 0) continue; - child_dir_entry = (struct ext2_dir_entry_2 *)getBlock(childInode->i_block[i]); total_rec_len = 0; // for each dir entry in the block while (total_rec_len < EXT2_BLOCK_SIZE) { - if (cur_dir_entry->name_len == 0 && - strcmp(cur_dir_entry->name, ".")!=0 && - strcmp(cur_dir_entry->name, "..")!=0) - rm(childInode, cur_dir_entry->name); - - total_rec_len = total_rec_len + cur_dir_entry->rec_len; - cur_dir_entry = (void *) cur_dir_entry + cur_dir_entry->rec_len; + if (child_dir_entry->name_len != 0 && + strcmp(child_dir_entry->name, ".")!=0 && + strcmp(child_dir_entry->name, "..")!=0) { +printf("\nrun recursion in dir: %s with filename: %s\n\n", cur_dir_entry->name, child_dir_entry->name); + rm(childInode, child_dir_entry->name); + } + total_rec_len = total_rec_len + child_dir_entry->rec_len; + child_dir_entry = (void *) child_dir_entry + child_dir_entry->rec_len; } } - printf("2\n"); + // if child link count == 0 remove inode - if (childInode->i_links_count == 0) { + if (childInode->i_links_count == 1) { +printf("inode num: %d, filename: %s, type: d , link_count: %d, is deleted\n", cur_dir_entry->inode, cur_dir_entry->name, childInode->i_links_count); deleteInode(cur_dir_entry->inode); getGroupDesc()->bg_used_dirs_count--; } } + pre_dir_entry->rec_len += cur_dir_entry->rec_len; } \ No newline at end of file From db02f2d411619f0a1c0b43f179a7ef996dfe788a Mon Sep 17 00:00:00 2001 From: GuikangZhong <48389832+GuikangZhong@users.noreply.github.com> Date: Sat, 4 Apr 2020 14:51:34 -0400 Subject: [PATCH 39/41] Delete a.out --- a.out | Bin 12848 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 a.out diff --git a/a.out b/a.out deleted file mode 100755 index f376a8591b6bbcfac08f07368dec38e4de3fc61f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12848 zcmeHNZEPGz8J@G9*uJD$CoLfjp<1;yb)ju+pu$OGV!OU}ot_=%!?cuE%YE5C^}ci; z*bZ2-bvc^ta*``RYNaCi7a-9e232;7ROd`l910@WaH0VrWGtHcNH!+rBGG>h3iLRil>Oj}y zuBTl`4->btIV#B;Qsn0%6jk-O>#5_FD%_p|Tbn^66=rr4t7TZL~3R5cYD4MzNGFftV7bY(qWlY~F2 zIW?lIeF%woQe9s{SJj@b<6Y{bhx?C->Y{!Xbv5g2jM#6CI_VHgRfnUNvfk96>4uER z-fV=wSp(uxUhQx$@*04Dp9yKu@_C`Z$EE&J4zgEKylPmM0ZP;MS zFsiEGlk}7s)%mr`B0tlHXfv0xRe7eWzGyfcjhLKjf9@GOMqHud~Yb|-RmC@`9V|r6guTG z`s?L)|M}-fZlBtAZRhNcOF#TPcrrR)qvT`^o#q0|9W|fDyb0ZGSnDMDq4USuC~iAC z$pmx`9B+K`yuvYVbJeVr+rXs;-mYZ>8}^;YN~hCafdCp~>) zSs$$f^D!_r*DK)9bNi0n-2R|4wM2j;xr@+xfNQ-3trvy$Mg2=)-^1D81N(%@=1%Y8 z{AuvLC4K|+@8taNfPcu~OY@^!A=tqMryyu63${V9g$qtXu&XR+f}oBICLvhIMgpUj z7@2PYBk=wvc>UOJihfYh`!4Ejiuim(`ih3+aqXIVc|xA=bT zzPyx<354H3OnCbNye+x%LO%)p^hCZv%F=!YxaSmKUqM>9qe1V>|L%Hv#ernL4MXks zF!jPz%fxt$d^+dQT>0Vxs3JK-Sk5XGzX=x1j*55>@_0smA#N-3+is-yJVnlS+$Gf4 zQ0P*6BTyIV(H9H$!=X=7miPe%Sl^0MyP&* z4uFL;egZQXjnaP0cKi{$)5QEpLn$7Co;&M0Ln;#-l&`}YW}Q5HW3kWhkbJR^IHdH? z@G@Wt&vTa>m!J<86fH9V8!i9x0v!)m))e14MSp{M(p;T{_p6{~+@N~2+{;(iw72!| z6UFP4zRskRIMP^pqOe8E8Z(EKX`!&XD@TP@7XMNYw9;cOOv)f{R+KhMrTM0*71jw) zt9jG+mT$Y+RGz)}WjVekw}i&Rrc^%7G3Q17i% z^b|M~;JgRUT8}jU*zRhc-oFQ>_!wu7b{1uL9fy<7w`ah z#tTR_uZIjZ|Lz@x2!5)zt*Ch`Y^rNcymHMS09CFzQUAT>6aS;CqV~^h)Y4-u$SM5` zdhO}gB9w?}vT8P{-6phPb!Oi~rjqqFoYc&*z@HydHA}FU0+0Vi5Xim`C z%)dML&;-poqSpL-^NSd%{}lhWq(*bRkoe|x;2RR}q-dpy$*@No0UH4u0UH4u0UH4u z0UH4u0UH4u0UH4u0ULo^6M?@P{~!GiW4vmNHTaJ*`UAmMW87(swsamty(lc-4#h z;<(H{O?nB^42%VnAQKIk55;ghJvl^V6G(m=1oK^(M`M8q@ny_$8$KQ-ABh&COdI@> zLB;+4S~WZZuK`~w8Nl6n4~4rg>rQ!#8~MARdjb1tyIwi zRW#j4vihT&bV!Ba(k8#xi&Pn1@}Mh6bocpYav3+YH)4kSFF;G>$XV(s3RWtWD3U0T WSs1e<8>)^A>$DM2v2S>i0rnrq)_WiT From d1793982858c2da0dd197b0ef3fe67aea4f99a7b Mon Sep 17 00:00:00 2001 From: Lin Wang Date: Sun, 5 Apr 2020 14:40:23 -0400 Subject: [PATCH 40/41] update --- Makefile | 5 +--- ext2_cp.c | 11 +------- ext2_ln.c | 3 +-- ext2_mkdir.c | 2 +- ext2_rm.c | 6 ++++- ext2_rm_bonus.c | 6 ++++- test.c | 68 ------------------------------------------------- utilities.c | 42 +++++------------------------- utilities.h | 2 -- 9 files changed, 20 insertions(+), 125 deletions(-) delete mode 100644 test.c diff --git a/Makefile b/Makefile index 27c3727..e8f6baf 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PROGS = ext2_cp ext2_ln ext2_ls ext2_mkdir ext2_rm ext2_rm_bonus readimage test +PROGS = ext2_cp ext2_ln ext2_ls ext2_mkdir ext2_rm ext2_rm_bonus readimage all : $(PROGS) readimage : readimage.o utilities.o @@ -22,9 +22,6 @@ ext2_rm : ext2_rm.o utilities.o ext2_rm_bonus : ext2_rm_bonus.o utilities.o gcc -Wall -g -o ext2_rm_bonus $^ -test : test.o utilities.o - gcc -Wall -g -o test $^ - %.o : %.c ext2.h utilities.h gcc -Wall -g -c $^ diff --git a/ext2_cp.c b/ext2_cp.c index 11bf772..14e9df1 100644 --- a/ext2_cp.c +++ b/ext2_cp.c @@ -75,13 +75,11 @@ int main(int argc, char **argv) { int i = 0; while (!feof(src_fd)) { nextBlockNum = allocateNewBlock(); -printf("Block %d is allocated for: %s\n", nextBlockNum, fileName); if (i<12) { childInode->i_block[i] = nextBlockNum; } else if (i==12) { childInode->i_block[i] = nextBlockNum; singleIndirect = initSingleIndirect(nextBlockNum); -printf("\nabove block is for singleindirect.\n"); i++; continue; } else { @@ -89,23 +87,16 @@ printf("\nabove block is for singleindirect.\n"); } byteRead = fread(getBlock(nextBlockNum), 1, 1024, src_fd); -//printf("%s\n", getBlock(nextBlockNum)); -//printf("total %d bytes in this block\n", byteRead); fileSize += byteRead; i++; } fclose(src_fd); - // uptate inode filed -//printf("file size: %d\n", fileSize); + // update inode fields childInode->i_size = fileSize; if (singleIndirect == NULL) childInode->i_blocks = ((fileSize+1023)/1024)*2; else childInode->i_blocks = ((fileSize+1023)/1024+1)*2; -//printf("\n--childInode: --\n"); -//printInode(childInode); // add dir_entry fot this file into parent dir initNewDirent(parentInode, childInodeNum, EXT2_FT_REG_FILE, fileName); -//printf("\n--parentInode: --\n"); -//printInode(parentInode); } \ No newline at end of file diff --git a/ext2_ln.c b/ext2_ln.c index ce68045..9f44734 100644 --- a/ext2_ln.c +++ b/ext2_ln.c @@ -25,7 +25,6 @@ int main(int argc, char **argv) { int flagged = FALSE; int inodeNum, parentInodeNum, childInodeNum; - struct ext2_inode *targetInode, *parentInode, *childInode; if(argc!=4 && argc!=5) { @@ -125,7 +124,7 @@ int main(int argc, char **argv) { initNewDirent(parentInode, childInodeNum, EXT2_FT_SYMLINK, linkName); if (childInode->i_size <= 60){ - strcpy((char *)childInode->i_block, pathTo); + strncpy((char *)childInode->i_block, pathTo, 60); }else{ // append path to the inode block int block_num = allocateNewBlock(); diff --git a/ext2_mkdir.c b/ext2_mkdir.c index 30becde..543237e 100644 --- a/ext2_mkdir.c +++ b/ext2_mkdir.c @@ -34,7 +34,7 @@ int main(int argc, char **argv) { strcpy(path, argv[2]); strcpy(pathCopy, argv[2]); // if input is root, return EEXIST - if (strlen(pathCopy) == 1) { + if (strcmp(pathCopy, "/") == 0) { fprintf(stderr, "Specified directory already exists\n"); return EEXIST; } diff --git a/ext2_rm.c b/ext2_rm.c index e5803ae..a916024 100644 --- a/ext2_rm.c +++ b/ext2_rm.c @@ -37,7 +37,7 @@ int main(int argc, char **argv) { strcpy(parentDirPath, argv[2]); // if it's not a absolute path if (parentDirPath[0]!='/') { - fprintf(stderr, "No such file or directory\n"); + fprintf(stderr, "Must be an absolute path\n"); return ENOENT; // if it's a root directory } else if (parentDirPath[1]=='\0'){ @@ -56,6 +56,10 @@ int main(int argc, char **argv) { // check file exist getFileNameFromPath(fileName, argv[2]); + if (strcmp(fileName, ".") == 0 || strcmp(fileName, "..") == 0){ + fprintf(stderr, "Cannot remove . or ..\n"); + return ENOENT; + } childInodeNum = searchFileInDir(parentInode, fileName); if (childInodeNum == 0) { fprintf(stderr, "No such file or directory\n"); diff --git a/ext2_rm_bonus.c b/ext2_rm_bonus.c index bce8e12..8c4954b 100644 --- a/ext2_rm_bonus.c +++ b/ext2_rm_bonus.c @@ -50,7 +50,7 @@ int main(int argc, char **argv) { // get the parent directory inode if (parentDirPath[0]!='/') { - fprintf(stderr, "No such file or directory\n"); + fprintf(stderr, "Must be an absolute path\n"); return ENOENT; } else if (parentDirPath[1]=='\0'){ fprintf(stderr, "Cannot remove root directory\n"); @@ -67,6 +67,10 @@ int main(int argc, char **argv) { // check file exist getFileNameFromPath(fileName, parentDirPathCopy); + if (strcmp(fileName, ".") == 0 || strcmp(fileName, "..") == 0){ + fprintf(stderr, "Cannot remove . or ..\n"); + return ENOENT; + } childInodeNum = searchFileInDir(parentInode, fileName); if (childInodeNum == 0) { fprintf(stderr, "No such file or directory\n"); diff --git a/test.c b/test.c deleted file mode 100644 index 4341df5..0000000 --- a/test.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "ext2.h" -#include "utilities.h" - -unsigned char *disk; -struct ext2_inode *inodeTable; - -int main(int argc, char **argv) { - struct ext2_inode *inode = NULL; - - int fd = open(argv[1], O_RDWR); - disk = mmap(NULL, 128 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if(disk == MAP_FAILED) { - perror("mmap"); - exit(1); - } - inodeTable = getInodeTable(); - - int inodeNum = getInodeFromPath(argv[2]); - // inodeNum = 1; - inode = &inodeTable[inodeNum-1]; - unsigned int * single; - printInode(inode); - // print file dirent for this inode - if(inode->i_mode & EXT2_S_IFDIR) { - int total_len = 0; - struct ext2_dir_entry_2 *dir_entry = NULL; - for (int i=0; i<12; i++) { - if (inode->i_block[i] != 0) { - total_len = 0; - dir_entry = (struct ext2_dir_entry_2 *)getBlock(inode->i_block[i]); - printf("inode->i_block[%d]: %d\n", i, inode->i_block[i]); - while (total_leninode, dir_entry->rec_len, dir_entry->name_len, dir_entry->file_type, dir_entry->name); - total_len+=dir_entry->rec_len; - dir_entry = (void*)dir_entry + dir_entry->rec_len; - } - } - } - // print content for this inode - } else { - for (int i=0; i<12; i++) { - if (inode->i_block[i] != 0) { - printf("inode->i_block[%d]: %d\n", i, inode->i_block[i]); - printf("%s\n", getBlock(inode->i_block[i])); - } - } - if (inode->i_block[12] != 0) { - single = (unsigned int *)getBlock(inode->i_block[12]); - for (int j=0; ji_block[i] != 0) { -printf("\n--inodeNum: %d, type: f/d, block_number: %d--\n\n", inodeNum, target->i_block[i]); changeBitmap(block_bitmap, target->i_block[i]-1, 'd'); getGroupDesc()->bg_free_blocks_count++; } @@ -141,41 +139,16 @@ printf("\n--inodeNum: %d, type: f/d, block_number: %d--\n\n", inodeNum, target-> unsigned int *single = (unsigned int*)getBlock(bp); for (int i=0; ibg_free_blocks_count++; } - } -printf("\n--inodeNum: %d, type: f/d, block_number: %d--\n\n", inodeNum, target->i_block[12]); + } // delte single itself changeBitmap(block_bitmap, target->i_block[12]-1, 'd'); getGroupDesc()->bg_free_blocks_count++; } } -void printInode(struct ext2_inode *inode) -{ - printf("i_ctime: %d\n", inode->i_ctime); - printf("i_dtime: %d\n", inode->i_dtime); - printf("i_mode: %d\n", inode->i_mode); - printf("i_size: %d\n", inode->i_size); - printf("i_links_count: %d\n", inode->i_links_count); - printf("i_blocks: %d\n", inode->i_blocks); - printf("i_block:\n\t"); - for(int i=0; i<15; i++) { - printf("[%d]: %d ", i, inode->i_block[i]); - } - if(inode->i_block[12] != 0) { - printf("\nfirst 15 single indirect:\n\t"); - unsigned int *singleIndirect = (unsigned int *)getBlock(inode->i_block[12]); - for(int i=0; i<15; i++) { - printf("[%d]: %d ", i, singleIndirect[i]); - } - } - printf("\n\n"); -} - - // block char unsigned *getBlock(int blockNum) { // block index start at 1, so block Number == block Index @@ -200,12 +173,13 @@ int searchFileInDir(struct ext2_inode *parentInode, char *childFileName) { */ struct ext2_dir_entry_2 *cur_dir_entry = NULL; struct ext2_dir_entry_2 *pre_dir_entry = getPreDirent(parentInode, childFileName); - if (pre_dir_entry != NULL) { - cur_dir_entry = (void *)pre_dir_entry + pre_dir_entry->rec_len; - return cur_dir_entry->inode; - } else if (strcmp(childFileName, ".") == 0) { + if (strcmp(childFileName, ".") == 0) { return ((struct ext2_dir_entry_2 *)getBlock(parentInode->i_block[0]))->inode; } + else if (pre_dir_entry != NULL) { + cur_dir_entry = (void *)pre_dir_entry + pre_dir_entry->rec_len; + return cur_dir_entry->inode; + } return 0; } @@ -420,14 +394,12 @@ void rm(struct ext2_inode *parentInode, char *childFileName) { } changeBitmap(getBitmap(INODE_BITMAP), cur_dir_entry->inode-1, 'd'); getGroupDesc()->bg_free_inodes_count++; -printf("inode num: %d, filename: %s, type: l, is deleted\n", cur_dir_entry->inode, cur_dir_entry->name); } // base case2, if childInode is a file else if (cur_dir_entry->file_type == EXT2_FT_REG_FILE) { // if link count == 0 remove inode if (childInode->i_links_count == 1) { -printf("inode num: %d, filename: %s, type: f , link_count: %d, is deleted\n", cur_dir_entry->inode, cur_dir_entry->name, childInode->i_links_count); deleteInode(cur_dir_entry->inode); } else { childInode->i_links_count--; @@ -451,7 +423,6 @@ printf("inode num: %d, filename: %s, type: f , link_count: %d, is deleted\n", cu if (child_dir_entry->name_len != 0 && strcmp(child_dir_entry->name, ".")!=0 && strcmp(child_dir_entry->name, "..")!=0) { -printf("\nrun recursion in dir: %s with filename: %s\n\n", cur_dir_entry->name, child_dir_entry->name); rm(childInode, child_dir_entry->name); } total_rec_len = total_rec_len + child_dir_entry->rec_len; @@ -461,7 +432,6 @@ printf("\nrun recursion in dir: %s with filename: %s\n\n", cur_dir_entry->name, // if child link count == 0 remove inode if (childInode->i_links_count == 1) { -printf("inode num: %d, filename: %s, type: d , link_count: %d, is deleted\n", cur_dir_entry->inode, cur_dir_entry->name, childInode->i_links_count); deleteInode(cur_dir_entry->inode); getGroupDesc()->bg_used_dirs_count--; } diff --git a/utilities.h b/utilities.h index 7878cd7..e9384cf 100644 --- a/utilities.h +++ b/utilities.h @@ -40,8 +40,6 @@ int initInode(unsigned short mode); void deleteInode(int inodeNum); -void printInode(struct ext2_inode *inode); - // block char unsigned *getBlock(int blockNum); From 1f38d6853dca2b6c76ac2ae1359eb4448e3528f0 Mon Sep 17 00:00:00 2001 From: Javie Wang Date: Sun, 5 Apr 2020 15:03:13 -0400 Subject: [PATCH 41/41] final commit --- ext2_mkdir.c | 2 +- test.sh | 180 --------------------------------------------------- 2 files changed, 1 insertion(+), 181 deletions(-) delete mode 100755 test.sh diff --git a/ext2_mkdir.c b/ext2_mkdir.c index 543237e..adce85b 100644 --- a/ext2_mkdir.c +++ b/ext2_mkdir.c @@ -44,7 +44,7 @@ int main(int argc, char **argv) { // if any component on the path of parent directory does not exist, // return ENOENT if (parent_inode_num == 0) { - fprintf(stderr, "One of the compoenets on the path does not exist\n"); + fprintf(stderr, "One of the components on the path does not exist\n"); return ENOENT; } diff --git a/test.sh b/test.sh deleted file mode 100755 index 49fe36c..0000000 --- a/test.sh +++ /dev/null @@ -1,180 +0,0 @@ -# #./readimage twolevel.img - -# # ls test case: (dir, file, link) * (n/a, -a) + (invalid path, not exist) -# # check: correctness of output -# echo "-----test root: <<<./ext2_ls twolevel.img />>>-----" -# ./ext2_ls twolevel.img / - -# echo "-----test root with flag: <<<./ext2_ls twolevel.img -a />>>-----" -# ./ext2_ls twolevel.img -a / - -# echo "-----test root with flag: <<<./ext2_ls twolevel.img -a /lost+found>>>-----" -# ./ext2_ls twolevel.img -a /lost+found - -# echo "-----test afile: <<<./ext2_ls twolevel.img /afile>>>-----" -# ./ext2_ls twolevel.img /afile - -# echo "-----test afile, <<>>-----" -# ./ext2_ls twolevel.img -a /afile - -# echo "-----test afile, this should fail: <<<./ext2_ls twolevel.img -a /afile/>>>-----" -# ./ext2_ls twolevel.img -a /afile/ - -# echo "-----test level1: <<<./ext2_ls twolevel.img /level1>>>-----" -# ./ext2_ls twolevel.img /level1 - -# echo "-----test level 1 end with '/': <<<./ext2_ls twolevel.img -a /level1/>>>-----" -# ./ext2_ls twolevel.img -a /level1/ - -# echo "-----test level2: <<<./ext2_ls twolevel.img -a /level1/level2>>>-----" -# ./ext2_ls twolevel.img -a /level1/level2 - -# echo "-----test bfile: <<<./ext2_ls twolevel.img -a /level1/level2/bfile>>>-----" -# ./ext2_ls twolevel.img -a /level1/level2/bfile - -# echo "-----test bfile, this should fail: <<<./ext2_ls twolevel.img -a /level1/level2/bfile/>>>-----" -# ./ext2_ls twolevel.img -a /level1/level2/bfile/ - -# echo "-----test non-exist path, this should fail: <<<./ext2_ls twolevel.img -a /level1/level2/cfile>>>-----" -# ./ext2_ls twolevel.img -a /level1/level2/cfile - -# echo "-----test no input image file, this should fail: <<<./ext2_ls twolevel.img>>>-----" -# ./ext2_ls twolevel.img - -# # note: the bfilee.s file in the disk contain an 16 character! below testcase should actually fail -# echo "-----test print a file name, this should work but fail: <<<./ext2_ls onedirectory.img /level1/bfilee.s>>>-----" -# ./ext2_ls onedirectory.img /level1/bfilee.s - -# # cp -# ./readimage emptydisk.img -# echo "\n---------------------\n" -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/large.txt /large.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename0.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename1.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename2.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename3.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename4.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename5.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename6.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename7.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename8.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename9.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename10.txt -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename11.txt -# echo "\n---------------------\n" -# ./readimage emptydisk.img -# ./ext2_ls emptydisk.img -a / - -# rm -# ./readimage emptydisk.img -# echo "\n---------------------\n" -# ./ext2_rm emptydisk.img /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename7.txt -# echo "\n---------------------\n" -# ./readimage emptydisk.img -# ./ext2_ls emptydisk.img -a / - - -# mkdir + ls -# echo "\n----------mkdir--------\n" -# ./ext2_mkdir emptydisk.img /123 -# echo "\n----------ls-----------\n" -# ./ext2_ls emptydisk.img / -# echo "\n---------readimage----\n" -# ./readimage emptydisk.img -# echo "\n---------test---------\n" -# ./test emptydisk.img / -# echo "\n---------test---------\n" -# ./test emptydisk.img /123 -# echo "\n---------test---------\n" -# ./test emptydisk.img /lost+found - -#mkdir -# echo "-----test mkdir at root, this should fail: <<<./ext2_mkdir emptydisk.img />>>-----" -# ./ext2_mkdir emptydisk.img / -# echo "-----test mkdir lost+found, this should fail: <<<./ext2_mkdir emptydisk.img /lost+found>>>-----" -# ./ext2_mkdir emptydisk.img /lost+found -# echo "-----test mkdir hello at root, this should work: <<<./ext2_mkdir emptydisk.img /hello>>>-----" -# ./ext2_mkdir emptydisk.img /hello -# ./ext2_ls emptydisk.img / -# echo "-----test mkdir hello at root again, this should fail: <<<./ext2_mkdir emptydisk.img /hello/>>>-----" -# ./ext2_mkdir emptydisk.img /hello/ -# ./ext2_ls emptydisk.img / -# echo "-----test mkdir world at non-existing dir, this should fail: <<<./ext2_mkdir emptydisk.img /hi/world>>>-----" -# ./ext2_mkdir emptydisk.img /hi/world -# echo "-----test mkdir world at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/world>>>-----" -# ./ext2_mkdir emptydisk.img /hello/world -# ./ext2_ls emptydisk.img /hello -# echo "-----test mkdir good at hello dir, this should work: <<<./ext2_mkdir emptydisk.img /hello/good>>>-----" -# ./ext2_mkdir emptydisk.img /hello/good -# ./ext2_ls emptydisk.img /hello -# echo "-----test mkdir world at file afile, this should fail: <<<./ext2_mkdir twolevel.img /afile/world>>>-----" -# ./ext2_mkdir twolevel.img /afile/world -# echo "-----test mkdir . and .. at hello dir, this should fail: <<<./ext2_mkdir emptydisk.img /hello/.(..)>>>-----" -# ./ext2_mkdir emptydisk.img /hello/. -# ./ext2_mkdir emptydisk.img /hello/.. -# echo "-----test mkdir with no input img file, this should fail: <<<./ext2_mkdir /hello/>>>-----" -# ./ext2_mkdir /hello/ -# echo "-----test mkdir with no wrong img file, this should fail: <<<./ext2_mkdir haha.img /hello/>>>-----" -# ./ext2_mkdir haha.img /hello/ - -# rm (file, link, dir)*(target link count 1, 2, more) - -# cp /Users/javiewang/Desktop/emptydisk.img /Users/javiewang/Desktop/CSCC69A3/emptydisk.img -# ./ext2_mkdir emptydisk.img /1 -# ./ext2_mkdir emptydisk.img /1/2 -# ./ext2_mkdir emptydisk.img /1/3 -# ./ext2_mkdir emptydisk.img /1/3/4 -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /1/f1 -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /1/2/f2 -# ./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /1/3/f3 -# ./ext2_ln emptydisk.img -s /1/f1 /1/2/sl1 -# ./ext2_ln emptydisk.img /1/2/f2 /1/hl2 -# echo "\n ---------- \n" -# ./ext2_ls emptydisk.img / -# echo "\n ---------- \n" -# ./readimage emptydisk.img -# echo "\n ---------- \n" -# ./ext2_rm_bonus emptydisk.img -r /1 -# echo "\n ---------- \n" -# ./readimage emptydisk.img -# rm_bonus - -cp /Users/javiewang/Desktop/emptydisk.img /Users/javiewang/Desktop/CSCC69A3/emptydisk.img -./ext2_mkdir emptydisk.img /dir1 -./ext2_mkdir emptydisk.img /dir1/dir2 -./ext2_mkdir emptydisk.img /dir1/dir2/dir3 -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /file1 -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/file2 -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/file3 -./ext2_ln emptydisk.img -s /dir1/file2 /slink1 -./ext2_ln emptydisk.img /dir1/file2 /hlink1 -./ext2_ln emptydisk.img -s /dir1/dir2/file3 /dir1/slink2 -./ext2_ln emptydisk.img /dir1/dir2/file3 /dir1/hlink2 -./ext2_ln emptydisk.img -s /file1 /dir1/dir2/slink3 -./ext2_ln emptydisk.img -s /file1 /largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelink -./ext2_ln emptydisk.img /file1 /dir1/dir2/hlink3 -./ext2_cp emptydisk.img /Users/javiewang/Desktop/large.txt /dir1/dir2/large.txt -echo "\n---------------------\n" -./readimage emptydisk.img -echo "\n---------------------\n" -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename0.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename1.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename2.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename3.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename4.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename5.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename6.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename7.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename8.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename9.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename10.txt -./ext2_cp emptydisk.img /Users/javiewang/Desktop/hello.txt /dir1/dir2/dir3/largenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargenamelargename11.txt -./ext2_ln emptydisk.img /dir1/dir2/large.txt /large -./ext2_ln emptydisk.img /dir1/dir2/large.txt /dir1/large -echo "\n---------------------\n" -./readimage emptydisk.img -echo "\n---------------------\n" -./ext2_rm_bonus emptydisk.img -r /dir1 -echo "\n---------------------\n" -./readimage emptydisk.img -echo "\n---------------------\n"