Пример #1
0
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;
}
Пример #3
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);
}
Пример #4
0
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);
}
Пример #5
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;
	}
}