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

📄 fs_server.c

📁 题目:文件系统的模拟实现 目的:深入理解文件系统的实现机制
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -