tail head cat sleep
QR code linking to this page

manページ  — VOP_ACCESS

名称

VOP_ACCESS – ファイルまたは UNIX ドメインソケットのアクセス許可の調査

内容

書式

#include <sys/param.h>
#include <sys/vnode.h>

int
VOP_ACCESS(struct vnode *vp, int mode, struct ucred *cred, struct thread *td);

解説

このエントリポイントは、与えられた証明に対する、ファイルの アクセス許可を調査します。

引数は以下の通りです。
vp
  調査対象ファイルの vnode。
mode
  要求されたアクセスのタイプ。
cred
  調査対象のユーザ証明。
td
  調査しているスレッド。

mode VREAD, VWRITE または VEXEC を含むマスクです。

ロック

vnode は、入る時にロックされ、戻る時にもロックされ続けます。

戻り値

ファイルが指定された方法でアクセス可能な場合には、0 が返されます。 そうでない場合には、適切なエラーコードが返されます。

疑似コード

int
vop_access(struct vnode *vp, int mode, struct ucred *cred, struct thread *td)
{
    int error;

/* * ファイルがソケット、FIFO、またはファイルシステムに存在する * ブロック型または文字型デバイスでない場合には、読み込み専用 * ファイルシステムへの書き込みは認められません。 */ if (mode & VWRITE) {         switch (vp->v_type) {         case VDIR:         case VLNK:         case VREG:          if (vp->v_mount->mnt_flag & MNT_RDONLY)                 return EROFS;

         break;         } }

/* 不変ビットが設定されていれば、誰も書き込めません。 */ if ((mode & VWRITE) && vp has immutable bit set)         return EPERM;

/* そうでなければ、uid が 0 ならば常に許可。 */ if (cred->cr_uid == 0)         return 0;

mask = 0;

/* そうでなければ、所有者を調べます。 */ if (cred->cr_uid == owner of vp) {         if (mode & VEXEC)          mask |= S_IXUSR;         if (mode & VREAD)          mask |= S_IRUSR;         if (mode & VWRITE)          mask |= S_IWUSR;         return (((mode of vp) & mask) == mask ? 0 : EACCES); }

/* そうでなければ、グループを調べます。 */ for (i = 0, gp = cred->cr_groups; i < cred->cr_ngroups; i++, gp++)         if (group of vp == *gp) {          if (mode & VEXEC)                 mask |= S_IXGRP;          if (mode & VREAD)                 mask |= S_IRGRP;          if (mode & VWRITE)                 mask |= S_IWGRP;          return (((mode of vp) & mask) == mask ? 0 : EACCES);         }

/* そうでなければ、その他を調べます。 */ if (mode & VEXEC)         mask |= S_IXOTH; if (mode & VREAD)         mask |= S_IROTH; if (mode & VWRITE)         mask |= S_IWOTH; return (((mode of vp) & mask) == mask ? 0 : EACCES); }

エラー

[EPERM]
  不変ファイルを変更しようとしました。
[EACCES]
  パーミッションビットのファイルモードまたは ACL が要求されたアクセスを 許可しませんでした。

関連項目

vaccess(9) [英語], vaccess_acl_posix1e(9) [英語], vnode(9)

作者

このマニュアルページは Doug Rabson が書きました。

VOP_ACCESS (9) July 24, 1996

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

I define UNIX as “30 definitions of regular expressions living under one roof.”
— Donald Knuth