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
pathresolved_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_MAXNAME_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