[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00276] Re: error handling with chflags(2)



 しらいです。

In Message-Id <86ekpdv5cf.knu@iDaemons.org>
        "Akinori MUSHA" <knu@iDaemons.org>さんwrites:
>  ATTR_FILE は、マークがない状態で単一のファイルに対して実行
> すると、フラグ部分を編集したときだけ chflags(2) を呼びます。
> ところが、マークがある状態で実行すると、すべてのマークファイルに
> ついて chflags(2) を呼ぶようです。

 ふむ。そもそも mark がある状態では file mode か timestamp
しか編集出来ないので、にも拘らず chflags(2) を呼ぶのはおかし
な話ではありますね。


>  そのため、 chflags(2) がサポートされないファイルシステム上で
> マークファイルに対して ATTR_FILE を実行すると、フラグ部分を全く
> いじっていない場合でも、ファイル一つ一つについて「Operation not
> supported」エラーが出てキー入力を促されます。これが鬱陶しい…。

 これって例えばどういう file system でしょう?真っ先に FAT
を思いついたんで -t msdos で floppy を mount して試してみた
のですが、特に支障なく operation が完了してしまいました。
 kernel source 覗いたら msdosfs は archived flag に対応して
いるみたいで。


>  マークファイルに対しての ATTR_FILE においても、各ファイルに
> ついて変更が必要な場合だけ chflags(2) を呼ぶようにするとか、
> あるいは EOPNOTSUPP は最後にまとめて報告するとか、うまく対処
> してもらえないでしょうか。

 前者は変更が必要か否かで呼ぶ呼ばないを区別している訳ではな
くて、入力として値が変更されたか否かで判断しています。
 mark file の場合にこの判別をせずに呼んでいるのは、入力され
た値が単一であるのに対し、元の file mode なり timestamp なり
は単一ではないので、変更すべきものと不要なものとを区別するに
は改めて stat() で元の値を調べないとならないためです。

 後者に関しては、それぞれの mark file に関してどんな error
が返るか予測不能なので、最後にまとめて表示した場合には、どの
error がどの file に対するものなのか判別不能になってしまいま
す。
 mark file の中に書込み権のある file とない file とが混在し
ていたりすると、最後にまとめて ENOPERM を出したのではどれが
失敗したのやら判りませんよね。

 という訳で、「変更していない (出来ない) のに error を吐く」
というのは理不尽なので改めますが、error の表示方法に関しては
従来どおりということにします。
 ad hoc に直すとこんな感じでしょうか。

---- Cut Here ----
diff -u old/apply.c new/apply.c
--- old/apply.c	Tue Jan  6 10:12:40 2004
+++ new/apply.c	Sun May 23 04:14:55 2004
@@ -902,7 +902,7 @@
 
	attrmode = (flag & 1) ? attr.mode : 0xffff;
 #ifdef	HAVEFLAGS
-	attrflags = (flag & 1) ? attr.flags : 0xffffffff;
+	attrflags = (flag == 3) ? attr.flags : 0xffffffff;
 #endif
	attrtime = (flag & 2) ? timelocal2(tm) : (time_t)-1;
	if (flag == 3) {
 
---- Cut Here ----

                                               しらい たかし