REALPATH
Section: Linux Programmer's Manual (3)
Updated: 2009-02-23
Index
JM Home Page
roff page
名前
realpath - 正規化された絶対パス名を返す
書式
#include <limits.h>
#include <stdlib.h>
char *realpath(const char *path, char *resolved_path);
glibc 向けの機能検査マクロの要件
(feature_test_macros(7)
参照):
realpath():
_BSD_SOURCE || _XOPEN_SOURCE >= 500
説明
realpath()
は
path
として与えられた NULL 終端された文字列中の
すべてのシンボリックリンクを展開し、
/./, /../
による参照や余分な aq/aq
を解決して、正規化された絶対パス名を生成する。
得られた絶対パス名は、最大で
PATH_MAX
バイトの NULL 終端された文字列として、
resolved_path
により参照されるバッファに格納される。
結果として返るパスの中には、シンボリックリンクや
/./, /../
といった要素は含まれない。
resolved_path
に NULL が指定されると、
realpath()
は
malloc(3)
を使って解決したパス名を保持するためのバッファを
最大で
PATH_MAX
バイトまで割り当て、このバッファへのポインタを返す。
呼び出し元は、
free(3)
を使ってこのバッファを解放すべきである。
返り値
エラーがなかった場合、
realpath()
は
resolved_path
へのポインターを返す。
それ以外の場合は、ヌル (NULL) ポインターが返り、配列
resolved_path
の内容は不定となり、
errno
にエラーの内容を示す値がセットされる。
エラー
- EACCES
-
パスのディレクトリ部分に、読み出し許可または検索許可が与えられていない。
- EINVAL
-
path
か
resolved_path
のいずれかが NULL である。
(libc5 では、このような場合 segfault を起こすだけであろう)
但し、下記の「注意」の節を参照のこと。
- EIO
-
ファイルシステムを読むときに、I/Oエラーが起こった。
- ELOOP
-
パス名の変換にあたり、解決すべきシンボリック・リンクの数が多過ぎた。
- ENAMETOOLONG
-
パス名の一要素の文字数が
NAME_MAX
を越えている、またはパス名全体の文字数が
PATH_MAX
を越えている。
- ENOENT
-
指定されたファイルが存在しない。
- ENOTDIR
-
パスのディレクトリ要素が、ディレクトリでない。
バージョン
この関数が Linux に登場したのは libc 4.5.21 である。
準拠
4.4BSD, POSIX.1-2001.
POSIX.1-2001 では
resolved_path
が NULL の場合の動作は実装に依存するとしている。
POSIX.1-2008 では、このマニュアルページに書かれている動作が規定されている。
注意
4.4BSD と Solaris では、パス名の長さの上限は
(<sys/param.h> の中にある)
MAXPATHLEN
である。SUSv2 では
PATH_MAX
と
NAME_MAX
が規定されており、
これらは <limits.h> で定義されているか、
pathconf(3)
関数から得られる。以下のようなソースコードになっていることが多い。
#ifdef PATH_MAX
path_max = PATH_MAX;
#else
path_max = pathconf(path, _PC_PATH_MAX);
if (path_max <= 0)
path_max = 4096;
#endif
(バグの章も参照のこと。)
4.4BSD、Linux、SUSv2 では、返り値は常に絶対パス名である。
Solaris では、
引き数
path
が相対パスの場合、返り値が相対パスになることがある。
realpath()
のプロトタイプ宣言は、
libc4 と libc5 では <unistd.h> にあるが、
それ以外の環境ではいずれも <stdlib.h> にある。
バグ
この関数の POSIX.1-2001 版は、設計段階から問題がある。
出力バッファ
resolved_path
の適切なサイズを決定することができないからである。
POSIX.1-2001 ではバッファ・サイズとして
PATH_MAX
は十分だとされているが、
PATH_MAX
は定義済の定数である必要はなく、
pathconf(3)
を使って得られる値であってもよいことになっている。
pathconf(3)
からバッファ・サイズを取得したとしても必ずしも十分ではない。
なぜなら、POSIX で警告されているように、
pathconf(3)
の返り値が大き過ぎて適切にメモリを確保することができない
かもしれない一方で、
pathconf(3)
は
PATH_MAX
に制限がないことを示す -1 を返すかもしれないからである。
resolved_path == NULL
の機能を使うと、この設計上の問題を回避することができる。
この機能は POSIX.1-2001 では標準化されていないが、
POSIX.1-2008 では標準化されている。
libc4 と libc5 の実装はバッファ・オーバーフローの可能性を持っている
(libc-5.4.13 で修正されたが)。したがって、
mount(8)
のような set-user-ID されるプログラムでは、
この関数相当の関数を自前で持つ必要がある。
関連項目
readlink(2),
canonicalize_file_name(3),
getcwd(3),
pathconf(3),
sysconf(3)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- バージョン
-
- 準拠
-
- 注意
-
- バグ
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 03:26:52 GMT, April 25, 2010