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

📄 creat.c

📁 此版本是在网上广为流传的 二级文件系统 基础上制作的.重新编写了块操作等模块,修正了N多BUG. 实现的命令有 ls-列目录 md-创建目录 cd-进入子目录 mf-创建文件 cat-显示文件内
💻 C
字号:
#include <stdio.h>
#include "filesys.h"

creat(user_id,filename, file_block, mode)
unsigned int user_id;
char *filename;
unsigned int file_block;
unsigned short mode;
{
    unsigned int di_ith,di_ino;
    struct inode *inode;
    int i,j;

    di_ino=namei(filename);
    if(di_ino!=NULL)    /*  already existed  */
    {
       inode=iget(di_ino);
       if(access(user_id,inode,mode)==0)
       {
           iput(inode);
           printf("\ncreat access not allowed\n");
           return;
       }

   /*  free all the bloCk of the old file  */

   for(i=0;i<inode->di_size/BLOCKSIZ+(inode->di_size%BLOCKSIZ != 0);i++)
   {
       bfree(inode->di_addr[i]);
   }
   for(i=0;i<file_block/BLOCKSIZ+(file_block%BLOCKSIZ != 0);i++)
   { 
      inode->di_addr[i]=balloc();
   }
   inode->di_size = file_block;

   /* to do:add code here to update the pointer of the sys_file  */

   for(i=0;i<SYSOPENFILE;i++)
       if(sys_ofile[i].f_inode==inode->i_ino)
       {
              sys_ofile[i].f_off=0;
              break;
       }
   printf("%d", i);
   for(j=0;j<NOFILE;j++)
       if(user[user_id].u_ofile[j]==i)
       {
           break;  
       }
   return j;  
 }

else  /* not existed before */
{
    inode=ialloc();
    di_ith=iname(filename);
    dir.size++;
    dir.direct[di_ith].d_ino=inode->i_ino;
    dir.direct[di_ith+1].d_ino=0;

/*printf("\ndi_ith=%d\n",di_ith);
printf("\ndir.size=%d\n",dir.size);
printf("\ninode->i_ino=%d\n",inode->i_ino);
*/

/*for(i=0;i<USERNUM;i++)
    if(user[i].u_uid==user_id) break;
if(i==USERNUM)
{
    printf("\nuser_id not existed \n");
    return;
}
user_id=i;*/

    inode->di_mode=user[user_id].u_default_mode|DIFILE;
    inode->di_uid=user[user_id].u_uid;
    inode->di_gid=user[user_id].u_gid;
    inode->di_size=file_block;
    inode->di_number=1;

 for(i=0;i<file_block/BLOCKSIZ+(file_block%BLOCKSIZ != 0);i++)
 { 
     inode->di_addr[i]=balloc();
     //printf("i=%d,inode->di_addr[i]=%d\n",i,inode->di_addr[i]);
 }

/*printf("\nuser_id=%d\n",user_id);
printf("\nu_default_mode=%0x\n",user[user_id].u_default_mode);
printf("\nu_uid=%d\n",user[user_id].u_uid);
printf("\nu_gid=%d\n",user[user_id].u_gid);*/

 for(i=0;i<SYSOPENFILE;i++)
        if(sys_ofile[i].f_count==0)
        {   
               break;
        }
 for(j=0;j<NOFILE;j++)
       if(user[user_id].u_ofile[j]==SYSOPENFILE+1)
       {
       break;
       }

    user[user_id].u_ofile[j]=i;
    sys_ofile[i].f_flag=mode;
    sys_ofile[i].f_count=0;
    sys_ofile[i].f_off=0;
    sys_ofile[i].f_inode=inode;

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

/*printf("\nuser[user_id].u_ofile[j]=%d\n",i);
printf("\nsys_ofile[i].f_flag=%d\n",mode);
printf("\nsys_ofile[i].f_count=%d\n",0);
printf("\nsys_ofile[i].f_off=%d\n",0);
printf("\nsys_ofile[i].f_inode=%0x\n",inode);*/

 return  j;

 }

}

⌨️ 快捷键说明

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