⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 namei_0.c

📁 阿基米德操作系统的源代码
💻 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 + -