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

📄 dir.c

📁 操作系统实验,文件系统,c语言实现的
💻 C
字号:
#include<stdio.h>
#include<string.h>
#include "filesys.h"
_dir()    /*  -dir  */
{
	unsigned short di_mode;
	int i,j,k,one;
	struct inode *temp_inode;
	printf("\nCURRENT DIRECTORY:dir.size=%d\n",dir.size);
	for(i=0;i<dir.size;i++)
	{
		if(dir.direct[i].d_ino!=DIEMPTY)
		{
			printf("%14s ",dir.direct[i].d_name);
			printf("d_ino=%d",dir.direct[i].d_ino);
			temp_inode=iget(dir.direct[i].d_ino);
			di_mode=temp_inode->di_mode;
			
			if(temp_inode->di_mode & DIFILE) 
				printf("f"); 
			else 
				printf("d");
			for(j=0;j<9;j++)
			{
				one=di_mode%2;
				di_mode=di_mode/2;
				if(one) printf("x");
				else printf("-");
			}
			/*printf("i=%d,d_name=%s,",i,dir.direct[i].d_name);
			printf("di_mode=%0x\n",temp_inode->di_mode);*/
			if(temp_inode->di_mode & DIFILE)  
			{
				printf("%ld",temp_inode->di_size);
				printf(" block chain:");
				for(k=0;k<temp_inode->di_size/BLOCKSIZ+1;k++)
					printf("%d ",temp_inode->di_addr[k]);
				printf("\n");
			}
			else
				printf("<dir>block chain:%d\n",dir.direct[i].d_ino);
			iput(temp_inode);
		}
	}
	printf("dir---->out\n");
}

mkdir(char *dirname)    /* mkdir */
{
	int dirid,dirpos;
	struct inode *inode;
	struct direct buf[BLOCKSIZ/(DIRSIZ+2)];
	unsigned int block;
	dirid=namei(dirname);
	printf("dirid=%d\n",dirid);
	if(dirid != NULL)
	{
		inode=iget(dirid);
		if(inode->di_mode & DIDIR)
			printf("\n%s directory already existed!!!\n",dirname);
		else
			printf("\n%s is a file name,&can't creat a dir the same name\n",dirname);
		iput(inode);
		return;
	}
	dirpos=iname(dirname);
	inode=ialloc();
	/*dirid=filsys.s_inode[filsys.s_pinode-1];*/
	dirid=inode->i_ino;
	/*printf("\ndirid=%d",dirid);
	printf("dirpos=%d\n",dirpos);
	printf("dir.size=%d\n",dir.size);*/
	dir.direct[dirpos].d_ino=inode->i_ino;
	dir.size++;
	/*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;
	/*strcpy(buf[2].d_name,dirname);
	buf[2].d_ino=dirid;*/
	buf[2].d_ino=0;
	block=balloc();
	/*printf("block=%d\n",block);*/
	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|DIDIR;
	inode->di_uid=user[user_id].u_uid;
	inode->di_gid=user[user_id].u_gid;
	inode->di_addr[0]=block;
	iput(inode);
	printf("mkdir---->out\n");
	return ;
}
chdir(char *dirname)    /* chdir */
{
	unsigned int dirid;
	struct inode *inode;
	unsigned short block;
	int i,j,low=0,high=0;
	dirid=namei(dirname);
	/*printf("\ndirname=%skkkkk,dirid=%d\n",dirname,dirid); */
	if(dirid==NULL)
	{
		printf("\n%s does not existed\n",dirname);
		return;
	}
	inode=iget(dirid);
	if(!access(user_id,inode,user[user_id].u_default_mode))
	{
		printf("\nhas not access to the directory %s\n",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[j],&dir.direct[i],DIRSIZ+2);
			dir.direct[j].d_ino=0;
	}
	/*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();
		/*printf("i=%d,block=%d\n",i,block);*/
		cur_path_inode->di_addr[i]=block;
		fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
		fwrite(&dir.direct[0],1,BLOCKSIZ,fd);
	}
	cur_path_inode->di_size=dir.size*(DIRSIZ+2);
	iput(cur_path_inode);
	cur_path_inode=inode;
	dir.size=inode->di_size/(DIRSIZ+2);
	/*printf("\ndir.size=%d\n",dir.size);*/
	/*printf("\ninode->di_addr[0]=%d\n",inode->di_addr[0]);*/
	/*read the change dir from disk */
	j=0;
	for(i=0;i<inode->di_size/BLOCKSIZ+1; i++)
	{
		/*printf("\ni=%d,inode->di_addr[i]=%d\n",i,inode->di_addr[i]);*/
		fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ,SEEK_SET);
        fread(&dir.direct[0],1,BLOCKSIZ,fd);
		j+=BLOCKSIZ/(DIRSIZ+2);
	};
	printf("chdir---->out\n");
	return;
}

⌨️ 快捷键说明

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