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

📄 creat.c

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

#include "filesys.h"

creat(user_id,filename,mode)

unsigned int user_id;

char *filename;

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 ofthe 01d file  */

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

   {

       bfree(inode->di_addr[i]);

   }

   /* 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)

   {

       sys_ofile[i].f_off=0;

   }

   for(i=0;i<NOFILE;i++)

       if(user[user_id].u_ofile[i]==SYSOPENFILE+1)

   {

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

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

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

                  if(sys_ofile[j].f_count==0)

          {

            user[user_id].u_ofile[i]=j;

            sys_ofile[j].f_flag=mode;

          }

       return i;

   }

 }

 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+1;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;i++)

       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 + -