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

[FDclone-users:00343] Re: FDclone でファイルサイズが 0 と表示される



 しらいです。

In Message-Id <OF0BB05D3E.5F560191-ON49256F5D.001BDE82@tky.lightwell.co.jp>
        SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>さんwrites:
> 潮田と申します。

> AIX 上の fd が、全てのファイルサイズを 0 と表示している事に
> 気がつきました。
> いつごろそうなったか、又はどの version からそうなったかは
> 不明ですが、今の 2.06a ではなっています。

 んー、ファイルサイズだけですか。ページ数やマーク数の表示は
大丈夫なんですね?だとすると size_t 幅の変数を扱いきれなくて
桁溢れを起こしているんですかね。
 サイズが 4GB 以上のファイルだとファイルサイズがようやく一
桁の数値になるようなら 32bit 幅で切られた結果でしょうね。


> snprintf2(buf, width + 1, "%<*qd", width, namep -> st_size);

 この最後の引数を (long) でキャストしてみるとどうなります?
それで表示されるようなら、long が 32bit 幅で size_t が 64bit
幅なんだと思います。で big endian なもんで上位 32bit だけ拾
って 0 として扱われると。
 64bit 幅以上を保障する型って ANSI で規定されていないので、
long long が使える環境なのかどうかは configure にかけないと
判定出来ないんですよね。


解決策その 1:
 machine.h の AIX の項目に「#define HAVELONGLONG」を追加。
	→long long 非対応の AIX 環境ってないのか?

解決策その 2:
diff -u1 ../old/FD-2.06a/browse.c ./browse.c
--- ../old/FD-2.06a/browse.c	2004-09-08 00:00:00.000000000 +0900
+++ ./browse.c	2004-12-02 00:25:44.000000000 +0900
@@ -650,3 +650,4 @@
 #endif	/* !MSDOS */
-	else snprintf2(buf, width + 1, "%<*qd", width, namep -> st_size);
+	else snprintf2(buf, width + 1, "%<*qu",
+		width, (off_t)(namep -> st_size));
 
diff -u1 ../old/FD-2.06a/printf.c ./printf.c
--- ../old/FD-2.06a/printf.c	2004-09-08 00:00:00.000000000 +0900
+++ ./printf.c	2004-12-02 00:25:00.000000000 +0900
@@ -494,2 +494,5 @@
 				u = va_arg(args, u_long);
+#else
+			else if (len == sizeof(off_t))
+				u = va_arg(args, off_t);
 #endif

 long long 型を持っている場合は「long long」「long」「int」
で網羅出来ない引数幅は存在しない筈ですが、long long 型を持っ
ていない、もしくはそう扱われているケースでは、「long」「int」
「off_t」で全部網羅させようという腹づもりの patch です。
 実際、本当に long long 型を持っていないなら off_t は long
と等しい幅の筈なので、この patch はどっかで冗長になる筈なん
ですけどね。
 patch の前半は size_t が off_t より大きい幅だった時の対処
ですが、普通はあり得ないと思います。


 ま、無駄なだけで弊害は無いと思うので、「その 2」で対応出来
るようなら、環境依存のありそうな「その 1」はやめて「その 2」
で対処しましょうか。

                                               しらい たかし