名 前
chown, fchown, lchown, fchownat − フ ァ イ ル の 所 有 者 を 変 更 す る
書 式
#include <unistd.h>
int
chown(const char *pathname, uid_t
owner, gid_t group);
int fchown(int fd, uid_t owner,
gid_t group);
int lchown(const char *pathname, uid_t
owner, gid_t group);
#include
<fcntl.h> /* AT_* 定 数 の
定 義 */
#include <unistd.h>
int
fchownat(int dirfd, const char
*pathname,
uid_t owner, gid_t group,
int flags);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
fchown(), lchown():
_BSD_SOURCE ||
_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* glibc 2.12 以 降 : */
_POSIX_C_SOURCE >= 200809L
fchownat():
glibc 2.10 以 降 :
_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
glibc 2.10 よ り 前 :
_ATFILE_SOURCE
説 明
こ れ ら の シ ス テ ム コ ー ル は 、 い ず れ も フ ァ イ ル の 所 有 者 (owner) と グ ル ー プ を 変 更 す る 。 シ ス テ ム コ ー ル chown(), fchown(), lchown() 間 の 違 い は 、 フ ァ イ ル の 指 定 の 仕 方 だ け で あ る 。
* |
chown() は pathname で 指 定 さ れ た フ ァ イ ル の 所 有 権 を 変 更 す る 。 pathname が シ ン ボ リ ッ ク リ ン ク の 場 合 は 、 リ ン ク の 展 開 が 行 わ れ る 。 | ||
* |
fchown() は オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー fd に よ り 参 照 さ れ る フ ァ イ ル の 所 有 権 を 変 更 す る 。 | ||
* |
lchown() は chown() と 同 じ だ が 、 シ ン ボ リ ッ ク リ ン ク を 展 開 し な い 点 が 異 な る 。 |
特 権 を 持 つ プ ロ セ ス (Linux で は CAP_CHOWN ケ ー パ ビ リ テ ィ (capability) を 持 つ プ ロ セ ス ) だ け が フ ァ イ ル の 所 有 者 を 変 更 で き る 。 フ ァ イ ル の 所 有 者 は 、 そ の 所 有 者 が 属 し て い る グ ル ー プ の い ず れ か に フ ァ イ ル の グ ル ー プ を 変 更 す る こ と が で き る 。 特 権 (Linux で は CAP_CHOWN) を 持 つ プ ロ セ ス は 、 任 意 の グ ル ー プ に 変 更 で き る 。
owner ま た は group に −1 が 指 定 さ れ た 場 合 、 そ れ ら の ID は 変 更 さ れ な い 。 非 特 権 ユ ー ザ ー に よ り 実 行 フ ァ イ ル の 所 有 者 ま た は グ ル ー プ が 変 更 さ れ た 場 合 は S_ISUID と ISGID モ ー ド ビ ッ ト は ク リ ア さ れ る 。 POSIX は こ の 動 作 や ル ー ト が chown() を 行 な っ た 場 合 に つ い て は 特 に 指 定 さ れ て い な い 。 Linux に お け る 動 作 は カ ー ネ ル の バ ー ジ ョ ン に 依 存 す る 。 非 グ ル ー プ 実 行 フ ァ イ ル (S_IXGRP ビ ッ ト が 設 定 さ れ て い な い フ ァ イ ル ) の 場 合 に は S_ISGID ビ ッ ト は 強 制 ロ ッ ク (mandatory locking) を 意 味 し て い る 。 そ し て そ れ は chown() で は ク リ ア で き な い 。
fchownat()
fchownat() シ ス テ ム コ
ー ル は chown() と 全
く 同 様 に 動 作
す る が 、 以 下
で 説 明 す る 点
が 異 な る 。
pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス の 場 合 、 こ の パ ス 名 は フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が 参 照 す る デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る (chown() に 相 対 パ ス 名 を 渡 し た 場 合 の よ う に 、 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス で は な い )。
pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス で 、 dirfd が 特 別 な 値 AT_FDCWD の 場 合 、 (chown() と 同 様 に ) pathname は 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る 。
pathname で 指 定 さ れ た パ ス 名 が 絶 対 パ ス の 場 合 、 dirfd は 無 視 さ れ る 。
flags
引 き 数 は 、 以
下 に 示 す 値 の 0
個 以 上 の OR (論 理
和 ) を と っ て 作
成 さ れ る ビ ッ
ト マ ス ク で あ
る 。
AT_EMPTY_PATH (Linux 2.6.39 以 降 )
pathname が 空 文 字 列 の 場 合 、 dirfd が 参 照 す る フ ァ イ ル に 対 し て 操 作 を 行 う (dirfd は open(2) O_PATH フ ラ グ を 使 っ て 取 得 す る こ と が で き る )。 こ の 場 合 、 dirfd は 、 デ ィ レ ク ト リ だ け で な く 、 任 意 の タ イ プ の フ ァ イ ル を 参 照 す る こ と が で き る 。 dirfd が AT_FDCWD の 場 合 、 こ の 呼 び 出 し は カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 し て 操 作 を 行 う 。 こ の フ ラ グ は Linux 固 有 で あ り 、 そ の 定 義 を 得 る に は _GNU_SOURCE を 定 義 す る こ と 。
AT_SYMLINK_NOFOLLOW
pathname が シ ン ボ リ ッ ク リ ン ク の 場 合 、 リ ン ク の 展 開 を 行 わ な い 。 代 わ り に 、 lchown() 同 様 、 リ ン ク 自 身 に 対 し て 操 作 を 行 う 。 (デ フ ォ ル ト で は fchownat() は chown() と 同 様 に シ ン ボ リ ッ ク リ ン ク の 展 開 を 行 う 。 )
fchownat() の 必 要 性 に つ い て の 説 明 に つ い て は openat(2) を 参 照 。
返 り 値
成 功 し た 場 合 は 0 が 返 さ れ る 。 エ ラ ー の 場 合 は −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。
エ ラ ー
フ ァ イ ル シ ス テ ム に よ っ て は 、 下 記 の 一 覧 に な い 他 の エ ラ ー が 返 さ れ る こ と も あ る 。
chown() で ご く 一 般 的 な エ ラ ー を 以 下 に 挙 げ る :
EACCES パ ス 名 の 構 成 要 素 に 検 索 許 可 が な い |
(path_resolution(7) も 見 よ )。 | ||
EFAULT |
pathname が ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 を 指 し て い る 。
ELOOP |
pathname を 解 決 す る と き に 、 解 決 す べ き シ ン ボ リ ッ ク リ ン ク が 多 す ぎ た 。 |
ENAMETOOLONG
pathname が 長 過 ぎ る 。
ENOENT フ ァ イ ル が 存 在 し な い 。 |
||
ENOMEM カ ー ネ ル に 十 分 な メ モ リ ー が な い 。 |
ENOTDIR パ ス 名 の 構 成 要 素 が デ ィ レ ク ト リ で は な い 。
EPERM 呼 び 出 し た プ ロ セ ス に 所 有 者 ま た は グ ル ー プ |
(も し く は そ の 両 方 ) を 変 |
更 す る た め に 要 求 さ れ る 許 可 (上 記 を 参 照 ) が な い 。
EROFS フ ァ イ ル が 読 み 込 み 専 用 |
(read only) の フ ァ イ ル シ ス テ ム 上 に あ る 。 |
fchown() で 一 般 的 な エ ラ ー を 以 下 に 挙 げ る :
EBADF デ ィ ス ク リ プ タ ー が 有 効 で な い 。 |
||
EIO |
i ノ ー ド (inode) を 変 更 す る 際 に 低 レ ベ ル I/O エ ラ ー が 発 生 し た 。
ENOENT 上 記 を 参 照 。 |
||
EPERM 上 記 を 参 照 。 |
||
EROFS 上 記 を 参 照 。 |
chown() で 発 生 す る の と 同 じ エ ラ ー が fchownat() で も 起 こ る 。 fchownat() で は 以 下 の エ ラ ー も 発 生 す る 。
EBADF |
dirfd が 適 切 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。 |
|||
EINVAL |
flags に 無 効 な フ ラ グ が 指 定 さ れ た 。 |
ENOTDIR
pathname が 相 対 パ ス で 、 dirfd が デ ィ レ ク ト リ 以 外 の フ ァ イ ル を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。
バ ー ジ ョ ン
fchownat() は カ ー ネ ル 2.6.16 で Linux に 追 加 さ れ た 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は バ ー ジ ョ ン 2.4 以 降 の glibc で 利 用 で き る 。
準 拠
chown(), fchown(), lchown(): 4.4BSD, SVr4, POSIX.1−2001, POSIX.1−2008.
4.4BSD 版 で は ス ー パ ー ユ ー ザ ー の み が 使 用 で き る (つ ま り 、 普 通 の ユ ー ザ ー は フ ァ イ ル を 手 放 す こ と は で き な い )。
fchownat(): POSIX.1−2008.
注 意
新 し い フ ァ イ ル の 所 有 権
(open(2) や mkdir(2) な ど に よ り ) 新 し い フ ァ イ ル が 作 成 さ れ る と き 、 そ の 所 有 者 は 呼 び 出 し た プ ロ セ ス の フ ァ イ ル シ ス テ ム ユ ー ザ ー ID と 同 じ に 設 定 さ れ る 。 そ の フ ァ イ ル の グ ル ー プ は い く つ か の 要 因 に よ り 決 定 さ れ る 。 そ の 要 因 と し て は 、 フ ァ イ ル シ ス テ ム の 種 類 、 そ の フ ァ イ ル シ ス テ ム の マ ウ ン ト 時 に 使 用 さ れ た オ プ シ ョ ン 、 親 デ ィ レ ク ト リ で set−group−ID 許 可 ビ ッ ト が 有 効 に な っ て い る ど う か 、 が あ る 。 フ ァ イ ル シ ス テ ム が mount(8) オ プ シ ョ ン の −o grpid (−o bsdgroups も 同 義 語 ) と −o nogrpid (−o sysvgroups も 同 義 語 ) に 対 応 し て い る 場 合 、 ル ー ル は 以 下 の 通 り と な る 。
* フ ァ イ ル シ ス テ ム が |
−o grpid 付 き で マ ウ ン ト さ れ て い る 場 合 、 新 し い フ ァ |
イ ル の グ ル ー プ は 親 デ ィ レ ク ト リ の グ ル ー プ と 同 じ に な る 。
* フ ァ イ ル シ ス テ ム が |
−o nogrpid 付 き で マ ウ ン ト さ れ て お り 、 親 デ ィ レ ク ト |
リ で は set−group−ID ビ ッ ト が 無 効 に な っ て い る 場 合 、 新 し い フ ァ イ ル の グ ル ー プ は プ ロ セ ス の フ ァ イ ル シ ス テ ム GID と 同 じ に な る 。
* フ ァ イ ル シ ス テ ム が |
−o nogrpid 付 き で マ ウ ン ト さ れ て お り 、 親 デ ィ レ ク ト |
リ で は set−group−ID ビ ッ ト が 有 効 に な っ て い る 場 合 、 新 し い フ ァ イ ル の グ ル ー プ は 親 デ ィ レ ク ト リ の グ ル ー プ と 同 じ に な る 。
Linux 2.6.25 で は 、 マ ウ ン ト オ プ シ ョ ン −o grpid と −o nogrpid に 対 応 し て い る フ ァ イ ル シ ス テ ム は ext2, ext3, ext4, XFS で あ る 。 こ れ ら の マ ウ ン ト オ プ シ ョ ン に 対 応 し て い な い フ ァ イ ル シ ス テ ム で は 、 −o nogrpid に 関 す る ル ー ル が 適 用 さ れ る 。
glibc
で の 注 意
fchownat() が 利 用 で き
な い 古 い カ ー
ネ ル で は 、 glibc ラ
ッ パ ー 関 数 は
chown() を 使 用 す る
モ ー ド に フ ォ
ー ル バ ッ ク す
る 。 pathname が 相 対
パ ス の 場 合 、 glibc
は dirfd 引 き 数 に
対 応 す る /proc/self/fd
の シ ン ボ リ ッ
ク リ ン ク に 基
づ い て パ ス 名
を 構 成 す る 。
NFS
chown() 方 式 は UID マ ッ
ピ ン グ を 使 用
し た NFS フ ァ イ ル
シ ス テ ム を 侵
害 す る 。 さ ら
に フ ァ イ ル の
内 容 に ア ク セ
ス す る 全 て の
シ ス テ ム コ ー
ル を 侵 害 す る
。 こ れ は chown() が
既 に オ ー プ ン
さ れ た フ ァ イ
ル に 対 す る ア
ク セ ス を た だ
ち に 取 り 消 す
こ と に よ る 。
ク ラ イ ア ン ト
側 の キ ャ ッ シ
ュ に よ り 所 有
権 が 変 更 さ れ
て ユ ー ザ ー の
ア ク セ ス が 許
し た 時 点 と 、
実 際 に 他 の ク
ラ イ ア ン ト で
ユ ー ザ ー に よ
っ て フ ァ イ ル
に ア ク セ ス で
き る 時 点 と の
間 に 時 間 差 が
あ る か も し れ
な い 。 歴 史 的
な 詳 細 元 々 の
Linux の chown(), fchown(),
lchown() シ ス テ ム コ
ー ル は 、 16 ビ ッ
ト の ユ ー ザ ー ID
と グ ル ー プ ID だ
け に 対 応 し て
い た 。 そ の 後
、 32 ビ ッ ト の ID に
対 応 し た chown32(),
fchown32(), lchown32() が Linux 2.4
で 追 加 さ れ た
。 chown(), fchown(), and
lchown() の glibc の ラ ッ
パ ー 関 数 は 、
カ ー ネ ル の バ
ー ジ ョ ン に よ
る 違 い を 吸 収
し て い る 。
Linux の 2.1.81 よ り 前 の バ ー ジ ョ ン (特 に 2.1.46 以 前 ) で は 、 chown() は シ ン ボ リ ッ ク リ ン ク を 追 跡 し な い 。 Linux 2.1.81 以 降 で は chown() は シ ン ボ リ ッ ク リ ン ク を 追 跡 し 、 新 た な シ ス テ ム コ ー ル lchown() は シ ン ボ リ ッ ク リ ン ク を 追 跡 し な い 。 Linux 2.1.86 以 降 で は こ の 新 し い コ ー ル (古 い chown() と 全 く 同 じ 動 作 を 行 な う ) は 同 じ シ ス テ ム コ ー ル 番 号 を 持 ち chown() は 新 し く 導 入 さ れ た 番 号 を 持 つ 。
例
以 下 の プ ロ グ ラ ム は 、 二 つ 目 の コ マ ン ド ラ イ ン 引 き 数 で 指 定 さ れ た 名 前 の フ ァ イ ル の 所 有 者 を 、 一 つ 目 の コ マ ン ド ラ イ ン 引 き 数 で 指 定 さ れ た 値 に 変 更 す る 。 新 し い 所 有 者 は 、 数 字 の ユ ー ザ ー ID か ユ ー ザ ー 名 の い ず れ か で 指 定 で き る (ユ ー ザ ー 名 で 指 定 し た 場 合 に は 、 getpwnam(3) を 使 っ て シ ス テ ム の パ ス ワ ー ド フ ァ イ ル の 検 索 が 行 わ れ 、 ユ ー ザ ー ID へ の 変 換 が 行 わ れ る )。 プ ロ グ ラ ム の ソ ー ス
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
uid_t uid;
struct passwd *pwd;
char *endptr;
if (argc != 3
|| argv[1][0] == '\0') {
fprintf(stderr, "%s <owner> <file>\n",
argv[0]);
exit(EXIT_FAILURE); }
uid = strtol(argv[1], &endptr, 10); /* Allow a numeric string */
if (*endptr !=
'\0') { /* Was not pure numeric string */
pwd = getpwnam(argv[1]); /* Try getting UID for username */
if (pwd == NULL) {
perror("getpwnam");
exit(EXIT_FAILURE); }
uid = pwd−>pw_uid; }
if
(chown(argv[2], uid, −1) == −1) {
perror("chown");
exit(EXIT_FAILURE); }
exit(EXIT_SUCCESS); }
関 連 項 目
chmod(2), flock(2), path_resolution(7), symlink(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。