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

📄 formatit.c

📁 设计并实现一个多用户多级目录结构的文件系统
💻 C
字号:
/************************************************/
/*												*/
/*				format.c						*/
/*												*/
/************************************************/

#include <stdio.h>
#include "filsys.h"

int format()
{													struct filsys aaa;
	struct inode * inode;
	 struct user tempuser[USERNUM];
//	struct dinode dinode_buf[BLOCKSIZ / DINODESIZ];        -----------
	struct dinode dinode_buf;
	struct direct dir_buf[BLOCKSIZ / DIRECTSIZ];
	unsigned int block_buf[BLOCKSIZ / sizeof( int )];
	char * buf;
	int i, j, k;
		
	fd = fopen( "filesystem.dat", "w+b" );		/* 建立文件 */
	buf = (char * )malloc( 1024*1024 );			/* 申请1M空间 */
	if( buf == NULL )							/* 申请不成功,返回 */
	{
		printf( "\nThe system file can't be create!\n" );
		return 0;
	}
	/* 申请成功,把其空间写入filesystem.dat,使filesystem.dat为1M */
	fseek( fd, 0, SEEK_SET );
	fwrite( buf, 1, 1024*1024, fd );
	
	free ( buf );
//
//	/* 设置磁盘i节点区 */           ------------------------------------
//	for( i = 0; i < BLOCKSIZ / DINODESIZ; i++ )
//		dinode_buf[i].di_mode = DIEMPTY;		/* 设置磁盘i节点缓冲区,DIEMPTY表示空闲 */
//
//	/* 初始化磁盘i节点区,标志其为空闲磁盘i节点 */
//	fseek( fd, DINODESTART, SEEK_SET );
//	for( i = 0; i < DINODEBLK; i++ )
//	{
//		fseek( fd, DINODESTART + BLOCKSIZ * i, SEEK_SET );
//		fwrite( dinode_buf, 1, BLOCKSIZ, fd );
//	}
//
	dinode_buf.di_mode = DIEMPTY;				/* 设置磁盘i节点缓冲区,DIEMPTY表示空闲 */
	fseek( fd, DINODESTART, SEEK_SET );
	for( i = 0; i < DINODEBLK * BLOCKSIZ / DINODESIZ; i++ )
	{
		fseek( fd, DINODESTART + DINODESIZ * i, SEEK_SET );
		fwrite( &dinode_buf, 1, sizeof( dinode_buf ), fd );
	}


	/* 1. creat the main directory and its sub dir etc and the file password */

	inode = iget( 0 );					/* 第0块不用 */
	inode->i_mode = DIEMPTY;
	iput( inode );

	inode = iget( 1 );							/* 第1盘块放用户名表 */
	inode->i_number = 1;
	inode->i_mode = DIREG;
	inode->i_size = sizeof( struct user ) * USERNUM;
	inode->i_addr[0] = 1;

	/* 用户imacih是超级用户 */
	strcpy( tempuser[0].u_name, "imacih" );
	strcpy( tempuser[0].password, "dgh123456" );
	tempuser[0].u_default_mode = SUPERMODE;
	tempuser[0].u_gid = 1;
	tempuser[0].u_uid = 1;

	for( i = 1; i < USERNUM; i++ )
	{
		strcpy( tempuser[i].u_name, " " );
	}
	fseek( fd, DATASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET );
	fwrite( tempuser, 1, inode->i_size, fd );
	iput( inode );



//	inode = iget( 1 );							/* 第1盘块放用户名表 */
//	inode->i_number = 1;
//	inode->i_mode = DIREG;
//	inode->i_size = USERSIZ;
//	inode->i_addr[0] = 1;
//	strcpy( rootuser.u_name, "imacih" );
//	strcpy( rootuser.password, "dgh123456" );
//	rootuser.u_default_mode = DEFAULTMODE;
//	rootuser.u_gid = 1;
//	rootuser.u_uid = 1;
//	fseek( fd, DATASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET );
//	fwrite( &rootuser, 1, sizeof( struct user ), fd );
//	iput( inode );

	inode = iget( 2 );							/* 第2盘块用于存储根目录 */
	inode->i_number = 1;
	inode->i_mode = DEFAULTMODE | DIDIR;
	inode->i_size = 2 * DIRECTSIZ;
	inode->i_addr[0] = 2;
	strcpy( dir_buf[0].d_name, "/" );
	dir_buf[0].d_ino = 2;
	strcpy( dir_buf[1].d_name, "/" );
	dir_buf[1].d_ino = 2;
//	strcpy( dir_buf[2].d_name, "etc" );
//	dir_buf[2].d_ino = 3;
	fseek( fd, DATASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET );
	fwrite( dir_buf, 1, inode->i_size, fd );
	iput( inode );

//	inode = iget( 2 );							/* 2 etc dir id */
//	inode->i_number = 1;
//	inode->i_mode = DEFAULTMODE | DIDIR;
//	inode->i_size = 2 * DIRECTSIZ;
//	inode->i_addr[0] = 2;						/* 第3盘块用于根目录下的子目录 */
//	strcpy( dir_buf[0].d_name, ".." );
//	dir_buf[0].d_ino = 1;
//	strcpy( dir_buf[1].d_name, "." );
//	dir_buf[1].d_ino = 2;
//	fseek( fd, DATASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET );
//	fwrite( dir_buf, 1, 2 * DIRECTSIZ, fd );
//	iput( inode );

	/* 2. 初始化超级块 */

//	filsys.s_isize = DINODEBLK;					/* 磁盘i节点占用盘块数 */	
//	filsys.s_fsize = FILEBLK;					/* 文件区占用盘块数 */
	filsys.s_ninode = DINODEBLK * BLOCKSIZ / DINODESIZ - 3;	/* 空闲磁盘i节点数 */
	filsys.s_nfree = FILEBLK - 3;				/* 空闲文件块数 */

	/* 初始化空闲磁盘i节点堆栈 */
	for( i = 0; i < NICINOD; i++ )
	{
		filsys.s_inode[i] = 3 + i;				/* 从第3个磁盘i块,前面3个已用 */
	}
	filsys.s_pinode = 0;						/* 当前空闲块指针 */
	filsys.s_rinode = NICINOD + 3;				// 下一准备装入空闲盘块号栈的盘块号

	/* 把第1组空闲盘块放进空闲盘块堆栈 */
	for( i = 0; i < NICFREE; i++ )
	{
		filsys.s_free[i] = 3 + NICFREE - 1 - i;
	}
	filsys.s_pfree = NICFREE - 1;

	for( i = 3 + NICFREE * 2 - 1; i < FILEBLK; i += NICFREE )
	{
		for( j = 0; j < NICFREE; j++ )
		{	/* 往缓冲区写与成组链接法组织空闲盘块有关的信息:下一组盘块空闲块号与块数 */
			block_buf[j] = i - j;
		}
		block_buf[NICFREE] = NICFREE;			/* 该项记录本组的空闲盘块数 */

		/* 把缓冲区内容写到每组空闲盘块的最后一块中 */
		bwrite( i - NICFREE, block_buf );
	}

	/* 最后一组空闲盘块可能不足NICFREE块,故需单独处理 */
	i = i - NICFREE;
	for( j = 0; j < FILEBLK - i + 1; j++ )
		block_buf[j] = FILEBLK - j;
	block_buf[NICFREE] = FILEBLK - i + 1;		/* 最末组的空闲盘块数 */
	bwrite( i, block_buf );

	/* 把超级块写入 block 1# */
	fseek( fd, BLOCKSIZ, SEEK_SET );
	fwrite( &filsys, 1, sizeof( struct filsys ), fd );
												aaa=filsys;
//	fclose( fd );											
	return 1;
}

⌨️ 快捷键说明

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