[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00343] Re: FDclone でファイルサイズが 0 と表示される
- Subject: [FDclone-users:00343] Re: FDclone でファイルサイズが 0 と表示される
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Thu, 02 Dec 2004 00:51:40 +0900
しらいです。
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」
で対処しましょうか。
しらい たかし