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

📄 main.c

📁 UNIX模拟系统模拟得很完善!
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -