?? creat.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 + -