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; }
/*创建新的目录项*/ int make_file(int inode, char* name, int type) { char original_name_path[30]; int original_inode = inode_num;//记录当前的inode strcpy(original_name_path, name); if (eat_path(name) == -1) { if (type == File) printf("touch: cannot touch‘%s’: No such file or directory\n", original_name_path); if (type == Directory) printf("mkdir: cannot create directory ‘%s’: No such file or directory\n", original_name_path); return -1; } int new_node; int blk_need = 1;//本目录需要增加磁盘块则blk_need=2 int t; Inode temp; /*读取当前目录的Inode*/ fseek(Disk, InodeBeg + sizeof(Inode)*inode, SEEK_SET); fread(&temp, sizeof(Inode), 1, Disk); if (temp.access[1] == 0) { //当前目录不允许写 if (type == Directory) printf("mkdir: cannot create directory ‘%s’: Permission denied\n", original_name_path); if (type == File) printf("touch: cannot touch ‘%s’: Permission denied\n", original_name_path); close_dir(inode_num); inode_num = original_inode; open_dir(inode_num); return -1; } if (dir_num>MaxDirNum) {//超过了目录文件能包含的最大目录项 if (type == Directory) printf("mkdir: cannot create directory '%s' : Directory full\n", original_name_path); if (type == File) printf("touch: cannot create file '%s' : Directory full\n", original_name_path); close_dir(inode_num); inode_num = original_inode; open_dir(inode_num); return -1; } if (check_name(inode, name) != -1) {//防止重命名 if (type == Directory) printf("mkdir: cannnot create directory '%s' : Directory exist\n", original_name_path); if (type == File) printf("touch: cannot create file '%s' : File exist\n", original_name_path); close_dir(inode_num); inode_num = original_inode; open_dir(inode_num); return -1; } if (dir_num / DirPerBlk != (dir_num + 1) / DirPerBlk) {//本目录也要增加磁盘块 blk_need = 2; } // printf("blk_used:%d\n",super_blk.blk_used); if (super_blk.blk_used + blk_need>BlkNum) { if (type == Directory) printf("mkdir: cannot create directory '%s' :Block used up\n", original_name_path); if (type == File) printf("touch: cannot create file '%s' : Block used up\n", original_name_path); close_dir(inode_num); inode_num = original_inode; open_dir(inode_num); return -1; } if (blk_need == 2) {//本目录需要增加磁盘块 t = curr_inode.blk_num++; curr_inode.blk_identifier[t] = get_blk(); } /*申请inode*/ new_node = apply_inode(); if (new_node == -1) { if (type == Directory) printf("mkdir: cannot create directory '%s' :Inode used up\n", original_name_path); if (type == File) printf("touch: cannot create file '%s' : Inode used up\n", original_name_path); close_dir(inode_num); inode_num = original_inode; open_dir(inode_num); return -1; } if (type == Directory) { /*初始化新建目录的inode*/ init_dir_inode(new_node, inode); } else if (type == File) { /*初始化新建文件的inode*/ init_file_inode(new_node); } strcpy(dir_table[dir_num].name, name); dir_table[dir_num++].inode_num = new_node; close_dir(inode_num); inode_num = original_inode; open_dir(inode_num); return 0; }