📄 fs_server.c
字号:
Inode.di_mode=Dinode.di_mode;
Inode.di_nlink=Dinode.di_nlink;
Inode.di_uid=Dinode.di_uid;
Inode.di_gid=Dinode.di_gid;
Inode.di_size=Dinode.di_size;
Inode.i_forw=0;
Inode.i_back=0;
Inode.i_flag=0;
Inode.i_count=0;
Inode.i_dev = 0;
Inode.inumber=DinodeAddr;
for(i=0;i<13;i++)
{
Inode.i_a[i]=Dinode.di_addr[i];
}
Inode.i_l=0;
return(Inode);
}
inode GetInode(const char *pathname, int flag, ...)
{
va_list ap;
dinode Dinode;
dinode_addr DinodeAddr;
if ((flag&O_CREAT) > 0) {
va_start(ap, flag);
DinodeAddr = LookUp(pathname, 1, 1);
if (DinodeAddr != 1) {
lseek(fd, Dinode_BtoP(DinodeAddr), 0);
read(fd, &Dinode, sizeof(dinode));
Dinode.di_mode = va_arg(ap, int);
lseek(fd, Dinode_BtoP(DinodeAddr), 0);
write(fd, &Dinode, sizeof(dinode));
va_end(ap);
} else
printf("The path is not all found\n");
} else {
DinodeAddr = LookUp(pathname, 0, 1);
if (DinodeAddr == 1)
printf("GetInode(): The path is not all found\n");
else if (DinodeAddr == 0)
printf("GetInode(): Cant't find %s.\n", pathname);
else {
lseek(fd, Dinode_BtoP(DinodeAddr), 0);
read(fd, &Dinode, sizeof(dinode));
}
}
//Dinode to inode;
return DinodetoInode(Dinode, DinodeAddr);
}
void Release(dblock_addr Daddr)
{
}
inode AdjustDinode(dinode_addr Dinode_addr , int nbytes)
{
dinode Dinode;
dblock_addr indrect[256]; //inderct find addr
int i, j, n_block, haved_nblock, require_nblock ;
// Dinode_addr = LookUp(pathname, 0, 1);
lseek(fd, Dinode_BtoP(Dinode_addr), 0);
if (read(fd, &Dinode, sizeof(dinode)) == -1) {
printf("AdjustDinode():Read dinode error.\n");
exit(0);
}
require_nblock = (nbytes + 1023)/1024;
haved_nblock = (Dinode.di_size + 1023)/1024;
n_block = require_nblock - haved_nblock;
if (n_block > 0) { //Add block;
if (require_nblock <= 10) {
for (i = haved_nblock; i < require_nblock; i++)
Dinode.di_addr[i] = GetFreeBlock();
Dinode.di_size = nbytes;
lseek(fd, Dinode_BtoP(Dinode_addr), 0); //Write Dinode
write(fd, &Dinode, sizeof(dinode));
}
else if (require_nblock <= 266) { //End at Lever1 addr
if (haved_nblock <=10) { //Begin at Lever0 addr
for (i = haved_nblock; i < 10; i++)
Dinode.di_addr[i] = GetFreeBlock();
for (i = 0; i < require_nblock - 10; i++)
indrect[i] = GetFreeBlock();
Dinode.di_addr[10] = GetFreeBlock();
lseek(fd, Dblock_BtoP(Dinode.di_addr[10]), 0); //Write block
write(fd, indrect, 256*sizeof(dblock_addr)); //Write indrect
}else { //Begin at Lever1 addr
lseek(fd, Dblock_BtoP(Dinode.di_addr[10]), 0);
read(fd, indrect, 256*sizeof(dblock_addr));
for (i = haved_nblock, j = haved_nblock - 10; i < require_nblock; i++, j++)
indrect[j] = GetFreeBlock();
lseek(fd, Dblock_BtoP(Dinode.di_addr[10]), 0); //Write indrect
write(fd, indrect, 256*sizeof(dblock_addr)); //Write block
}
Dinode.di_size = nbytes;
lseek(fd, Dinode_BtoP(Dinode_addr), 0); //Write Dinode
write(fd, &Dinode, sizeof(dinode));
} else if (require_nblock <= 65802) { //End at Lever2 addr
if (haved_nblock <= 10) { //Begin at Lever0 addr
} else if (haved_nblock <= 266) { //Begin at Lever1 addr
} else { //Begin at Lever2 addr
}
} else { //End at Lever3 addr
if (haved_nblock <= 10) { //Begin at Lever0 addr
} else if (haved_nblock <= 266) { //Begin at Lever1 addr
} else if (haved_nblock <= 65802) { //Begin at Lever2 addr
} else { //Begin at Lever3 addr
}
}
} else if (n_block < 0) { //Release block;
} else { //Just fit it;
}
return DinodetoInode(Dinode, Dinode_addr);
}
dinode_addr mymakedir(const char *pathname, unsigned short mode)
{
dinode Dinode;
dinode_addr DinodeAddr;
DinodeAddr = LookUp(pathname, 1, 0);
if (DinodeAddr == 1)
printf("mymakedir():The path is not all found.\n");
else { //require
lseek(fd, Dinode_BtoP(DinodeAddr), 0);
read(fd, &Dinode, sizeof(dinode));
Dinode.di_mode = mode;
lseek(fd, Dinode_BtoP(DinodeAddr), 0);
write(fd, &Dinode, sizeof(dinode));
}
return DinodeAddr;
}
void Mount(void)
{
if ((fd = open("myfilesys.dat", O_RDWR)) == -1) {
if((fd = open("myfilesys.dat", O_RDWR|O_CREAT, 0644)) == -1) {
printf("Open myfilesys.dat error.\n");
exit(0);
}
InitSuperBlock(fd);
InitDinode(fd);
InitDblock(fd);
} else {
if (read(fd, &SuperBlock, sizeof(struct filesys)) == -1) {
printf("Read SuperBlock error.\n");
exit(0);
}
}
}
void Unmount(void)
{
lseek(fd, 0, 0);
write(fd, &SuperBlock, sizeof(struct filesys));
close(fd);
}
/*
void List(dinode_addr DinodeAddr) //DinodeAddr must be dir
{
dinode Dinode;
direct Direct[64];
int i, j;
lseek(fd, Dinode_BtoP(DinodeAddr), 0);
read(fd, &Dinode, sizeof(dinode));
for (i = 0; Dinode.di_addr[i] != 0; i++) {
lseek(fd, Dblock_BtoP(Dinode.di_addr[i]), 0);
read(fd, Direct, 64*sizeof(direct));
for (j = 0; Direct[j].DinodeAddr != 0; j++) {
lseek(fd, Dinode_BtoP(Direct[j].DinodeAddr), 0);
read(fd, &Dinode, sizeof(dinode));
printf("/%s\t DinodeAddr:%u\t di_mode:%o\n", Direct[j].d_name, Direct[j].DinodeAddr, Dinode.di_mode);
// List(Direct[j].DinodeAddr);
}
}
}*/
int main(void)
{
int server_fifo_fd, client_fifo_fd;
struct data_to_pass my_data;
int nbytes;
char client_fifo_name[256];
dinode_addr DinodeAddr;
inode Inode;
Mount();
if (open(SERVER_FIFO_NAME,O_RDONLY)!=-1)
unlink (SERVER_FIFO_NAME);
if (mkfifo(SERVER_FIFO_NAME,0777)<0) {
printf ("SERVER_FIFO fail\n");
exit(1);
}
server_fifo_fd = open (SERVER_FIFO_NAME,O_RDONLY);
if (server_fifo_fd == -1 )
{
printf("Can not open SERVER_FIFO\n");
exit(2);
}
do {
nbytes = read( server_fifo_fd, &my_data, sizeof(my_data) );
if (my_data.index == 9) {
unlink(client_fifo_name);
break;
}
if (nbytes>0) {
sprintf( client_fifo_name, CLIENT_FIFO_NAME, my_data.client_pid );
client_fifo_fd = open(client_fifo_name,O_WRONLY);
if ( client_fifo_fd != -1) {
if (my_data.index == 1) {
Inode = GetInode(my_data.pathname, my_data.flag, my_data.mode);
write(client_fifo_fd,&Inode,sizeof(inode) );
} else if (my_data.index == 2) {
Inode = GetInode(my_data.pathname, my_data.flag);
write(client_fifo_fd,&Inode,sizeof(inode) );
} else if (my_data.index == 3) {
Inode = AdjustDinode(my_data.DinodeAddr, my_data.nbytes);
write(client_fifo_fd,&Inode,sizeof(inode) );
} else if (my_data.index == 4) {
DinodeAddr = mymakedir(my_data.pathname, my_data.mode);
write(client_fifo_fd,&DinodeAddr,sizeof(dinode_addr) );
} else if (my_data.index == 5) {
DinodeAddr = LookUp(my_data.pathname, 0, 0);
write(client_fifo_fd,&DinodeAddr,sizeof(dinode_addr) );
} else if (my_data.index == 9) {
printf("breakhere\n");
unlink(client_fifo_name);
break;
} else{
printf("Index error!\n");
exit(1);
}
} else {
printf("main():Can't open CLIENT_FIFO.\n");
exit(1);
}
}
}while (1);
close(server_fifo_fd);
unlink (SERVER_FIFO_NAME);
Unmount();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -