switch(mode) {
case READ:
if (inode->di_mode&ODIREAD) return 1;
if ((inode->di_mode&GDIREAD)&&(user[k].u_gid==inode->di_gid)) return 1; if ((inode->di_mode&UDIREAD)&&(user[k].u_uid==inode->di_uid)) return 1; return 0; case WRITE:
if (inode->di_mode &ODIWRITE) return 1;
if((inode->di_mode &GDIWRITE)&&(user[k].u_gid==inode->di_gid)) return 1; if((inode->di_mode&UDIWRITE)&&(user[k].u_uid==inode->di_uid)) return 1; return 0; case EXICUTE:
if (inode->di_mode &ODIEXICUTE) return 1;
if((inode->di_mode&GDIEXICUTE)&&(user[k].u_gid==inode->di_gid)) return 1; if((inode->di_mode&UDIEXICUTE)&&(user[k].u_uid== inode->di_uid)) return 1; return 0;
case FAPPEND: return 1;
case DEFAULTMODE: return 1; default:
return 0; } }
12、显示列表函数dir( )和目录创建函数mkdir( )等(文件名dir.c)
#include \#include \#include \_dir( ) /*dir*/ { unsigned int di_mode; int i,j,one;
struct inode *temp_inode;
printf(\
for(i=0;i if(!(strcmp(dir.direct[i].d_name,\ { dir.size = i; break; } } for(i=0;i if (dir.direct[i].d_ino!=DIEMPTY) { printf(\ ,dir.direct[%d].d_ino 性:\ temp_inode=iget(dir.direct[i].d_ino); di_mode=temp_inode->di_mode; for(j=0;j<12;j++) { one=di_mode%2; di_mode=di_mode/2; if (one) printf(\ else printf(\ } if(temp_inode->di_mode & DIFILE) { printf(\ printf(\ for(j=0;j printf(\ } else printf(\ iput(temp_inode); } } } mkdir(dirname) /*mkdir*/ = %d, 属 char *dirname; { int dirid,dirpos; struct inode *inode; struct direct buf[BLOCKSIZ/(DIRSIZ+2)]; unsigned int block; memset(buf,0,(BLOCKSIZ/(DIRSIZ+2))*sizeof(struct direct)); dirid=namei(dirname); if(dirid!=NULL) { inode=iget(dirid); if (inode->di_mode&DIDIR) printf(\ else printf(\ iput(inode); return; } dirpos=iname(dirname); inode=ialloc( ); // inode->i_ino=dirid; dir.direct[dirpos].d_ino=inode->i_ino; dir.size++; /* fill the new dir buf*/ strcpy(buf[0].d_name,\buf[0].d_ino=inode->i_ino; strcpy(buf[1].d_name,\ buf[1].d_ino=cur_path_inode->i_ino; block=balloc( ); fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET); fwrite(buf,1,BLOCKSIZ,fd); inode->di_size=2*sizeof(struct direct); inode->di_number=1; inode->di_mode=user[user_id].u_default_mode; inode->di_uid=user[user_id].u_uid|DIDIR; inode->di_gid=user[user_id].u_gid; inode->di_addr[0]=block; iput(inode); 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); if(dirid==NULL) { printf(\ return ; } inode=iget(dir.direct[dirid].d_ino); if(!access(user_id,inode,user[user_id].u_default_mode)) { printf(\ iput(inode); return ; } /*pack the current directory for(i=0;i printf(\ if (dir.direct[j].d_ino==0) break; } printf(\ memcpy(&dir.direct[i],&dir.direct[j],DIRSIZ+2); dir.direct[j].d_ino=0; } */ /* write back the current directory */ //for(i=0;i for(i=0;i
block=balloc( );
cur_path_inode->di_addr[i]=block;
fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET); fwrite(&dir.direct[i],1,BLOCKSIZ,fd); } else {
fseek(fd,DATASTART+cur_path_inode->di_addr[0]*BLOCKSIZ,SEEK_SET); fwrite(&dir.direct[0],1,BLOCKSIZ,fd); } }
cur_path_inode->di_size=dir.size*(sizeof(struct direct)); iput(cur_path_inode); cur_path_inode=inode;
/* read the change dir from disk */ j=0;
for(i=0;i
fseek(fd,DATASTART+ inode->di_addr[i]*BLOCKSIZ,SEEK_SET); fread(&dir.direct[j],1,BLOCKSIZ,fd); j+=BLOCKSIZ/(DIRSIZ+2); } return; }
13、文件创建函数 creat( ) ( 文件名creat.c)
#include \#include \
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,k,user_p;