Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all bug

名前

       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 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

説明

       realpath()   は path として与えられた NULL 終端された文字列中の すべてのシンボリックリンクを展開し、 /./,
       /../ による参照や余分な '/'  を解決して、正規化された絶対パス名を生成する。  得られた絶対パス名は、最大で
       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 が NULL である。 (バージョン 2.3 より前の glibc では、 resolved_path が NULL の場合にもこのエ
              ラーが返される。)

       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

       (バグの章も参照のこと。)

       realpath() のプロトタイプ宣言は、 libc4 と  libc5  では  <unistd.h>  にあるが、それ以外の環境ではいずれも
       <stdlib.h> にある。

   GNU による拡張
       呼び出しが EACCESENOENT で失敗し resolved_path が NULL でない場合、読むことができない、もしくは存在し
       ない path のディレクトリ要素 (prefix) が resolved_path で返される。

バグ

       この関数の  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)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクトの説明とバグ報告
       に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。

                                                   2013-03-15                                        REALPATH(3)