In message <1093099069.657866.26534.nullmailer / picachu.netlab.jp>
	on Sat, 21 Aug 2004 23:54:59 +0900,
	matz / ruby-lang.org (Yukihiro Matsumoto) wrote:
> これは反論ではなくて、純粋に質問なのですが、
> 
>   * fopen(3)には書き込みオープンによって新規に作成されるファ
>     イルのパーミッションを明示的に指定する方法はない
>   * これを制御する唯一の方法はumaskである
>
>   * しかし、「ライブラリ的な関数は呼び出し側のumask設定に依
>     存すべきでない」。
次善の策としては、fopen(3)する前にuamskを設定して、後で元に戻すという
あたりでしょうか。

	mode_t mask;
	FILE *fp;

	mask = umask(077);
	fp = fopen(file, "r+");
	umask(mask);
	...

>   * ということは、ライブラリ的関数でfopenを使ってファイルを
>     新規に作成することは「やってはいけないこと」である。ライ
>     ブラリ的関数でファイルを新規作成する場合には、open(2)を
>     直接使う必要がある
> 
> ということなのでしょうか。
C言語のレベルでは、open(2)で開いといてから、fdpen(3)するというのも、あ
りがちな方法に思えます。

> それならそれで納得できないことはないのですが、結構違反してい
> るケースは多そうな気がします。
ポイントは、CGI::Sessionのような作成するファイルのアクセス権が問題とな
る場合です。「ライブラリ的な関数は呼び出し側のumask設定に依存すべきで
ない」と書いてしまいましたが、作成するファイルのアクセス権に特別な制限
が不要で、現在のumaskに影響されても良いというケースもありそうな気がし
ます。

(風邪で2日弱寝込んでたので、今一つ気の回ってないところがあるかもしれま
せん。)

-- 
神戸 隆博 / Takahiro Kambe