📄 formatit.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 + -