X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=release%2Fman2%2Freadlink.2;h=4f265141fa9d34a25bdd5d187a437e26e3a4d31b;hb=a3ebf7864325562d1ccf826f4ffa4a755d84cdf0;hp=cf7acb85c6ca50a140c156074022c782598be1f9;hpb=633a2252e0be3c867dce264a180a89ce8181d36f;p=linuxjm%2FLDP_man-pages.git diff --git a/release/man2/readlink.2 b/release/man2/readlink.2 index cf7acb85..4f265141 100644 --- a/release/man2/readlink.2 +++ b/release/man2/readlink.2 @@ -1,4 +1,5 @@ .\" Copyright (c) 1983, 1991 The Regents of the University of California. +.\" And Copyright (C) 2011 Guillem Jover .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -31,126 +32,157 @@ .\" .\" @(#)readlink.2 6.8 (Berkeley) 3/10/91 .\" -.\" Modified Sat Jul 24 00:10:21 1993 by Rik Faith +.\" Modified Sat Jul 24 00:10:21 1993 by Rik Faith (faith@cs.unc.edu) .\" Modified Tue Jul 9 23:55:17 1996 by aeb .\" Modified Fri Jan 24 00:26:00 1997 by aeb +.\" 2011-09-20, Guillem Jover : +.\" Added text on dynamically allocating buffer + example program .\" -.\" Japanese Version Copyright (c) 1997 HANATAKA Shinya -.\" all rights reserved. -.\" Translated 1997-12-12, HANATAKA Shinya -.\" Updated 2005-02-10, Yuichi SATO -.\" Updated 2006-07-19, Akihiro MOTOKI , LDP v2.36 -.\" Updated 2008-08-06, Akihiro MOTOKI, LDP v3.05 +.\"******************************************************************* .\" -.\"WORD: symbolic link ¥·¥ó¥Ü¥ê¥Ã¥¯¡¦¥ê¥ó¥¯ -.\"WORD: buffer ¥Ð¥Ã¥Õ¥¡¡¼ -.\"WORD: NUL ¥Ì¥ëʸ»ú -.\"WORD: global variable ¥°¥í¡¼¥Ð¥ëÊÑ¿ô -.\"WORD: directory ¥Ç¥£¥ì¥¯¥È¥ê +.\" This file was generated with po4a. Translate the source file. .\" -.TH READLINK 2 2007-07-26 "Linux" "Linux Programmer's Manual" -.SH ̾Á° -readlink \- ¥·¥ó¥Ü¥ê¥Ã¥¯¡¦¥ê¥ó¥¯¤ÎÃͤòÆɤà -.SH ½ñ¼° -.B #include +.\"******************************************************************* +.TH READLINK 2 2011\-09\-20 Linux "Linux Programmer's Manual" +.SH 名前 +readlink \- シンボリックリンクの値を読む +.SH 書式 +\fB#include \fP .sp -.BI "ssize_t readlink(const char *" path ", char *" buf ", size_t " bufsiz ); +\fBssize_t readlink(const char *\fP\fIpath\fP\fB, char *\fP\fIbuf\fP\fB, size_t +\fP\fIbufsiz\fP\fB);\fP .sp .in -4n -glibc ¸þ¤±¤Îµ¡Ç½¸¡ºº¥Þ¥¯¥í¤ÎÍ×·ï -.RB ( feature_test_macros (7) -»²¾È): +glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7) 参照): .in .sp .ad l -.BR readlink (): -_BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500 || _POSIX_C_SOURCE\ >=\ 200112L +\fBreadlink\fP(): +.RS 4 +_BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500 || _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED || _POSIX_C_SOURCE\ >=\ 200112L +.RE .ad b -.SH ÀâÌÀ -.BR readlink () -¤Ï -.I path -¤ÇÍ¿¤¨¤é¤ì¤¿¥·¥ó¥Ü¥ê¥Ã¥¯¡¦¥ê¥ó¥¯¤ÎÆâÍƤò -.I buf -¥Ð¥Ã¥Õ¥¡¡¼¤Ø³ÊǼ¤¹¤ë¡¢ -.I buf -¤Î¥µ¥¤¥º¤Ï -.I bufsiz -¤Ç¤¢¤ë¡£ -.BR readlink () -¤Ï NULL ¥Ð¥¤¥È¤ò -.I buf -¤ËÄɲ䷤ʤ¤¡£ -¤½¤ÎÆâÍÆÁ´¤Æ¤ò³ÊǼ¤¹¤ë¤Î¤Ë¥Ð¥Ã¥Õ¥¡¡¼¤¬¾®¤µ²á¤®¤ë¾ì¹ç¤Ï¡¢ -.RI ( bufsiz -¥Ð¥¤¥È¤ÎŤµ¤Ë) ÆâÍƤòÀÚ¤êµÍ¤á¤ë¡£ -.SH ÊÖ¤êÃÍ -À®¸ù¤¹¤ë¤È¡¢ -.BR readlink () -¤Ï -.I buf -¤Ë³ÊǼ¤µ¤ì¤¿¥Ð¥¤¥È¿ô¤òÊÖ¤¹¡£ -¥¨¥é¡¼¤Î¾ì¹ç¡¢\-1 ¤òÊÖ¤·¡¢ -.I errno -¤Ë¥¨¥é¡¼¤ò¼¨¤¹ÃͤòÀßÄꤹ¤ë¡£ -.SH ¥¨¥é¡¼ -.TP -.B EACCES -¥Ñ¥¹¤Î¥Ç¥£¥ì¥¯¥È¥êÉôʬ¤Ë¸¡º÷µö²Ä¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤Ê¤¤ -.RB ( path_resolution (7) -¤â»²¾È¤¹¤ë¤³¤È)¡£ -.TP -.B EFAULT -.I buf -¤¬¥×¥í¥»¥¹¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥¢¥É¥ì¥¹¶õ´Ö¤Î³°¤ò»Ø¤·¤Æ¤¤¤ë¡£ -.TP -.B EINVAL -.I bufsiz -¤¬Àµ¤Ç¤Ê¤¤¡£ +.SH 説明 +\fBreadlink\fP() は \fIpath\fP で与えられたシンボリックリンクの内容を \fIbuf\fP バッファーへ格納する、 \fIbuf\fP のサイズは +\fIbufsiz\fP である。 \fBreadlink\fP() は NULL バイトを \fIbuf\fP に追加しない。 +その内容全てを格納するのにバッファーが小さ過ぎる場合は、 (\fIbufsiz\fP バイトの長さに) 内容を切り詰める。 +.SH 返り値 +成功すると、 \fBreadlink\fP() は \fIbuf\fP に格納されたバイト数を返す。 エラーの場合、\-1 を返し、 \fIerrno\fP +にエラーを示す値を設定する。 +.SH エラー +.TP +\fBEACCES\fP +パスのディレクトリ部分に検索許可が与えられていない (\fBpath_resolution\fP(7) も参照すること)。 +.TP +\fBEFAULT\fP +\fIbuf\fP がプロセスに割り当てられたアドレス空間の外を指している。 +.TP +\fBEINVAL\fP .\" At the glibc level, bufsiz is unsigned, so this error can only occur .\" if bufsiz==0. However, the in the kernel syscall, bufsiz is signed, .\" and this error can also occur if bufsiz < 0. .\" See: http://thread.gmane.org/gmane.linux.man/380 .\" Subject: [patch 0/3] [RFC] kernel/glibc mismatch of "readlink" syscall? -.TP -.B EINVAL -»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¤¬¥·¥ó¥Ü¥ê¥Ã¥¯¡¦¥ê¥ó¥¯¤Ç¤Ê¤¤¡£ -.TP -.B EIO -¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤ÎÆɤ߹þ¤ßÃæ¤Ë I/O ¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿¡£ -.TP -.B ELOOP -¥Ñ¥¹Ì¾¤Ë¥·¥ó¥Ü¥ê¥Ã¥¯¡¦¥ê¥ó¥¯¤¬Â¿¤¹¤®¤ë¡£ -.TP -.B ENAMETOOLONG -¥Ñ¥¹Ì¾¤«¥Ñ¥¹Ì¾¤Î°ìÉôʬ¤¬Ä¹²á¤®¤ë¡£ -.TP -.B ENOENT -¤½¤Î̾Á°¤Î¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¡£ -.TP -.B ENOMEM -¥«¡¼¥Í¥ë¤Ë½½Ê¬¤Ê¥á¥â¥ê¤¬¤Ê¤¤¡£ -.TP -.B ENOTDIR -¥Ñ¥¹¤Î¥Ç¥£¥ì¥¯¥È¥êÉôʬ¤¬¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤Ê¤¤¡£ -.SH ½àµò -4.4BSD -.RB ( readlink () -´Ø¿ô¥³¡¼¥ë¤Ï 4.2BSD ¤Ç¸½¤ï¤ì¤¿), POSIX.1-2001. -.SH Ãí°Õ -¥Ð¡¼¥¸¥ç¥ó 2.4 °ÊÁ°¤Î glibc (¥Ð¡¼¥¸¥ç¥ó 2.4 ¤ò´Þ¤à) ¤Ç¤Ï¡¢ -.BR readlink () -¤ÎÊÖ¤êÃͤη¿¤Ï -.I int -¤ÇÀë¸À¤µ¤ì¤Æ¤¤¤¿¡£¸½ºß¤Ç¤Ï¡¢ÊÖ¤êÃͤη¿¤Ï -.I ssize_t -¤Ç¤¢¤ë (ÊÖ¤êÃÍ -.I ssize_t -¤Ï POSIX.1-2001 ¤Ç (¿·¤¿¤Ë) ɬ¿Ü¤È¤Ê¤Ã¤¿)¡£ -.SH ´ØÏ¢¹àÌÜ -.BR lstat (2), -.BR readlinkat (2), -.BR stat (2), -.BR symlink (2), -.BR path_resolution (7), -.BR symlink (7) +\fIbufsiz\fP が正でない。 +.TP +\fBEINVAL\fP +指定したファイルがシンボリックリンクでない。 +.TP +\fBEIO\fP +ファイルシステムの読み込み中に I/O エラーが起こった。 +.TP +\fBELOOP\fP +パス名にシンボリックリンクが多すぎる。 +.TP +\fBENAMETOOLONG\fP +パス名かパス名の一部分が長過ぎる。 +.TP +\fBENOENT\fP +その名前のファイルが存在しない。 +.TP +\fBENOMEM\fP +十分なカーネルメモリーがない。 +.TP +\fBENOTDIR\fP +パスのディレクトリ部分がディレクトリでない。 +.SH 準拠 +4.4BSD (\fBreadlink\fP() は 4.2BSD で初めて登場した), POSIX.1\-2001. +.SH 注意 +バージョン 2.4 以前の glibc (バージョン 2.4 を含む) では、 \fBreadlink\fP() の返り値の型は \fIint\fP +で宣言されていた。現在では、返り値の型は \fIssize_t\fP である (返り値 \fIssize_t\fP は POSIX.1\-2001 で (新たに) +必須となった)。 + +静的な大きさのバッファを使うと、シンボリックリンクの内容を +格納するのに十分な領域がない場合がある。 +バッファに必要なサイズは、そのシンボリックリンクに対して \fBlstat\fP(2) +の呼び出しで返される \fIstat.st_size\fP の値から取得できる。 +ただし、 \fBreadlink\fP() が書き込んだバイト数をチェックして、 +シンボリックリンクのサイズが \fBlstat\fP(2) と \fBreadlink\fP() の呼び出し +の間で増えていないことを確認すべきである。 +\fBreadlink\fP() 用のバッファを動的に割り当てる方法でも、 +バッファサイズとして \fIPATH_MAX\fP を使用する場合に共通する移植性の +問題を解決することができる。なぜなら、POSIX では、 +システムがそのような上限値を定義していない場合には、 +\fIPATH_MAX\fP が定義されることが保証されていないからである。 +.SH 例 +以下のプログラムは、 \fBreadlink\fP() が必要とするバッファを、 +\fBlstat\fP() が提供する情報に基づいて動的に割り当てる。 +また、両方の呼び出し間で競合条件がないことを保証している。 +.nf + +#include +#include +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + struct stat sb; + char *linkname; + ssize_t r; + + if (argc != 2) { + fprintf(stderr, "Usage: %s \en", 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\en"); + exit(EXIT_FAILURE); + } + + r = readlink(argv[1], linkname, sb.st_size + 1); + + if (r < 0) { + perror("lstat"); + exit(EXIT_FAILURE); + } + + if (r > sb.st_size) { + fprintf(stderr, "symlink increased in size " + "between lstat() and readlink()\en"); + exit(EXIT_FAILURE); + } + + linkname[sb.st_size] = \(aq\e0\(aq; + + printf("\(aq%s\(aq points to \(aq%s\(aq\en", argv[1], linkname); + + exit(EXIT_SUCCESS); +} +.fi +.SH 関連項目 +\fBreadlink\fP(1), \fBlstat\fP(2), \fBreadlinkat\fP(2), \fBstat\fP(2), \fBsymlink\fP(2), +\fBpath_resolution\fP(7), \fBsymlink\fP(7) +.SH この文書について +この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.41 の一部 +である。プロジェクトの説明とバグ報告に関する情報は +http://www.kernel.org/doc/man\-pages/ に書かれている。