EN JA
MKTEMP(3)
MKTEMP(3) FreeBSD Library Functions Manual MKTEMP(3)

名称

mktemp(ユニークな) 一時ファイル名を作成する

ライブラリ

Standard C Library (libc, -lc)

書式

#include < stdlib.h>

char *
mktemp( char *template);

int
mkstemp( char *template);

int
mkostemp( char *template, int oflags);

int
mkostemps( char *template, int suffixlen, int oflags);

char *
mkdtemp( char *template);

#include < unistd.h>

int
mkstemps( char *template, int suffixlen);

解説

mktemp() 関数は、与えられたファイル名のテンプレートを取り、ファイル名を作成するためにその一部分を上書きします。このファイル名は、関数の呼び出しの時に存在しないことが保証され、アプリケーションでの使用に適しています。テンプレートは、いくつかの数の‘ X’を追加した任意のファイル名です、例えば、 /tmp/temp.XXXXXX。後続する‘ X’は、ユニークな英数字の組み合わせに置き換えられます。 mktemp() が返すことができるユニークなファイル名の数は、提供される‘ X’の数に依存します。 6 つの‘ X’は、 mktemp() が、利用可能な一時ファイル名の 56800235584 (62 ** 6) の 1 つを選択する結果となります。

mkstemp() 関数は、テンプレートに同じ置換を行ない、モード 0600 でテンプレートファイルを作成し、読み込みと書き込みのためにオープンされたファイル記述子を返します。これは、ファイルの存在をテストすることと、使用のためにオープンすることの間の競合を回避します。

mkostemp() 関数は、 mkstemp() に似ていますが、追加の open(2) フラグ ( < fcntl.h> に定義された) を指定することができます。許可されたフラグは、 O_APPEND, O_DIRECT, O_SHLOCK, O_EXLOCK, O_SYNCO_CLOEXEC です。

mkstemps() と mkostemps() 関数は、テンプレートに接尾辞が存在できることを除いて、それぞれ mkstemp() と mkostemp() と同様に動作します。テンプレートは、形式 /tmp/tmpXXXXXXsuffix であるべきです。 mkstemps() と mkostemps() 関数は、接尾辞の文字列の長さを伝えます。

mkdtemp() 関数は、 mktemp() のようにテンプレートに同じ置換を行ない、モード 0700で、テンプレートのディレクトリを作成します。

戻り値

mktemp() と mkdtemp() 関数は、成功すると、テンプレートへのポインタを返し、失敗すると、 NULL を返します。 mkstemp(), mkostemp(), mkstemps() と mkostemps() 関数は、適切なファイルを作成することができないなら、-1 を返します。どちらかの呼び出しが失敗するなら、エラーコードがグローバル変数 errno に設定されます。

エラー

mkstemp(), mkostemp(), mkstemps(), mkostemps() と mkdtemp() 関数は、次の値の 1 つを errno に設定します。
[ ENOTDIR]
テンプレートのパス名の部分が、存在するディレクトリではありません。

また、 mkostemp() と mkostemps() 関数は、 errno に次の値を設定します:

[ EINVAL]
oflags 引数が無効です。

また、 mkstemp(), mkostemp(), mkstemps(), mkostemps() と mkdtemp() 関数は、 stat(2) 関数で明記されたあらゆる値に errno を設定するかもしれません。

また、 mkstemp(), mkostemp(), mkstemps() と mkostemps() 関数は、 open(2) 関数で明記されたあらゆる値に errno を設定するかもしれません。

mkdtemp() 関数は、 mkdir(2) 関数で明記されたあらゆる値に errno を設定するかもしれません。

コアダンプの結果となる代表的なプログラムは、プログラマが、 mktemp(), mkstemp(), mkstemps() または mkdtemp() に読み込み専用の文字列を渡すことです。これは、 ISO/IEC 9899:1990 (“ISO C90”) コンパイラが普及する前に開発されたプログラムでよく見られます。例えば、引数“/tmp/tempfile.XXXXXX”を付けて mkstemp() を呼び出すことは、与えられた文字列定数を修正しようと試みる mkstemp() のためにコアダンプの結果となります。

また、 mkdtemp(), mkstemp() と mktemp() 関数プロトタイプは、 < unistd.h> で利用できます。

規格

mkstemp() と mkdtemp() 関数は、 IEEE Std 1003.1-2008 (“POSIX.1”) に適合するはずです。 mktemp() 関数は、 IEEE Std 1003.1-2001 (“POSIX.1”) に適合するはずで、 IEEE Std 1003.1-2008 (“POSIX.1”) では明記されていません。 mkostemp(), mkstemps() と mkostemps() 関数は、どんな規格にも適合しません。

歴史

mktemp() 関数は、 Version 7 AT&T UNIX で登場しました。 mkstemp() 関数は、 4.4BSD で登場しました。 mkdtemp() 関数は、 OpenBSD 2.2 ではじめて登場し、その後 FreeBSD 3.2 で登場しました。 mkstemps() 関数は、 OpenBSD 2.4 ではじめて登場し、その後 FreeBSD 3.4 で登場しました。 mkostemp() と mkostemps() 関数は、 FreeBSD 10.0 で登場しました。

バグ

この関数ファミリは、推測することができるファイル名を生成しますが、多くの‘ X’ができるだけ一時的ファイル名の数を増加させるために使用されるとき、危険は、最小化されます。これは、セキュリティの観点で特に危険な ( mktemp() 関数呼び出し中に) ファイルの存在をテストし、 (後でユーザアプリケーションで) 使用するために、それをオープンしている間に mktemp() で競合を起こします。利用可能なときにはいつでも、競合条件がないので、 mkstemp() または mkostemp() が代わりに使用されるべきです。 mkstemp() が使用できないなら、 mktemp() によって作成されたファイル名は、 open(2) への O_EXCL フラグを使用して作成されるべきで、呼び出しの返り状態は、失敗していないかテストすべきです。これは、万一、攻撃者がその内容を操作するか、または読み込む意図で既にファイルを作成した場合に、プログラムが盲目的に継続しないことを保証します。
August 8, 2013 FreeBSD