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;
}
예제 #2
0
int main(int argc, char **argv) {
	if(argc != 3) {
		fprintf(stderr, "Usage: ext2_rm <image file name> <path to file>\n");
		exit(1);
	}
	disk_initialization(argv[1]); /* initialize disk */
	unsigned int dir_inode = inode_from_path(extract_parent_path(argv[2])); /* get inode index from path */

	struct ext2_dir_entry_2 *de = dir_find(dir_inode, extract_filename(argv[2]));
	if (de == NULL) {
		fprintf(stderr, "No such file or directory\n");
		exit(ENOENT);
	}
	unsigned int inode_index = de->inode;

	if (has_file_type(EXT2_INODE_FT_DIR, inode_index)) { 
		fprintf(stderr, "%s: is a directory\n", argv[2]);
		exit(EISDIR);
	}
	else {
		/* remove directory entry associated with file */
		delete_entry(dir_inode, extract_filename(argv[2]));
	}

        return 0;
}
예제 #3
0
파일: msfs.cpp 프로젝트: torandi/craftfs
static int msfs_getattr(const char *path, struct stat *stbuf) {
	printf("msfs_getattr(%s)\n", path);
	reset_error();
	inode_t inode = inode_from_path(path);
	if(msfs_error != 0) return msfs_error;
	*stbuf = inode.attributes;
	printf("msfs_getattr(%s), found.\n", path);
	return 0;
}
예제 #4
0
파일: msfs.cpp 프로젝트: torandi/craftfs
static int msfs_opendir(const char * path, fuse_file_info * fi)  {
	printf("msfs_opendir(%s)\n", path);
	reset_error();
	inode_t inode = inode_from_path(path);
	if(msfs_error != 0) return msfs_error;
	if(!is_directory(&inode)) return -ENOTDIR;
	if(!check_access(&inode, fi->flags)) return -EPERM;
	fi->fh = (uint64_t) inode.attributes.st_ino;
	printf("msfs_opendir(%s) found inode %lu\n", path, inode.attributes.st_ino);
	return 0;
}
예제 #5
0
파일: msfs.cpp 프로젝트: torandi/craftfs
static int msfs_open(const char *path, fuse_file_info *fi) {
	printf("msfs_open(%s)\n", path);
	reset_error();
	inode_t inode = inode_from_path(path);
	if(msfs_error != 0) return msfs_error;
	if(is_directory(&inode)) return -EISDIR;
	if(!check_access(&inode, fi->flags)) return -EPERM;
	printf("Lock owner: %lu\n", fi->lock_owner);
	fi->fh = (uint64_t) inode.attributes.st_ino;
	return msfs_error;

}