[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00500] Re: FDclone でファイルサイズが 0 と表示される
- Subject: [FDclone-users:00500] Re: FDclone でファイルサイズが 0 と表示される
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Tue, 18 Apr 2006 21:49:15 +0900
しらいです。
In Message-Id <OF5F317E98.4E9760F4-ON49257153.00194C06@tky.lightwell.co.jp>
SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>さんwrites:
> 潮田です。
> 先の例では、
>
> 2G 999999999 06-04-14 9:08
> sss 2 06-04-14 9:17
> ss 0 06-04-14 9:13
> x.tar 999999999 06-04-14 9:18
>
> と表示されています。
これ、試しにカラム幅を増やして最下行のステイタスを確認して
貰えますか?最下行は桁数さえ十分にあれば 999... で丸めたりは
しませんので、真のサイズが表示される筈です。
32bits 幅を越えている 4GB 以上のサイズに対して正しい表示が
得られているでしょうか?
というのも、そもそも sscanf() 時に間違った桁に値を置いてし
まったとしても、その変数の bit 領域の範囲内であれば値「0」に
なる筈がないんですね。0 って全ての bit が 0 なんですから。
ということは、sscanf() で間違って値を置いてしまった桁部分
が無視されて表示されているということなんじゃないでしょうか。
つまり、64bits 幅全てを表示し切れていない訳です。
だとしたら、まずは printf() の方を先に何とかする必要があり
ますね。
> 先の2つの環境で試しましたが、どちらでも何も表示されませんでした。
> (ブランクしか出力されていない?)
おかしいなー。元の program には正しく「%02x」と書いてある
ので、insert した後に編集ミスでもしちゃったんでしょうか。
> $ xlc x.c
一応、cc の方で試してみて下さい。xlc の方だと普通に C99 な
実装になってるそうですから。以降も暫くは cc だけを使って下さ
いね。
> "x.c", line 13.22: 1506-207 (W) 整数定数 0x0123456789 が範囲外です。
immediate に 32bits 幅を越える値を表現する術がないようです
ので、shift して値を代入することにしましょう。
> "x.c", line 14.14: 1506-374 (I) ポインター型「char*」と「long long*」の間には互換性がありません。
pointer 云々を言われないように、sscanf() と同様 vararg で
実装しましょう。
また、単独の program だと compile option 等が異なるかも知
れませんので、FDclone そのものの main() をすげ替えることに
します。
という訳で、今度のテストでは FD-2.08b に以下の patch をあ
てて試してみて下さい。
i386 な環境では
ef cd ab 89 67 45 23 01
3210456789ab7654
9876543210
みたいな結果になります。
途中の fprintf() が修飾子「q」を使っていますが、OS 標準の
の fprintf() が「q」非対応だった場合は、取り敢えず「l」に置
換えてみて下さい。下 32bits だけ表示する筈です。
もしくは、自前の printf() を信用して「fprintf2()」と書換え
てみてもいいかも知れません。
---- Cut Here ----
diff -u ../old/FD-2.08b/main.c ./main.c
--- ../old/FD-2.08b/main.c Thu Mar 30 00:00:00 2006
+++ ./main.c Tue Apr 18 21:36:47 2006
@@ -1235,12 +1235,64 @@
if (*cwd) rawchdir(cwd);
}
+static VOID sub2 __P_((int, ...));
+static VOID sub1 __P_((VOID_A));
+
+#ifdef USESTDARGH
+/*VARARGS2*/
+static VOID sub2(int size, ...)
+#else
+static VOID sub2(size, va_alist)
+int size;
+va_dcl;
+#endif
+{
+ va_list args;
+ u_char *buf;
+ u_short u;
+ int i;
+
+ VA_START(args, size);
+ buf = va_arg(args, u_char *);
+ va_end(args);
+
+ for (i = 0; i < size; i++) printf("%02x ", buf[i]);
+ printf("\n");
+ u = 0x7654;
+ memcpy(buf, (char *)(&u), sizeof(u));
+ buf += size - sizeof(u);
+ u = 0x3210;
+ memcpy(buf, (char *)(&u), sizeof(u));
+}
+
+static VOID sub1(VOID_A)
+{
+ off_t n;
+
+ n = 0x0123;
+ n <<= 16;
+ n |= 0x4567;
+ n <<= 16;
+ n |= 0x89ab;
+ n <<= 16;
+ n |= 0xcdef;
+
+ sub2(sizeof(off_t), &n);
+ fprintf(stdout, "%qx\n", n);
+
+ sscanf2("9876543210", "%qd", &n);
+ fprintf2(stdout, "%qd\n", n);
+}
+
int main(argc, argv, envp)
int argc;
char *argv[], *envp[];
{
char *cp;
int i;
+
+ sub1();
+ exit(0);
#ifdef DEBUG
mtrace();
---- Cut Here ----
しらい たかし