.\" Copyright (c) 1989, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)mktemp.3 8.1 (Berkeley) 6/4/93 .\" %FreeBSD: src/lib/libc/stdio/mktemp.3,v 1.11.2.6 2001/12/14 18:33:57 ru Exp % .\" $FreeBSD$ .\" .Dd February 11, 1998 .Dt MKTEMP 3 .Os .Sh 名称 .Nm mktemp .Nd 一意な一時ファイル名を作成 .Sh ライブラリ .Lb libc .Sh 書式 .In unistd.h .Ft char * .Fn mktemp "char *template" .Ft int .Fn mkstemp "char *template" .Ft int .Fn mkstemps "char *template" "int suffixlen" .Ft char * .Fn mkdtemp "char *template" .Sh 解説 .Fn mktemp 関数は、与えられたファイル名テンプレートの一部を書き換えて ファイル名を作成します。 このファイル名は、関数が呼ばれた時に存在していないことが保証されており、 アプリケーションでの使用に適しています。 テンプレートとしては、 .Pa /tmp/temp.XXXXXX のように、任意のファイル名に数桁の文字 .Ql X が付いているものが使用されます。 後ろに続く .Ql X は、英数字の一意の組合せに置き換えられます。 .Fn mktemp が戻す一意的なファイル名の数は、 .Ql X の数によって決まります。 .Ql X が 6 桁である場合、56800235584 (62 ** 6) 通りの可能な一時ファイル名から .Fn mktemp によって一つ選ばれます。 .Pp .Fn mkstemp 関数は、テンプレートを同じように置き換え、 モード 0600 でテンプレートファイルを作成し、 読み書き用としてオープンしたファイル記述子を返します。 こうすることにより、ファイルの存在を確認することと 使用するためにオープンすることとの間の競合状態を避けられます。 .Pp .Fn mkstemps は、テンプレートにサフィックスを含めることができることを除いて .Fn mkstemp と同様に動作します。 テンプレートは、 .Pa /tmp/tmpXXXXXXsuffix という形式である必要があります。 .Fn mkstemps は、サフィックス文字列の長さを必要とします。 .Pp .Fn mkdtemp 関数は、テンプレートを .Xr mktemp 3 と同じように置き換え、 モード 0700 でテンプレートディレクトリを作成します。 .Sh 戻り値 成功した場合、 .Fn mktemp 関数と .Fn mkdtemp 関数は、テンプレートへのポインタを返し、失敗した場合 .Dv NULL を返します。 .Fn mkstemp 関数と .Fn mkstemps 関数は、適切なファイルを作成できない場合に \-1 を返します。 どの関数呼出しでもエラーが発生すると、エラーコードがグローバル変数 .Va errno に書き込まれます。 .Sh エラー .Fn mkstemp , .Fn mkstemps , .Fn mkdtemp 関数は、以下の値のうち 1 つを .Va errno に設定します。 .Bl -tag -width Er .It Bq Er ENOTDIR テンプレートのパス名部分が、存在するディレクトリではありません。 .El .Pp .Fn mkstemp , .Fn mkstemps , .Fn mkdtemp 関数は、 .Xr stat 2 関数で規定されるどの値も .Va errno に設定する可能性があります。 .Pp .Fn mkstemp 関数と .Fn mkstemps 関数は、 .Xr open 2 関数で規定されるどの値も .Va errno に設定する可能性があります。 .Pp .Fn mkdtemp 関数は、 .Xr mkdir 2 関数で規定されるどの値も .Va errno に設定する可能性があります。 .Sh 注 コアダンプを引き起こす問題としてよくあるものは、プログラマが、 .Fn mktemp , .Fn mkstemp , .Fn mkstemps , .Fn mkdtemp に読込み専用文字列を渡しているものです。 この問題は、 .St -isoC コンパイラが普及する前に開発されたプログラムで多く見られます。 たとえば引数 .Qq /tmp/tempfile.XXXXXX を指定して .Fn mkstemp を呼び出すと、 .Fn mkstemp が、指定された文字列定数を書き換えようとしてコアダンプが起こります。 問題を起こすプログラムが、このような関数呼出しを頻繁に行っている場合は、 メモリの書込み可能セグメントへ文字列定数を 保持するようにプログラムをコンパイルすることもできます。 詳細については、 .Xr gcc 1 を参照してください。 .Sh バグ この関数群は推測可能なファイル名を生成しますが、 .Ql X の数を多くし作成可能な一時ファイル名の数を増やすことで、 推測される危険を最小化します。 .Fn mktemp では、あるファイルが存在するかのテスト ( .Fn mktemp 関数呼び出しの中) と、そのファイルを使用するためのオープン (その後のユーザアプリケーションの中) との間で競合が発生し、 これはセキュリティの面から見て、とても危険です。 .Fn mkstemp には競合状態がありませんので、 可能な限り、この関数を使うべきでしょう。 もし .Fn mkstemp が使用できない場合は、 .Fn mktemp で生成されたファイル名を .Xr open 2 で開く時に .Dv O_EXCL フラグをつけるようにし、 失敗していないか戻り値をテストすべきでしょう。 こうすることによって、攻撃者がファイルの内容を操作したり 読んだりする意図を持ってファイルを既に作成していても、 プログラムが無闇に動作を継続することがなくなります。 .Sh 関連項目 .Xr chmod 2 , .Xr getpid 2 , .Xr mkdir 2 , .Xr open 2 , .Xr stat 2 .Sh 歴史 .Fn mktemp 関数は、 .At v7 で登場しました。 .Fn mkstemp 関数は、 .Bx 4.4 で登場しました。 .Fn mkdtemp 関数は、 .Ox 2.2 ではじめて登場し、その後 .Fx 3.2 で登場しました。 .Fn mkstemps は .Ox 2.4 ではじめて登場し、その後 .Fx 3.4 で登場しました。