📄 namei_0.c
字号:
/////////////////////////////////////////////////////////////////////
#include "general.h"
#include "s_isdirreg.h"
#include "hd_info_struct.h"
#include "dir_entry.h"
#include "msdos_dir_entry.h"
#include "d_inode.h"
#include "m_inode.h"
#include "buffer_head.h"
#include "fat_cache.h"
#include "file.h"
#include "hd_request_struct.h"
#include "super_block.h"
#include "common_head.h"
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////int sys_mkdir(const char * pathname){ struct m_inode * dir, * inode; struct buffer_head * bh , * dir_block; struct dir_entry * de; const char * basename;
int namelen;
if (!(dir = dir_namei(pathname,&namelen,&basename))) return -1; if (!namelen) { iput(dir); return -1; } bh = find_entry(dir,basename,namelen,&de); if (bh) { brelse(bh); iput(dir); return -1; } inode = new_inode(dir->i_dev); if (!inode) { iput(dir); return -1; }
if (!(inode->i_zone[0] = new_block(inode->i_dev))) { inode->i_nlinks--; iput(inode);
iput(dir); return -1; } if (!(dir_block = bread(inode->i_dev,inode->i_zone[0],0))) { free_block(inode->i_dev,inode->i_zone[0]); inode->i_nlinks--; iput(inode);
iput(dir); return -1; }
de = (struct dir_entry *) dir_block->b_data; de->inode = inode->i_num; strcpy(de->name,"."); de++; de->inode = dir->i_num; strcpy(de->name,".."); dir_block->b_dirt = 1; brelse(dir_block);
bh = add_entry(dir,basename,namelen,&de);
if (!bh) {
free_block(inode->i_dev,inode->i_zone[0]);
inode->i_nlinks--;
iput(inode);
iput(dir);
return -1;
}
de->inode = inode->i_num;
bh->b_dirt = 1;
brelse(bh);
inode->i_mode = I_DIRECTORY;
inode->i_nlinks = 2;
inode->i_mtime = file_datetime;
inode->i_size = 32; inode->i_dirt = 1;
iput(inode);
dir->i_nlinks++;
dir->i_mtime = file_datetime; dir->i_dirt = 1;
iput(dir);
return 0;}int empty_dir(struct m_inode * inode){ struct buffer_head * bh; struct dir_entry * de; int len,nr,block,new_block_flag;
len = inode->i_size / sizeof(struct dir_entry); if ((len < 2) || (!inode->i_zone[0]) || !(bh = bread(inode->i_dev,inode->i_zone[0],0))) return 0;
de = (struct dir_entry *) bh->b_data; if ((de[0].inode != inode->i_num) || (!de[1].inode) || strcmp(".",de[0].name) || strcmp("..",de[1].name)) {
brelse(bh); return 0; }
de += 2;
new_block_flag = 0; nr = 2; while (nr < len) { if (new_block_flag || ((void *)de >= (void *)(bh->b_data) + BLOCK_SIZE)) { brelse(bh);
bh = NULL; block = bmap(inode , nr / DIR_ENTRIES_PER_BLOCK); if (!block) { nr += DIR_ENTRIES_PER_BLOCK;
new_block_flag = 1; continue; } if (!(bh = bread(inode->i_dev,block,0))) return 0; de = (struct dir_entry *) bh->b_data;
new_block_flag = 0; } if (de->inode) { brelse(bh); return 0; } de++; nr++; } brelse(bh); return 1;}int sys_rmdir(const char * name){ struct m_inode * dir, * inode; struct buffer_head * bh; struct dir_entry * de;
const char * basename;
int namelen;
if (!(dir = dir_namei(name,&namelen,&basename))) return -1; if (!namelen) { iput(dir); return -1; } bh = find_entry(dir,basename,namelen,&de); if (!bh) { iput(dir); return -1; }
if (!(inode = iget(dir->i_dev, de->inode))) {
brelse(bh); iput(dir); return -1; }
if ((inode == dir) || (inode == current_pwd) || (!S_ISDIR(inode->i_mode)) || (!empty_dir(inode))){ iput(inode);
brelse(bh); iput(dir); return -1; } inode->i_nlinks = 0;
inode->i_mtime = file_datetime; inode->i_dirt = 1;
iput(inode);
de->inode = 0;
bh->b_dirt = 1;
brelse(bh);
dir->i_nlinks--; dir->i_mtime = file_datetime; dir->i_dirt = 1;
iput(dir); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -