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

📄 dir.c

📁 操作系统实验,文件系统,c语言实现的
💻 C
字号:
#include<stdio.h>

#include<string.h>

#include "filesys.h"

_dir()    /*  -dir  */

{

  unsigned short di_mode;

  int i,j,k,one;

  struct inode *temp_inode;

  

  printf("\nCURRENT DIRECTORY:dir.size=%d\n",dir.size);

  

  for(i=0;i<dir.size;i++)

  {

    if(dir.direct[i].d_ino!=DIEMPTY)

    {

       printf("%14s ",dir.direct[i].d_name);

        printf("d_ino=%d",dir.direct[i].d_ino);

       temp_inode=iget(dir.direct[i].d_ino);

       di_mode=temp_inode->di_mode;

     

    if(temp_inode->di_mode & DIFILE)  printf("f"); 

    else printf("d");

       for(j=0;j<9;j++)

       {

              one=di_mode%2;

           di_mode=di_mode/2;

           if(one) printf("x");

           else printf("-");

        }

  

/*printf("i=%d,d_name=%s,",i,dir.direct[i].d_name);

printf("di_mode=%0x\n",temp_inode->di_mode);*/

  

        if(temp_inode->di_mode & DIFILE)  

        {

           printf("%ld",temp_inode->di_size);

           printf(" block chain:");

           for(k=0;k<temp_inode->di_size/BLOCKSIZ+1;k++)

           printf("%d ",temp_inode->di_addr[k]);

           printf("\n");

    }

    else

       printf("<dir>block chain:%d\n",dir.direct[i].d_ino);

        iput(temp_inode);

      }

  }

printf("dir---->out\n");

}

  

mkdir(dirname)    /* mkdir */

char *dirname;

{

  int dirid,dirpos;

  struct inode *inode;

  struct direct buf[BLOCKSIZ/(DIRSIZ+2)];

  unsigned int block;

 

  dirid=namei(dirname);

printf("dirid=%d\n",dirid);

  

  if(dirid != NULL)

  {

      inode=iget(dirid);

      if(inode->di_mode & DIDIR)

        printf("\n%s directory already existed!!!\n",dirname);

    else

 printf("\n%s is a file name,&can't creat a dir the same name\n",dirname);

      iput(inode);

    return;

   }

   dirpos=iname(dirname);

  

   inode=ialloc();

/*dirid=filsys.s_inode[filsys.s_pinode-1];*/

   dirid=inode->i_ino;

/*printf("\ndirid=%d",dirid);

printf("dirpos=%d\n",dirpos);

printf("dir.size=%d\n",dir.size);*/

  

   dir.direct[dirpos].d_ino=inode->i_ino;

   dir.size++;

   /*fill the new dir buf */

   strcpy(buf[0].d_name,".");

   buf[0].d_ino=dirid;

   strcpy(buf[1].d_name,"..");

   buf[1].d_ino=cur_path_inode->i_ino;

/*strcpy(buf[2].d_name,dirname);

buf[2].d_ino=dirid;*/

buf[2].d_ino=0;

  

   block=balloc();

/*printf("block=%d\n",block);*/

   fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);

   fwrite(buf,1,BLOCKSIZ,fd);

  

   inode->di_size=2*(DIRSIZ+2);

   inode->di_number=1;

   inode->di_mode=user[user_id].u_default_mode|DIDIR;

   inode->di_uid=user[user_id].u_uid;

   inode->di_gid=user[user_id].u_gid;

   inode->di_addr[0]=block;

   iput(inode);

printf("mkdir---->out\n");

   return ;

}

  

chdir(dirname)    /* chdir */

char *dirname;

{

   unsigned int dirid;

   struct inode *inode;

   unsigned short block;

   int i,j,low=0,high=0;

  

   dirid=namei(dirname);

/*printf("\ndirname=%skkkkk,dirid=%d\n",dirname,dirid); */

   if(dirid==NULL)

   {

       printf("\n%s does not existed\n",dirname);

   return;

   }

   inode=iget(dirid);

 

   if(!access(user_id,inode,user[user_id].u_default_mode))

   {

       printf("\nhas not access to the directory %s\n",dirname);

       iput(inode);

   return;

   }

  

   /* pack the current directory*/

   for(i=0;i<dir.size; i++)

   {

       for(j=0;j<DIRNUM;j++)

        if(dir.direct[j].d_ino==0) break;

       memcpy(&dir.direct[j],&dir.direct[i],DIRSIZ+2);

       dir.direct[j].d_ino=0;

   }

  

   /*write back the current directory*/

   for(i=0;i<cur_path_inode->di_size/BLOCKSIZ+1;  i++)

   {

       bfree(cur_path_inode->di_addr[i]);

   }

  

   for(i=0;i<dir.size; i+=BLOCKSIZ/(DIRSIZ+2))

   {

       block=balloc();

/*printf("i=%d,block=%d\n",i,block);*/

       cur_path_inode->di_addr[i]=block;

       fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);

       fwrite(&dir.direct[0],1,BLOCKSIZ,fd);

   }

   cur_path_inode->di_size=dir.size*(DIRSIZ+2);

   iput(cur_path_inode);

  

   cur_path_inode=inode;

dir.size=inode->di_size/(DIRSIZ+2);

/*printf("\ndir.size=%d\n",dir.size);*/

  

/*printf("\ninode->di_addr[0]=%d\n",inode->di_addr[0]);*/

   /*read the change dir from disk */

   j=0;

   for(i=0;i<inode->di_size/BLOCKSIZ+1; i++)

   {

/*printf("\ni=%d,inode->di_addr[i]=%d\n",i,inode->di_addr[i]);*/

    fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ,SEEK_SET);

        fread(&dir.direct[0],1,BLOCKSIZ,fd);

    j+=BLOCKSIZ/(DIRSIZ+2);

   };

  

printf("chdir---->out\n");

   return;

}

⌨️ 快捷键说明

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