int main(int argc, char const *argv[]) { char * path1, * path2; char name1[256], name2[256]; unsigned int s, p, d; struct ext2_dir_entry_2 new_entry; if(argc != 4) { fprintf(stderr, "Usage: ext2_cp <image file name> <source path> <dest path>\n"); exit(1); } if (ext2_init(argv[1]) == -1) return -1; path1 = malloc(strlen(argv[3])); split_filepath(argv[3], name1, path1); path2 = malloc(strlen(argv[2])); split_filepath(argv[2], name2, path2); s = find_inode(argv[2]); p = find_inode(path1); d = find_inode(argv[3]); if (s == 0 || !(inode_by_index(s)->i_mode & EXT2_S_IFREG)) return ENOENT; if (p == 0 && d == 0) return ENOENT; if (d == 0) { //create file with name 'name2' d = allocate_inode(); inode_deep_copy(d, s); new_entry.file_type = EXT2_FT_REG_FILE; new_entry.inode = d; new_entry.name_len = strlen(name1); push_dir_entry(inode_by_index(p), new_entry, name1); } else if (inode_by_index(d)->i_mode & EXT2_S_IFDIR) { //create file with same name as source p = d; d = allocate_inode(); inode_deep_copy(d, s); new_entry.file_type = EXT2_FT_REG_FILE; new_entry.inode = d; new_entry.name_len = strlen(name2); push_dir_entry(inode_by_index(p), new_entry, name2); } else { printf("error\n"); return ENOENT; } return 0; }
int main(int argc, char **argv) { if(argc != 3) { fprintf(stderr, "Usage: ext2_mkdir <image file name> <path to file>\n"); exit(1); } disk_initialization(argv[1]); /* initialize disk */ /* retrieve the inode index for parent directory */ unsigned int inode_dir = inode_from_path(extract_parent_path(argv[2])); /* get filename for new directory */ char *filename = extract_filename(argv[2]); if (dir_find(inode_dir, filename)) { // Case: filename already exists fprintf(stderr, "%s: already exists\n", argv[2]); exit(EEXIST); } /* allocate inode for new directory */ unsigned int new_inode = allocate_inode(); /* initialize the new directory inode and add as entry to parent directory */ init_dir_inode(new_inode, inode_dir, filename); return 0; }
unsigned int add_directory_entry(unsigned int parent, unsigned char * filename, unsigned int is_directory){ unsigned int new_inode = allocate_inode(); inodes[new_inode].is_directory = is_directory; inodes[new_inode].first_block = 0; inodes[new_inode].first_block_initialized = 0; inodes[new_inode].metadata_block = 0; inodes[new_inode].metadata_block_initialized = 0; return add_directory_entry_pointing_at_inode(parent, filename, new_inode); }
void initialize_root_directory(void){ /* This needs to be the first inode allocated */ unsigned int root_inode = allocate_inode(); assert(root_inode == 0); inodes[root_inode].first_block = 0; inodes[root_inode].first_block_initialized = 0; inodes[root_inode].metadata_block = 0; inodes[root_inode].is_directory = 1; add_directory_entry_pointing_at_inode(0, (unsigned char *)".", 0); add_directory_entry_pointing_at_inode(0, (unsigned char *)"..", 0); }
int main(int argc, char **argv) { char * path; char dirname[256]; unsigned int u, p, i; struct ext2_inode new_inode; struct ext2_dir_entry_2 new_dir; struct ext2_inode * parent_inode; if(argc != 3) { fprintf(stderr, "Usage: ext2_mkdir <image file name> <file path>\n"); exit(1); } if (ext2_init(argv[1]) == -1) return -1; path = malloc(strlen(argv[2])); split_filepath(argv[2],dirname,path); if (strlen(dirname) == 0) return ENOENT; u = allocate_inode(); new_inode.i_mode |= EXT2_S_IFDIR; new_inode.i_links_count = 1; for (i = 0; i < 15; i++) new_inode.i_block[i] = 0; *(inode_by_index(u)) = new_inode; new_dir.inode = u; new_dir.name_len = strlen(dirname); new_dir.file_type = EXT2_FT_DIR; p = find_inode(path); parent_inode = inode_by_index(p); free(path); if (find_dir_entry(parent_inode, dirname)) return EEXIST; printf("does this happen?\n"); if (parent_inode) { push_dir_entry(parent_inode, new_dir, dirname); init_dir(u,p); return 0; } else { return ENOENT; } }