名 前
readlink, readlinkat − シ ン ボ リ ッ ク リ ン ク の 値 を 読 む
書 式
#include <unistd.h>
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
#include
<fcntl.h> /* AT_* 定 数 の
定 義 */
#include <unistd.h>
ssize_t
readlinkat(int dirfd, const char
*pathname,
char *buf, size_t
bufsiz);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
readlink():
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED || _POSIX_C_SOURCE >= 200112L
readlinkat():
glibc 2.10 以 降 :
_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
glibc 2.10 よ り 前 :
_ATFILE_SOURCE
説 明
readlink() は pathname で 与 え ら れ た シ ン ボ リ ッ ク リ ン ク の 内 容 を buf バ ッ フ ァ ー へ 格 納 す る 、 buf の サ イ ズ は bufsiz で あ る 。 readlink() は ヌ ル バ イ ト を buf に 追 加 し な い 。 そ の 内 容 全 て を 格 納 す る の に バ ッ フ ァ ー が 小 さ 過 ぎ る 場 合 は 、 (bufsiz バ イ ト の 長 さ に ) 内 容 を 切 り 詰 め る 。
readlinkat()
readlinkat() シ ス テ ム
コ ー ル は readlink()
と 全 く 同 様 に
動 作 す る が 、
以 下 で 説 明 す
る 点 が 異 な る
。
pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス の 場 合 、 こ の パ ス 名 は フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が 参 照 す る デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る (readlink() に 相 対 パ ス 名 を 渡 し た 場 合 の よ う に 、 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス で は な い )。
pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス で 、 dirfd が 特 別 な 値 AT_FDCWD の 場 合 、 (readlink() と 同 様 に ) pathname は 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る 。
pathname で 指 定 さ れ た パ ス 名 が 絶 対 パ ス の 場 合 、 dirfd は 無 視 さ れ る 。
Linux 2.6.39 以 降 で は 、 pathname に 空 文 字 列 を 指 定 で き る 。 そ の 場 合 、 呼 び 出 し は dirfd が 参 照 す る シ ン ボ リ ッ ク リ ン ク に 対 し て 行 わ れ る (dirfd は フ ラ グ O_PATH と O_NOFOLLOW を 指 定 し た open(2) を 使 っ て 取 得 す べ き で あ る )。
readlinkat() の 必 要 性 に つ い て の 説 明 に つ い て は openat(2) を 参 照 。
返 り 値
成 功 す る と 、 こ れ ら の シ ス テ ム コ ー ル は buf に 格 納 さ れ た バ イ ト 数 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。
エ ラ ー
EACCES パ ス の デ ィ レ ク ト リ 部 分 に 検 索 許 可 が 与 え ら れ て い な い |
(path_resolution(7) も 参 照 す る こ と )。
EFAULT |
buf が プ ロ セ ス に 割 り 当 て ら れ た ア ド レ ス 空 間 の 外 を 指 し て い る 。 | ||
EINVAL |
bufsiz が 正 で な い 。 | ||
EINVAL |
指 定 し た フ ァ イ ル が シ ン ボ リ ッ ク リ ン ク で な い 。
EIO フ ァ イ ル シ ス テ ム の 読 み 込 み 中 に |
I/O エ ラ ー が 起 こ っ た 。 | |
ELOOP パ ス 名 に シ ン ボ リ ッ ク リ ン ク が 多 す |
ぎ る 。
ENAMETOOLONG パ ス 名 か パ ス 名 の 一 部 分 が 長 過 ぎ る 。 |
ENOENT そ の 名 前 の フ ァ イ ル が 存 在 し な い 。
ENOMEM 十 分 な カ ー ネ ル メ モ リ ー が な い 。 |
ENOTDIR パ ス の デ ィ レ ク ト リ 部 分 が デ ィ レ ク ト リ で な い 。
readlinkat() で は 以 下 の エ ラ ー も 発 生 す る 。
EBADF |
dirfd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で は な い 。 |
ENOTDIR
pathname が 相 対 パ ス で 、 dirfd が デ ィ レ ク ト リ 以 外 の フ ァ イ ル を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。
バ ー ジ ョ ン
readlinkat() は カ ー ネ ル 2.6.16 で Linux に 追 加 さ れ た 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は バ ー ジ ョ ン 2.4 で glibc に 追 加 さ れ た 。
準 拠
4.4BSD (readlink() は 4.2BSD で 初 め て 登 場 し た ), POSIX.1−2001, POSIX.1−2008.
readlinkat(): POSIX.1−2008.
注 意
バ ー ジ ョ ン 2.4 以 前 の glibc (バ ー ジ ョ ン 2.4 を 含 む ) で は 、 readlink() の 返 り 値 の 型 は int で 宣 言 さ れ て い た 。 現 在 で は 、 返 り 値 の 型 は ssize_t で あ る (返 り 値 ssize_t は POSIX.1−2001 で (新 た に ) 必 須 と な っ た )。 静 的 な 大 き さ の バ ッ フ ァ ー を 使 う と 、 シ ン ボ リ ッ ク リ ン ク の 内 容 を 格 納 す る の に 十 分 な 領 域 が な い 場 合 が あ る 。 バ ッ フ ァ ー に 必 要 な サ イ ズ は 、 そ の シ ン ボ リ ッ ク リ ン ク に 対 し て lstat(2) の 呼 び 出 し で 返 さ れ る stat.st_size の 値 か ら 取 得 で き る 。 た だ し 、 readlink() や readlinkat() が 書 き 込 ん だ バ イ ト 数 を チ ェ ッ ク し て 、 シ ン ボ リ ッ ク リ ン ク の サ イ ズ が 二 つ の 呼 び 出 し の 間 で 増 え て い な い こ と を 確 認 す べ き で あ る 。 readlink() や readlinkat() 用 の バ ッ フ ァ ー を 動 的 に 割 り 当 て る 方 法 で も 、 バ ッ フ ァ ー サ イ ズ と し て PATH_MAX を 使 用 す る 場 合 に 共 通 す る 移 植 性 の 問 題 を 解 決 す る こ と が で き る 。 な ぜ な ら 、 POSIX で は 、 シ ス テ ム が そ の よ う な 上 限 値 を 定 義 し て い な い 場 合 に は 、 PATH_MAX が 定 義 さ れ る こ と が 保 証 さ れ て い な い か ら で あ る 。
glibc
で の 注 意
readlinkat() が 利 用 で
き な い 古 い カ
ー ネ ル で は 、 glibc
ラ ッ パ ー 関 数
は readlink() を 使 用
す る モ ー ド に
フ ォ ー ル バ ッ
ク す る 。 pathname が
相 対 パ ス の 場
合 、 glibc は dirfd 引
き 数 に 対 応 す
る /proc/self/fd の シ ン
ボ リ ッ ク リ ン
ク に 基 づ い て
パ ス 名 を 構 成
す る 。
例
以 下 の プ ロ グ ラ ム は 、 readlink() が 必 要 と す る バ ッ フ ァ ー を 、 lstat() が 提 供 す る 情 報 に 基 づ い て 動 的 に 割 り 当 て る 。 ま た 、 両 方 の 呼 び 出 し 間 で 競 合 条 件 が な い こ と を 保 証 し て い る 。
#include
<sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
struct stat sb;
char *linkname;
ssize_t r;
if (argc != 2)
{
fprintf(stderr, "Usage: %s <pathname>\n",
argv[0]);
exit(EXIT_FAILURE); }
if
(lstat(argv[1], &sb) == −1) {
perror("lstat");
exit(EXIT_FAILURE); }
linkname =
malloc(sb.st_size + 1);
if (linkname == NULL) {
fprintf(stderr, "insufficient memory\n");
exit(EXIT_FAILURE); }
r = readlink(argv[1], linkname, sb.st_size + 1);
if (r ==
−1) {
perror("readlink");
exit(EXIT_FAILURE); }
if (r >
sb.st_size) {
fprintf(stderr, "symlink increased in size "
"between lstat() and readlink()\n");
exit(EXIT_FAILURE); }
linkname[r] = '\0';
printf("'%s' points to '%s'\n", argv[1], linkname);
exit(EXIT_SUCCESS); }
関 連 項 目
readlink(1), lstat(2), stat(2), symlink(2), realpath(3), path_resolution(7), symlink(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。