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

📄 dirmanage.c

📁 操作系统简单的登入程序
💻 C
字号:
#include <stdio.h>
#include "filesys.h"
#include <string.h>
void readdir1();
struct inode* readdir2(unsigned short currentuser);
void updatedir1item(unsigned short userid,unsigned short nid);
struct dirs* newdir2(char* uid,char* gid);
void dir1todisk(unsigned short num);
void dir2todisk(struct dirs* pdirs,struct inode* pinode);

void readdir1()
{
	struct inode* pinode=(struct inode*)posinode(0);

	fd=fopen("filesystem","r+");

	fseek(fd,(BLOCKSIZE)*(pinode->di_addr[0]),SEEK_SET);
	fread(&directory_1,sizeof(struct usergroup),1,fd);
	
	fclose(fd);

}

struct inode* readdir2(unsigned short currentuser)
{	
	unsigned short usernode;

	struct inode* pinode;

	readdir1();

	usernode=directory_1.users[currentuser].n_inode;

	pinode=(struct inode*)posinode(usernode);

	fd=fopen("filesystem","r+");

	fseek(fd,(BLOCKSIZE)*(pinode->di_addr[0]),SEEK_SET);


	fread(&directory_2,sizeof(struct dirs),1,fd);

	fclose(fd);

	return pinode;

}

int flink(char* username,char* filename,char* renname)
{
	unsigned short id,i;

	struct inode *pinode,*pinode2;
	
	struct dirs dir_temp; 

	id=username2id(username);
	
	printf("username : %s >>> id : %d\n",username,id);

	if(id==USERNUM)

		return 0;

	pinode=(struct inode* )posinode(directory_1.users[id].n_inode);

	fd=fopen("filesystem","r+");

	fseek(fd,(BLOCKSIZE)*(pinode->di_addr[0]),SEEK_SET);
	
	fread(&dir_temp,sizeof(struct dirs),1,fd);

	fclose(fd);
	
	for (i=0;i<DIRNUM;i++)
	{
		printf("users[%d].u_uid: %s\n", i, dir_temp.direct[i].name);
		if(!strcmp(dir_temp.direct[i].name,filename))
		{
			break;
		}
	}

	if(i==DIRNUM)
	{
		return 1;
	}

	id=freedir2id();
	
	if(id==DIRNUM)

	return 2;

	pinode2=(struct inode* )posinode(dir_temp.direct[i].d_ino);

	if(access(currentuser,pinode2,READ))
	{	
		pinode2->n_refer++;

		updateinodetable(pinode2);

		strcpy(directory_2.direct[id].name,renname);
		
		directory_2.direct[id].d_ino=dir_temp.direct[i].d_ino;
		
		directory_2.direct[id].filetype=DIFILE;

		++directory_2.size;
		
		dir2todisk(&directory_2,(struct inode* )posinode(directory_1.users[currentuser].n_inode));

		return 3;
	}
	else
	{
		return 4;
	}


}

int deluser(char* uid)
{
	int id;
	
	struct inode *pinode,*pinode2;

	struct dirs deldir;
	
	int i;

	if((currentuser!=0)||(strcmp(uid,"root")==0))
	{
		return 0;
	}

	id=username2id(uid);

	if(id==USERNUM)
	{
		return 2;
	}

	pinode=(struct inode*)readdir2(id);
	
	deldir=directory_2;

	readdir2(currentuser);

	for(i=0;i<(DIRNUM);i++)
	{
		if(deldir.direct[i].filetype==DIFILE)
		{
			rmf(deldir.direct[i].name);
		}
	}
	
	bfree(pinode->di_addr[0]);

	ifree(pinode->i_ino);

	strcpy(directory_1.users[id].u_uid,"");

	strcpy(directory_1.users[id].u_gid,"");

	directory_1.users[id].n_inode=0;

	dir1todisk(((struct inode*)posinode(0))->di_addr[0]);

	return 1;

}
void newdir1(char* uid,char* gid,char* password)
{
		struct inode* pinode;

		pinode=(struct inode*)malloc(sizeof(struct inode));	
		
		pinode->di_mode=DIDIR;	

		strcpy(pinode->di_uid,uid);		

		strcpy(pinode->di_gid,gid);

		pinode->di_size=1;
        
		pinode->di_mode=ROOTMODE;

		pinode->di_addr[0]=balloc();

		pinode=(struct inode*)ialloc(pinode);

		strcpy(directory_1.users[0].u_uid,uid);

		strcpy(directory_1.users[0].u_gid,gid);

		strcpy(directory_1.users[0].password,password);

		directory_1.users[0].n_inode=0;

		++directory_1.size;

		dir1todisk(pinode->di_addr[0]);

}

int fnewuser(char* uid,char* gid,char* password)
{
	int pos;

	pos=freedir1id();

	if(currentuser!=0)
	{
		
		return 2;
	}

	if(map2dir(uid)==MAPERR)
	{
		//printf("%d",pos);
		strcpy(directory_1.users[pos].u_uid,uid);

		strcpy(directory_1.users[pos].u_gid,gid);

		strcpy(directory_1.users[pos].password,password);

		directory_1.size++;

		dir1todisk(((struct inode*)posinode(0))->di_addr[0]);

		newdir2(uid,gid);

		return 1;
	}
		return 0;

}

struct dirs* newdir2(char* uid,char* gid)
{
		struct inode* pinode;
		
		struct dirs* pdirs;
        
		pdirs=(struct dirs*)malloc(sizeof(struct dirs));
		
		bzero(pdirs,sizeof(struct dirs));

		strcpy(pdirs->direct[0].name,".");

		strcpy(pdirs->direct[1].name,"..");

		pdirs->direct[0].filetype=DIDIR;

		pdirs->direct[1].filetype=DIDIR;

		pdirs->size=2;

		pinode=(struct inode*)malloc(sizeof(struct inode));	
		
		pinode->di_mode=DEFAULTMODE;
		
		strcpy(pinode->di_uid,uid);		

		strcpy(pinode->di_gid,gid);

		pinode->di_size=1;

		pinode->di_addr[0]=balloc();

		pinode=(struct inode*)ialloc(pinode);

		pdirs->direct[0].d_ino=pinode->i_ino;

		pdirs->direct[1].d_ino=0;

		//printf("%d,%s",map2dir(uid),uid);
    	
		updatedir1item(map2dir(uid),pinode->i_ino);
	
		dir1todisk(((struct inode*)posinode(0))->di_addr[0]);

		dir2todisk(pdirs,pinode);
		
		return pdirs;

}

void updatedir1item(unsigned short  userid,unsigned short  nid)
{
	
		directory_1.users[userid].n_inode=nid;
}

void dir1todisk(unsigned short num)
{

		fd=fopen("filesystem","r+");

		fseek(fd,(BLOCKSIZE)*num,SEEK_SET);

		fwrite(&directory_1,sizeof(struct usergroup),1,fd);

		fclose(fd);

}

void dir2todisk(struct dirs* pdirs,struct inode* pinode)
{

	fd=fopen("filesystem","r+");

	fseek(fd,(BLOCKSIZE*(pinode->di_addr[0])),SEEK_SET);

	fwrite(pdirs,sizeof(struct dirs),1,fd);
	
	fclose(fd);

}



⌨️ 快捷键说明

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