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

📄 open.c

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

#include "filesys.h"

unsigned short open(user_id,filename,openmode)
int user_id;
char  *filename;
unsigned short openmode;
{

 unsigned int dinodeid;
 struct inode *inode;
 int i,j;

 dinodeid=namei(filename);
 if(dinodeid == NULL)    /*no such file */
 {
    printf("\nfile does not existed!!!\n");
    return  NULL;
 }

 inode=iget(dinodeid);
 if(!access(user_id,inode,openmode))  /* access denled*/
 {  
    printf("\nfile open has not access!!!");
    iput(inode);
    return NULL;
 }

 /*  alloc the sys_ofile item  */

 for(i=0; i<SYSOPENFILE;i++)
     if(sys_ofile[i].f_count==0) break;

 if(i==SYSOPENFILE)
 {
     printf("\nsystem open file too much\n");
     iput(inode);
     return NULL;
 }

 sys_ofile[i].f_inode=inode;
 sys_ofile[i].f_flag=openmode;
 sys_ofile[i].f_count=1;
 if(openmode & FAPPEND)
     sys_ofile[i].f_off=inode->di_size;
 else
     sys_ofile[i].f_off=0;

  /*alloc the user open file item*/

 for(j=0;j<NOFILE;j++)
     if(user[user_id].u_ofile[j]==SYSOPENFILE+1) break;
 if(j==NOFILE)
 {
     printf("\nuser open file too much!!!\n");
     sys_ofile[i].f_count=0;
     iput(inode);
     return NULL;
 }

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

 /*  if NOT APPEND,free the block of the file before  */

 if(!(openmode & FAPPEND))
 {
      for(i=0;i<inode->di_size/BLOCKSIZ+(inode->di_size%BLOCKSIZ != 0);i++)
            bfree(inode->di_addr[i]);
      inode->di_size=0;
 }

printf("\ni=%d,dinodeid=%d\n",i,dinodeid);
printf("\nj=%d,sys_ofile[i].f_off=%d\n",j,sys_ofile[i].f_off);

  return j;

}

⌨️ 快捷键说明

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