GLOB
Section: C Library Functions (3)
索引
jman
BSD mandoc
索引
名称
glob
globfree
索引
ライブラリ
Lb libc
- パターンに適合するパス名を生成
索引
書式
Fd #include <glob.h>
Ft int
Fn glob const char *pattern int flags int (*errfunc)(const char *, int) glob_t *pglob
Ft void
Fn globfree glob_t *pglob
索引
解説
Fn glob
関数は、シェルによって使用されるファイル名パターンの、適合規則を
実装するパス名ジェネレータです。
インクルードファイル
glob.h
は、少なくとも次に示すフィールドが含まれる
構造体タイプ
Fa glob_t
を定義します。
typedef struct {
int gl_pathc; /* これまでの合計パスカウント */
int gl_matchc; /* パターンに適合するパスカウント */
int gl_offs; /* gl_pathvの最初に予約されるフィールド */
int gl_flags; /* 返されるフラグ */
char **gl_pathv; /* パターンに適合するパスのリスト */
} glob_t;
引数
Fa pattern
は展開するパス名パターンのポインタです。
Fn glob
引数はその
パターンに対して、アクセス可能なすべてのパス名を突き合わせ
(マッチング)、
適合するパス名リストを作成します。パス名にアクセスするため
Fn glob
は、パス
の各構成要素
(最終要素を除く)
での検索許可と、特殊キャラクタ
`*'
,
`?'
または
`['
などを含む
Fa pattern
の、すべてのファイル名構成要素ディレクトリの読み
込み許可を要求します。
Fn glob
引数は、適合パス名の数を
Fa gl_pathc
フィールドに、パス名ポインタリスト
のポインタを
Fa gl_pathv
フィールドにそれぞれ保存します。最終パス名の後の
最初のポインタは
NULL
です。パターンに適合するパス名が皆無だった場合、
返される適合パスの数は 0 に設定されます。
Fa pglob
で示される構造体は呼び出し元が作成します。
Fa gl_pathv
で示されるメモリ
などほかの空間は、
Fn glob
関数が必要に応じて割り振ります。
引数
Fa flags
は、
Fn glob
の挙動を変更するために使用します。
Fa flags
の値は、
glob.h
で定義されている次に示す値のそれぞれビットごとの包括的
OR
です。
- GLOB_APPEND
-
生成されたパス名を、
Fn glob
に対する前の呼び出し (単数または複数) で生成されたパス名に追加します。
Fa gl_pathc
の値は、今回の呼び出しおよび前の呼び出し (単数または複数) での、
適合パス名の合計になります。前の呼び出し (単数または複数) によって
返されたパス名に、今回生成されたパス名が追加されますが、
マージ (併合) はされません。前の呼び出しと今回の呼び出しのあいだに、
呼び出し元は
GLOB_DOOFFS
フラグを変えてはいけません。同様に、
GLOB_DOOFFS
設定時の
Fa gl_offs
の値も変えてはいけません。
(もちろん)
Fa pglob
に影響する
Fn globfree
の呼び出しも行ってはなりません。
- GLOB_DOOFFS
-
Fa gl_offs
フィールドを有効にします。このフラグを設定すると、
Fa gl_pathv
フィールドの前に付加する
NULL
ポインタの数が、
Fa gl_offs
によって指定できます。言い換えれば
Fa gl_pathv
が
Fa gl_offs
の
NULL
ポインタを示し、その後に
Fa gl_pathc
パス名ポインタが続き、さらにその後に
NULL
ポインタが続きます。
- GLOB_ERR
-
オープンまたは読み込みできないディレクトリに出会った場合、
Fn glob
をリターンさせます。通常は、
Fn glob
が適合パス名検索を続行します。
- GLOB_MARK
-
Fa pattern
に適合するディレクトリの各パス名に、スラッシュを
付加します。
- GLOB_NOCHECK
-
Fa pattern
に適合するパス名が皆無だった場合、
Fn glob
は
Fa pattern
だけで構成されるリストを返します。パス名の合計数は 1 に、適合
パス名の数は 0 に設定されます。
GLOB_QUOTE
が設定されていれば、返されるパターンにその効果が反映されます。
- GLOB_NOSORT
-
デフォルトでパス名は
ASCII
昇順にソートされます。このフラグはそうしたソート、すなわち高速化
Fn glob
機能を妨げます。
次に示す値も
Fa flags
に含まれることはありますが、これらは
St -p1003.2
の非標準拡張です。
- GLOB_ALTDIRFUNC
-
pglob
構造体の次に示す追加フィールドを、ディレクトリのオープン、読み込み、
クローズおよび、それらディレクトリで見付かったパス名のステータス情報取得に
使用する、代替 glob 関数で初期化します。
void *(*gl_opendir)(const char * name);
struct dirent *(*gl_readdir)(void *);
void (*gl_closedir)(void *);
int (*gl_lstat)(const char *name, struct stat *st);
int (*gl_stat)(const char *name, struct stat *st);
テープに保存されたディレクトリから、
restore(8)
のようなプログラムによって
グロッビング (ファイル名展開) できるように、
この拡張が用意されています。
- GLOB_BRACE
-
csh(1)
のような
`{pat,pat,...}'
ストリングを展開するために、
パターンストリングを前処理します。パターン
`{}'
は歴史的理由 (および
find(1)
パターンの入力を容易にするために、
csh(1)
が同じことをするという理由)
から、未展開のまま残されます。
- GLOB_MAGCHAR
-
パターンに
Fn glob
用キャラクタが含まれていると、
Fn glob
関数によってこのフラグが設定されます。詳細は
Fa gl_matchc
構造体メンバの、用法についての説明を参照してください。
- GLOB_NOMAGIC
-
GLOB_NOCHECK
と同じですが、特殊キャラクタ ``*'', ``?''
または ``['' がなにも含まれていない場合に、このフラグはただ
Fa pattern
を後に付加するだけです。
GLOB_NOMAGIC
は、歴史的な
csh(1)
によるグロッビング (ファイル名展開) 挙動の実装を単純化するために
用意されています。その他の目的ではたぶん、
どんな場合も使用すべきではありません。
- GLOB_QUOTE
-
バックスラッシュ
(`\'
)
キャラクタを引用符として
有効にします。パターンにバックスラッシュとそれに続くキャラクタがある場合、
そのキャラクタを特別に解釈することなくそのままのキャラクタとして
置換します。
- GLOB_TILDE
-
`~'
で始まるパターンを、ユーザ名のホームディレクトリに
展開します。
- GLOB_LIMIT
-
返されるパス名の合計数を、
Fa gl_matchc
で指定される数に制限します (デフォルトは
ARG_MAX
です。
非常に大きな数のマッチに展開される
`*/../*/..'
のような長いストリングのパターンによって、
サービス拒否攻撃に無理矢理されてしまい得るプログラムに対し、
本オプションを設定すべきです。
検索においてオープンまたは読み込みできないディレクトリに出会った場合、
Fa errfunc
が
NULL
でなければ、
Fn glob
は
Fa (*errfunc)(path, errno)
を呼び出します。
これは非直観的な場合があります。
`*/Makefile'
のようなパターンでは、
`foo'
が
ディレクトリでなくても
`foo/Makefile'
の
stat(2)
が試みられて、
Fa errfunc
を
呼び出す結果になるからです。
Er ENOENT
および
Er ENOTDIR
のテストによって、
エラールーチンはこの動作を抑制することができますが、
それでもなおこうした場合には
GLOB_ERR
フラグがただちに
Fn glob
をリターンさせます。
Fa errfunc
から非 0 が返ると
Fn glob
は操作を停止して、すでに適合したすべての
パスを反映するために、
Fa gl_pathc
および
Fa gl_pathv
を設定した後で
GLOB_ABEND
を返します。
エラーが起こり
Fa flags
に
GLOB_ERR
が設定されていれば、
Fa errfunc
を呼び出した場合その戻り値に関係なく、同じことが起こります。
GLOB_ERR
を未設定で、
Fa errfunc
が
NULL
かまたは
Fa errfunc
が 0 を返した場合、エラーは無視されます。
Fn globfree
関数は、前の
Fn glob
呼び出しによって
Fa pglob
と
関連した、すべての空間を解放します。
索引
戻り値
無事に完了した場合
Fn glob
は 0 を返します。さらに、
Fa pglob
の各フィールド
には次に示す値が含まれます。
- Fa gl_pathc
-
これまでの適合パス名の合計数が含まれます。
GLOB_APPEND
が指定されている場合は、前の
Fn glob
起動で得られたほかの適合パス名の数も、
この合計には含れます。
- Fa gl_matchc
-
現在の
Fn glob
起動によって得られた適合パス名の数が
含まれます。
- Fa gl_flags
-
Fa pattern
に特殊キャラクタ ``*'', ``?'', または ``['' のどれかが含まれている場合は、
GLOB_MAGCHAR
が設定したビットを持つ
Fa flags
パラメータの
コピーが含まれます。特殊キャラクタが含まれていない場合、このフィールドの
内容はクリアされます。
- Fa gl_pathv
-
適合パス名の
NULL
で終わるリストのポインタが含まれます。
ただし、もし
Fa gl_pathc
が 0 ならば、
Fa gl_pathv
の内容は定義されません。
エラーのため終了すると
Fn glob
は
errno
を設定して、次に示す非 0 定数の
1 つを返します。これらの定数は、インクルードファイル
Aq Pa glob.h
で定義されます。
- GLOB_NOSPACE
-
メモリ割り当ての試みが失敗しました。
もしくは
Fa errno
が 0 の場合、
GLOB_LIMIT
が flags に指定され、
Fa pglob->gl_matchc
個またはそれ以上のパターンがマッチしました。
- GLOB_ABEND
-
エラーが発生した上に
GLOB_ERR
が設定されていたか、または
Fa *errfunc
が非 0 を返したので、
Fn glob
はパス名の走査を停止しました。
引数
Fa pglob->gl_pathc
および
Fa pglob->gl_pathv
は依然として、上で
指定のとおりに設定されたままです。
索引
例
`ls'
-l *.c *.h
の大体の等価は、次に示すコードで取得することができます。
glob_t g;
g.gl_offs = 2;
glob("*.c", GLOB_DOOFFS, NULL, &g);
glob("*.h", GLOB_DOOFFS | GLOB_APPEND, NULL, &g);
g.gl_pathv[0] = "ls";
g.gl_pathv[1] = "-l";
execvp("ls", g.gl_pathv);
索引
関連項目
sh(1),
fnmatch(3),
regexp(3)
索引
規格
Fn glob
関数には次に示す例外を除いて、
St -p1003.2
との互換性が期待されています。例外はフラグ
GLOB_ALTDIRFUNC
GLOB_BRACE
GLOB_LIMIT
GLOB_MAGCHAR
GLOB_NOMAGIC
GLOB_QUOTE
GLOB_TILDE
それにフィールド
Fa gl_matchc
および
Fa gl_flags
などを、厳正な
POSIX
適合を争うアプリケーションでは使用すべきではないということです。
索引
歴史
Fn glob
および
Fn globfree
関数は、
BSD 4.4
ではじめて登場しました。
索引
バグ
MAXPATHLEN
よりも長いパターンは、無検査エラーの原因となる可能性があります。
Fn glob
引数は失敗して、ライブラリルーチン
stat(2),
closedir(3),
opendir(3),
readdir(3),
malloc(3),
および
free(3)
用に指定したエラーのどれかに、errno を設定することがあります。
索引
Index
- 名称
-
- ライブラリ
-
- 書式
-
- 解説
-
- 戻り値
-
- 例
-
- 関連項目
-
- 規格
-
- 歴史
-
- バグ
-
Time: 07:06:53 GMT, January 12, 2009