去除淘宝店铺模块缝隙:C语言程序。。请求帮忙注释下

来源:百度文库 编辑:高考问答 时间:2024/04/30 15:34:40
请帮助注释下那些 CASE语句 特别是那几个& 头疼死我了
本人万分感谢
这段代码主要意思是对文件的控制函数
其中user_id是用户名 inode指针,mode是权限
#define UDIREAD 00001 /*user*/
#define UDIWRITE 00002
#define UDIEXICUTE 00004
#define GDIREAD 00010 /* group*/
#define GDIWRITE 00020
#define GDIEXICUTE 00040
#define ODIREAD 00100 /*other*/
#define ODIWRITE 00200
#define ODIEXICUTE 00400

11、访问控制函数access( ) ( 文件名access.c)
#include "stdio.h"
#include "filesys.h"
unsigned int access(user_id,inode,mode)
unsigned int user_id;
struct inode *inode;
unsigned short mode;
{ int j,k;
for(j=0;j<USERNUM;j++)
if(user[j].u_uid == user_id)
{
k=j;
break;
}

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;
}
}

access(user_id,inode,mode)的作用就是判断判user_id的用户对inode节点对应的文件是否拥有mode权限,如果拥有mode权限返回1,如果不拥有mode权限返回0.
以下代码中inode->di_mode是inode的文件权限属性值,通过位与(&)判断该属性值是否拥有包含相应的权限属性,如inode->di_mode&ODIREAD,如果值不为零,则inode的文件访问权限属性值包含ODIREAD权限,也就是其它用户对inode的文件拥有READ权限。
只要你明白了Linux下或Unix下的文件/目录访问权限关系,下面的代码就很简单了。

case READ: //mode == READ

/*如果inode的其它用户拥有READ权限(即inode->di_mode&ODIREAD 不等于0),那么user_id当然也拥有inode对应的文件的READ权限了*/
if (inode->di_mode&ODIREAD) return 1;

/*如果inode权限包含GDIREAD(inode->di_mode&GDIREAD不等于0,也就是文件组用户拥有对该文件的READ权限),user_id又属于相应的用户组(user[k].u_gid==inode->di_gid)) ),当然也就拥有READ权限了*/
if ((inode->di_mode&GDIREAD)&&(user[k].u_gid==inode->di_gid)) return 1;

/*如果inode属主拥有READ权限(也就是文件组用户拥有对该文件的READ权限),而user_id就是inode的用户属主(即user[k].u_uid==inode->di_uid),那user_id当然就有READ权限了*/
if ((inode->di_mode&UDIREAD)&&(user[k].u_uid==inode->di_uid)) return 1;
return 0;

...
其它类似