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

📄 dir.c

📁 基于UNIX6的文件系统模拟程序
💻 C
字号:
#include <stdio.h>#include <string.h>#include "filesys.h"_dir(){	unsigned int di_mode;	int i,one,j,k;	struct inode *temp_inode;	//printf("\nCURRENT DIRECTORY :\n");
	printf("\n");	for(i=0;i<dir.size;i++)	{		if(dir.direct[i].d_ino != DIEMPTY)		{			printf("%-14s",dir.direct[i].d_name);			temp_inode=iget(dir.direct[i].d_ino);			di_mode=temp_inode->di_mode;
			//printf("mode:%p",di_mode);			for(j=0;j<9;j++)			{				one = di_mode % 2;				di_mode = di_mode/2;				if(one) printf("x");				else printf("-");			}			if((temp_inode->di_mode&DIFILE) == DIFILE)			{				printf("%5d\t",temp_inode->di_size);				printf("block chain:");				for(k=0;k<(temp_inode->di_size-1)/BLOCKSIZ+1;k++)					printf("%4d",temp_inode->di_addr[k]);				printf("\n");			}			else				printf("<dir>\n");			iput(temp_inode);		}	}}mkdir(dirname)char *dirname;{	int dirid,dirpos;	struct inode *inode;	struct direct buf[BLOCKSIZ/(DIRSIZ+2)];	unsigned int block;	dirid=namei(dirname);	if(dirid != NULL)	{		inode = iget(dirid);		if(inode->di_mode&DIDIR)			printf("\n%s directory already existed!!\n");		else			printf("\n%s is a file name,&can't creat a dir with the same name",dirname);		iput(inode);		return;	}	dirpos=iname(dirname);	inode=ialloc();	dirid=inode->i_ino;	dir.direct[dirpos].d_ino=inode->i_ino;	dir.size++;

	//printf("\ncur dir name :%s",dir.direct[0].d_name);
	/* fill the new dir buf */	strcpy(buf[0].d_name,".");	buf[0].d_ino=dirid;	strcpy(buf[1].d_name,"..");	buf[1].d_ino=cur_path_inode->i_ino;	block=balloc();	fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);	fwrite(buf,1,BLOCKSIZ,fd);	inode->di_size=2*(DIRSIZ+2);	inode->di_number=1;	inode->di_mode=user[user_id].u_default_mode;	inode->di_uid=user[user_id].u_uid;	inode->di_gid=user[user_id].u_gid;	inode->di_addr[0]=block;	iput(inode);	return;}chdir(dirname)char *dirname;{	unsigned int dirid;	struct inode *inode;	unsigned short block;	int i,j,low=0,high=0;	dirid=namei(dirname);	if(dirid==NULL)	{		printf("\n%s does not existed\n",dirname);		return;	}	inode=iget(dirid);//dirid+1	if(!access(user_id,inode,EXICUTE))//user[user_id].u_default_mode	{		printf("\nhas not access to the directory %s",dirname);		iput(inode);		return;	}	/* pack the current directory */	/*for(i=0;i<dir.size;i++)	{		for(j=0;j<DIRNUM;j++)			if(dir.direct[j].d_ino==0) break;		memcpy(&dir.direct[i],&dir.direct[j],DIRSIZ+2);		dir.direct[j].d_ino=0;	}*/ //I del this 'for' part	/* write back the current directory */	for(i=0;i<cur_path_inode->di_size/BLOCKSIZ+1;i++)	{		bfree(cur_path_inode->di_addr[i]);	}	for(i=0;i<dir.size;i+=BLOCKSIZ/(DIRSIZ+2))	{		block=balloc();		cur_path_inode->di_addr[i]=block;		fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);		fwrite(&dir.direct[i],1,BLOCKSIZ,fd);	}	cur_path_inode->di_size=dir.size*(DIRSIZ+2);	iput(cur_path_inode);	cur_path_inode=inode;
	dir.size = cur_path_inode->di_size/(DIRSIZ +2);

//	printf("sfsf:%d",inode->i_ino);	/* read the change dir from disk */	j=0;	for(i=0;i<inode->di_size/BLOCKSIZ+1;i++)	{		fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ,SEEK_SET);		fread(&dir.direct[j],1,BLOCKSIZ,fd);		j+=BLOCKSIZ/(DIRSIZ+2);	}
	for(i=dir.size;i<DIRNUM;i++)
	{
		strcpy(dir.direct[i].d_name,"         ");
		dir.direct[i].d_ino = 0;
	}
	
//	printf("sfsfdir[3].ino:%d",dir.direct[2].d_ino);	return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -