📄 main.c
字号:
printf( "\n注册(R)还是登录(L)? (R/L) \n" );
while( 1 )
{
reg_or_log = getch();
// 注册新用户
if(( reg_or_log == 'r' ) || ( reg_or_log == 'R' ))
{ textcolor(7);
printf( "%c\n", reg_or_log );
reg();
goto AGAIN;
}
// 登陆已有用户
else if(( reg_or_log == 'l' ) || ( reg_or_log == 'L' ))
{
textcolor(8);
printf( "%c\n", reg_or_log );
if( login() == 0) // 登陆不成功
goto AGAIN;
break;
}
}
textcolor(7);
}
void help()
{
textcolor(6);
printf("→本系统功能如下:\n");
textcolor(10);
printf("******************************************************************************\n");
printf(" =========目录操作========== \n");
printf("******************************************************************************\n");
printf(" 〓创建目录: mkdir #mkdir directory_name... \n");
printf(" 〓删除目录: rmdir #rmdir directories_name... \n");
printf(" 〓改变目录: cd \n");
printf(" 〓显示目录: dir #dir [file ...] \n");
printf("******************************************************************************\n");
printf(" =========文件操作========== \n");
printf("******************************************************************************\n");
printf(" 〓创建文件: create/write #create/write [file ...] \n");
printf(" 〓删除文件: delete #delete file ... \n");
printf(" 〓显示文件: open/read #open/read [file ...] \n");
printf("******************************************************************************\n");
printf(" =========其他操作========== \n");
printf("******************************************************************************\n");
printf(" 〓帮助文件:help - manual for user #help \n");
printf(" 〓用户切换:user - re_reg or re_log #user \n");
printf(" 〓退出系统: quit - shell builtin commands #quit \n");
printf("******************************************************************************\n");
}
//主程序main.c
struct hinode hinode[NHINO]; // 查找内存i节点的hash表
struct filsys filsys; // 超级块数据结构
struct inode * cur_path_inode; // 当前目录的内存i节点
struct user user[USERNUM]; // 登陆用户表,最多允许8个用户
struct dir dir; // 当前目录
struct file sys_ofile[SYSOPENFILE]; // 系统打开表
struct direct cur_direct[NOFILE]; // 路径
unsigned short cur_dir_id; // 当前目录指针
int user_id; // 当前用户之ID
FILE *fd; // 虚拟磁盘的文件指针
int main()
{ char reg_or_log;
cur_dir_id = 0;
//string man;
//man=new char[3];
printf(" ○○ 欢迎使用UNIX文件系统 ○○ \n");
printf(" \n");
//printf("\t完成人:陈静 学号:20041160007 完成日期:2007-5\n");
textcolor(6);
if( fd != NULL ) // 文件已经存在,不用格式化
{
init(); // 读取磁盘数据
}
else // 文件已经存在,要进行格式化
{ if( format() == 0 ) // 格式化
return; // 格式化不成功
init(); // 读取磁盘数据
}
AGAIN:
textcolor(8);
printf( "\n注册(R)或登录(L)? (R/L) \n" );
while( 1 )
{
reg_or_log = getchar();
// 注册新用户
if(( reg_or_log == 'r' ) || ( reg_or_log == 'R' ))
{ textcolor(7);
printf( "%c\n", reg_or_log );
reg();
goto AGAIN;
}
// 登陆已有用户
else if(( reg_or_log == 'l' ) || ( reg_or_log == 'L' ))
{
textcolor(8);
printf( "%c\n", reg_or_log );
if( login() == 0) // 登陆不成功
goto AGAIN;
break;
}
}
textcolor(7);
strcpy( cur_direct[cur_dir_id].d_name, "/" ); // 当前路径名,"/"表示根目录
cur_direct[cur_dir_id].d_ino = ROOTDIR; // 当前路径的i节点号
system("cls");
// 接受用户操作
while(1)
{if( cmdexp() == 1 ) // 当用户quit时, cmdexp()返回1
break;
}
halt(); // 终止本文件系统
return 0 ;
}
//目录查找函数namei.c
int pre_dinodeid; // 所搜索路径的父目录i节点
char end_path_name[DIRSIZ]; // 路径最后的目录或文件名
char * path;
int len;
int namei( char * name )
{ struct inode * inode;
struct direct dir_buf[BLOCKSIZ / DIRECTSIZ];
int i, j, id, dinodeid;
pre_dinodeid = 0;
path = name;
len = strlen( name );
getpath();
if( end_path_name[0] == '\0' ) // 从根目录起
{ pre_dinodeid = ROOTDIR;
dinodeid = ROOTDIR;
}
else if( strcmp( end_path_name, ".." ) == 0 ) // 从上一级目录起
{if( cur_dir_id != 0 )
id = cur_dir_id - 1;
else id = 0;
dinodeid = cur_direct[id].d_ino;
}
else // 从当前目录起
{
if( strcmp( end_path_name, "." ) == 0 ) // 当前目录
getpath();
for( i = 0; i < dir.size; i++ )
{ // 在当前目录中查找,当前目录已经读入内存
if(( !strcmp( dir.direct[i].d_name, end_path_name )) && ( dir.direct[i].d_ino != 0 ))
{ dinodeid = dir.direct[i].d_ino;
if( len == 0 ) // path搜索完毕
{ pre_dinodeid = cur_path_inode->i_ino;
return dinodeid;
}
else // path还没有搜索完
break;
}
}
if( i == dir.size ) // 找不到
{if( len == 0 ) // 是最后路径
{ pre_dinodeid = cur_path_inode->i_ino;
return NULL;
}
else
return -1; // 找不到中间路径
}
}
HERE:
if( len )
{ getpath(); // 再取得下一路径
inode = iget( dinodeid );
for( i = 0; i < ( inode->i_size / DIRECTSIZ ) / ( BLOCKSIZ / DIRECTSIZ ); i++ )
{ bread( inode->i_addr[i], dir_buf );
for( j = 0; j < BLOCKSIZ / DIRECTSIZ; j++ ) // 找到
if( strcmp( dir_buf[j].d_name, end_path_name ) == 0 )
{ iput( inode );
pre_dinodeid = dinodeid;
dinodeid = dir_buf[j].d_ino;
goto HERE;
}
}
fseek( fd, DATASTART + BLOCKSIZ * inode->i_addr[i], SEEK_SET );
fread( dir_buf, 1, inode->i_size % BLOCKSIZ, fd );
for( j = 0; j < ( inode->i_size % BLOCKSIZ ) / DIRECTSIZ; j++ )
{ // 找到
if( strcmp( dir_buf[j].d_name, end_path_name ) == 0 )
{ iput( inode );
pre_dinodeid = dinodeid;
dinodeid = dir_buf[j].d_ino;
goto HERE;
}
}
if( len == 0 ) // 路径最后找不到
{ pre_dinodeid = dinodeid;
return NULL;
}
else
{ pre_dinodeid = dinodeid;
return -1; // 路径中间找不到
}
}
return dinodeid; // 可找到路径
}
// 分配空闲目录结构
unsigned short iname( struct dir dir, char * name )
{if( dir.size == DIRNUM )
{textcolor(12);
printf( "Current directory is full\n" );
textcolor(7);
return 0;
}
return dir.size;
}
// 识别路径
getpath()
{ int i;
i = 0;
while( len )
{ end_path_name[i] = * path;
if( end_path_name[i] == '/' )
{ end_path_name[i] = '\0';
path++;
len--;
break;
}
i++;
path++;
len--;
}
if( !len )
end_path_name[i] = '\0';
}
//用户注册函数:reg()
void reg()
{ char regname[USERNAMESIZ + 50], regpsw[PWDSIZ], regpsw2[PWDSIZ];
struct inode * inode;
struct user tempuser[USERNUM];
int i, newid;
// 读取磁盘中的用户表
inode = iget( 1 );
fseek( fd, DATASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET );
fread( tempuser, 1, sizeof( struct user ) * USERNUM, fd );
// 查找是否到达最大用户数
for( newid = 0; newid < USERNUM; newid++)
{if( tempuser[newid].u_uid == 0 )
break;
}
// 已达最大用户数,不能再注册
if( newid == USERNUM )
{ printf( "The system have reach the max users\n" );
printf( "You can not register now\n" );
return;
}
// 输入用户名, 按Esc键可重新输入, 还没有输入字符时,按回车取消注册
printf( "Please input your user name(Max 11 characters):\n" );
printf( "请输入你的用户名(11 位数以内):\n" );
for( i = 0; i < USERNAMESIZ + 50; i++ )
{ regname[i] = getchar();
if( i == USERNAMESIZ - 1 )
regname[i] = '\0';
else if( regname[i] == '\n' )
break;
}
if( regname[0] == '\0' )
return;
if( i < USERNAMESIZ )
regname[i] = '\0';
// 输入密码
printf( "Please input your password(Max 11 characters):\n" );
printf( "请输入你的密码(11位数以内):\n" );
for( i = 0; i < PWDSIZ; i++ )
{ regpsw[i] = getch();
if( regpsw[i] == '\b' )
{if( i != 0 )
{ putch( '\b' ), putch( ' ' ), putch( '\b' );
i -= 2;
}
else
i = -1;
}
else
if(( regpsw[i] == '\r' ) || ( i == PWDSIZ - 1 ))
{ regpsw[i] = '\0';
printf( "\n" );
break;
}
else
putch( '*' );
}
// 再次输入密码
printf( "Please input your password again:\n" );
printf( "请再次输入你的密码:\n" );
for( i = 0; i < PWDSIZ; i++ )
{ regpsw2[i] = getch();
if( regpsw2[i] == '\b' )
{ if( i != 0 )
{ putch( '\b' ), putch( ' ' ), putch( '\b' );
i -= 2;
}
else
i = -1;
}
else
if(( regpsw2[i] == '\r' ) || ( i == PWDSIZ - 1 ))
{ regpsw2[i] = '\0';
printf( "\n" );
break;
}
else
putch( '*' );
}
// 检查用户名是否存在
for( i = 0; i < newid; i++ )
{if( strcmp( tempuser[i].u_name, regname ) == 0 )
{textcolor(12);
printf( "Sorry! Username already exists!\n" );
printf( "对不起! 用户已经存在!\n" );
textcolor(7);
return;
}
}
// 检查两次输入的密码是否匹配
if( strcmp( regpsw, regpsw2 ) != 0 )
{ iput( inode );
textcolor(12);
printf( "Sorry! The password is wrong! Can't Register!\n" );
printf( "对不起! 两次输入的密码有误! 未能注册!\n" );
textcolor(7);
return;
}
// 初始化注册用户信息
strcpy( tempuser[newid].u_name, regname );
strcpy( tempuser[newid].password, regpsw );
tempuser[newid].u_default_mode = NORMALMODE;
tempuser[newid].u_gid = 1;
tempuser[newid].u_uid = newid + 1;
// 保存新注册的用户信息于磁盘
fseek( fd, DATASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET );
fwrite( tempuser, 1, sizeof( struct user ) * USERNUM, fd );
iput( inode );
textcolor(10);
printf( "OK! You have register! You can login your accounts\n" );
textcolor(7);
}
// 用户登陆
int login ()
{ char username[USERNAMESIZ + 50], userpsw[PWDSIZ];
struct inode * inode;
struct user tempuser[USERNUM];
int i;
// 输入用户名 // 按Esc键可重新输入, 还没有输入字符时,按回车取消登陆
printf( "Login: " );
for( i = 0; i < USERNAMESIZ + 50; i++ )
{
username[i] = getchar();
if( i == USERNAMESIZ - 1 )
username[i] = '\0';
else if( username[i] == '\n' )
break;
}
if( username[0] == '\0' )
return 0;
if( i < USERNAMESIZ )
username[i] = '\0';
// 输入密码
printf( "Password: " );
for( i = 0; i < PWDSIZ; i++ )
{ userpsw[i] = getch();
if( userpsw[i] == '\b' )
{if( i != 0 )
{ putch( '\b' ), putch( ' ' ), putch( '\b' );
i -= 2;
}
else
i = -1;
}
else
if(( userpsw[i] == '\r' ) || ( i == PWDSIZ - 1 ))
{
userpsw[i] = '\0';
printf( "\n" );
break;
}
else
putch( '*' );
}
inode = iget( 1 );
fseek( fd, DATASTART + BLOCKSIZ * inode->i_addr[0], SEEK_SET );
fread( tempuser, 1, sizeof( struct user ) * USERNUM, fd );
// 检查是否存在该用户
for( i = 0; i < USERNUM; i++ )
{if( strcmp( tempuser[i].u_name, username ) == 0 )
break;
}
if( i == USERNUM ) // 没有该用户
{
textcolor(12);
printf( "Sorry! No such user, please check your user name.\n" );
printf( "对不起!用户名不存在,请检查你的用户名.\n" );
printf( "Please try to login again!\n" );
printf( "请重新注册!\n" );
textcolor(7);
return 0; // 登陆失败
}
// 检查密码是否正确
// 密码不正确
if( strcmp( tempuser[i].password, userpsw ) != 0 )
{
textcolor(12);
printf( "Sorry! password incorrect.\n" );
printf( "Please try to login again!\n" );
textcolor(7);
return 0; // 登陆失败
}
// 正常登陆
user_id = i;
strcpy( user[user_id].u_name, tempuser[i].u_name );
user[user_id].u_uid = tempuser[i].u_uid;
user[user_id].u_gid = tempuser[i].u_gid;
user[user_id].u_default_mode = tempuser[i].u_default_mode;
textcolor(12);
printf( "Login success!\n" );
textcolor(7);
return 1;
}
// 用户退出函数
int quit()
{
int i;
for (i = 0; i < NOFILE; i++)
if (user[user_id].u_ofile[i] != SYSOPENFILE + 1)
close( i );
return 1;
}
//**********************************************
//
// syscall.c
//
//**********************************************
extern int pre_dinodeid;
extern char end_path_name[DIRSIZ];
// 建立文件
int creat( char * pathname, unsigned short mode )
{
unsigned int di_ith, di_ino;
struct inode * inode, * pre_inode;
struct dir tempdir;
int i, j;
di_ino = namei( pathname );
if( di_ino == -1 )
{
textcolor(12);
printf( "No such directory or file\n" );
textcolor(7);
return -1;
}
if( di_ino != NULL ) // 该文件名已经存在
{
inode = iget( di_ino );
if( !( access( inode ) | WRITE )) // 该文件不能写
{
iput( inode );
textcolor(12);
printf( "You have no access to creat\n" );
textcolor(7);
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -