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