.\" Copyright (c) 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" Chris Torek. .\" 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. .\" .\" @(#)funopen.3 8.1 (Berkeley) 6/9/93 .\" %FreeBSD: src/lib/libc/stdio/funopen.3,v 1.7.2.4 2001/12/14 18:33:57 ru Exp % .\" $FreeBSD$ .\" .Dd June 9, 1993 .Dt FUNOPEN 3 .Os .Sh 名称 .Nm funopen , .Nm fropen , .Nm fwopen .Nd ストリームのオープン .Sh ライブラリ .Lb libc .Sh 書式 .In stdio.h .Ft FILE * .Fn funopen "const void *cookie" "int (*readfn)(void *, char *, int)" "int (*writefn)(void *, const char *, int)" "fpos_t (*seekfn)(void *, fpos_t, int)" "int (*closefn)(void *)" .Ft FILE * .Fn fropen "void *cookie" "int (*readfn)(void *, char *, int)" .Ft FILE * .Fn fwopen "void *cookie" "int (*writefn)(void *, const char *, int)" .Sh 解説 .Fn funopen 関数は、ストリームを最大 4 つの .Dq Tn I/O No 関数 に関連付けます。 .Fa readfn か .Fa writefn のどちらかは必ず指定しなければなりません。 それ以外の箇所には適当な型の .Dv NULL ポインタを与えることができます。 これらの .Tn I/O 関数は、新しいストリームに対する 読込み、書込み、シーク、クローズのために使用されます。 .Pp 通常、関数を省略したということは、 作成されたストリームに関連付けられた操作を実行すると失敗する、 ということを意味しています。 クローズ関数が省略されている場合は、 ストリームを閉じるとバッファリングされている出力がフラッシュされ、 成功して終了します。 .Pp .Fa readfn , .Fa writefn , .Fa seekfn , .Fa closefn の呼び出し規則は、それぞれ .Xr read 2 , .Xr write 2 , .Xr seek 2 , .Xr lseek 2 , .Xr close 2 のものと同じですが、通常ファイル記述子引数が置かれる場所に、 .Fn funopen に指定された .Fa cookie 引数が渡されるという違いがあります。 .Pp 読込みおよび書込み .Tn I/O 関数は、 .Xr setvbuf 3 を呼び出すことによって、 完全にバッファリングされたもしくは行単位でバッファリングされたストリームの 基礎となるバッファを変更することが許可されています。 バッファを完全に満たしたり完全に空にしたりすることまでは要求されません。 しかし、バッファリングされていない状態から バッファリングされた状態に変更したり、 行バッファのフラグの状態を変更したりすることは許可されていません。 最近指定された以外のバッファに対して読込みや書込みの呼び出しが 発生するということに備えておく必要があります。 .Pp すべてのユーザ .Tn I/O 関数は、\-1 を返すことでエラーを報告することができます。 さらに、エラーが発生した場合、すべての関数は外部変数 .Va errno を適切に設定する必要があります。 .Pp .Fn closefn でのエラーは、ストリームを開いた状態には保持しません。 .Pp 便宜を図るため、インクルードファイル .Aq Pa stdio.h では、 .Fn funopen を読込みまたは書込み関数だけを指定して呼び出す時のような、 .Fn fropen マクロと .Fn fwopen マクロが定義されています。 .Sh 戻り値 成功して終了すると、 .Fn funopen は .Dv FILE ポインタを返します。それ以外の場合では .Dv NULL が返され、エラーを示す値がグローバル変数 .Va errno に設定されます。 .Sh エラー .Bl -tag -width Er .It Bq Er EINVAL .Fn funopen 関数が、読込み関数または書込み関数のどちらも指定されずに呼び出されました。 .Fn funopen 関数は失敗した時に .Xr malloc 3 ルーチンのために指定されたエラーを .Va errno に設定することもあります。 .El .Sh 関連項目 .Xr fcntl 2 , .Xr open 2 , .Xr fclose 3 , .Xr fopen 3 , .Xr fseek 3 , .Xr setbuf 3 .Sh 歴史 .Fn funopen 関数は .Bx 4.4 ではじめて登場しました。 .Sh バグ .Fn funopen 関数は .Bx 以外のシステムには移植可能でないかもしれません。