[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00506] Re: FDclone でファイルサイズが 0 と表示される
- Subject: [FDclone-users:00506] Re: FDclone でファイルサイズが 0 と表示される
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Thu, 20 Apr 2006 22:12:44 +0900
しらいです。
In Message-Id <OF5A90640F.0C365F29-ON49257156.00023918@tky.lightwell.co.jp>
SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>さんwrites:
> 潮田です。
> なにがどうなったっら正しいのかの判断が出来ないので、
> 余計な話は入れずに結果だけお返しします。
> (話に、全くついていけていません)
MAXINT 云々の話は、その OS 環境で表現可能な一番大きな数値
を表示するので実際のサイズ値より小さな値が表示されるというだ
けのことです。
2GB 以上のサイズ値は、AIX の cc で compile している限りは
表示出来ないことになってます。
> > そもそも sscanf() が正しく機能出来ているかどうかを検証する
> > ため、「fprintf2()」を「fprintf()」に置換えて 3 行目の表示を
> > 確認してみて下さい。「%qd」は「%lld」にして下さいね。
> $ ./fd
> 01 23 45 67 89 ab cd ef
> 7654456789ab3210
> 8526516305512837648
>
> 3 行目の出力が変わりましたが、多分望まれる結果では
> ないのでしょうね。
16 進数に直すと 2 行目の値と全く同じです。つまり、sscanf()
した結果、値が全く変化していないということになります。一体ど
こに代入しちゃったんでしょうね。
今度は main() と sscanf() の両方にテストプログラムを仕込ん
でみました。素の FD-2.08b に戻してからこの patch を試して下
さい。
因みに i386 の NOLONGLONG 環境ではこんな感じ。
offset = 0xefbfd800
ef cd ab 89 67 45 23 01
value = 0x123456789abcdef
sizeof(off_t) = 8, sizeof(u_long_t) = 4
offset = 0xefbfd800
ef cd ab 89 67 45 23 01
buf[0] = 5a
offset = 0xefbfd800
ff ff ff 7f 00 00 00 00
value = 2147483647
offset = 0xefbfd800
ff ff ff 7f 00 00 00 00
value = 2147483647
---- 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 Thu Apr 20 22:02:03 2006
@@ -1235,12 +1235,60 @@
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;
+ 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");
+}
+
+static VOID sub1(VOID_A)
+{
+ off_t n;
+
+ n = 0x0123;
+ n <<= 16;
+ n |= 0x4567;
+ n <<= 16;
+ n |= 0x89ab;
+ n <<= 16;
+ n |= 0xcdef;
+ printf("offset = %p\n", &n);
+ sub2(sizeof(off_t), &n);
+ printf("value = 0x%llx\n\n", n);
+
+ sscanf2("9876543210", "%qd", &n);
+ printf("offset = %p\n", &n);
+ sub2(sizeof(off_t), &n);
+ printf("value = %lld\n", n);
+}
+
int main(argc, argv, envp)
int argc;
char *argv[], *envp[];
{
char *cp;
int i;
+
+ sub1();
+ exit(0);
#ifdef DEBUG
mtrace();
diff -u ../old/FD-2.08b/parse.c ./parse.c
--- ../old/FD-2.08b/parse.c Thu Mar 30 00:00:00 2006
+++ ./parse.c Thu Apr 20 22:04:02 2006
@@ -274,6 +274,39 @@
memcpy(&u, &n, sizeof(u));
}
+ printf("sizeof(off_t) = %d, sizeof(u_long_t) = %d\n\n",
+ len, (int)sizeof(u_long_t));
+#ifndef HAVELONGLONG
+ if (len > (int)sizeof(u_long_t)) {
+ char *buf;
+ u_long_t tmp;
+ int hi;
+
+ hi = 0;
+ if (!(flags & VF_UNSIGNED)) {
+ mask = (MAXUTYPE(u_long_t) >> 1);
+ if (u & ~mask) hi = 0xff;
+ }
+ buf = va_arg(args, char *);
+ printf("offset = %p\n", buf);
+ for (c = 0; c < len; c++)
+ printf(" %02x", buf[c] & 0xff);
+ printf("\n");
+ memset(buf, hi, len);
+
+ tmp = 0x5a;
+ cp = (char *)(&tmp);
+ printf("buf[0] = %02x\n\n", *cp);
+ if (*cp != 0x5a) buf += len - sizeof(u_long_t);
+ printf("offset = %p\n", buf);
+ memcpy(buf, (char *)(&u), sizeof(u));
+ for (c = 0; c < len; c++)
+ printf(" %02x", buf[c] & 0xff);
+ printf("\n");
+ printf("value = %lld\n\n", (off_t)u);
+ }
+ else
+#endif /* !HAVELONGLONG */
if (len == (int)sizeof(u_long_t))
*(va_arg(args, u_long_t *)) = u;
#ifdef HAVELONGLONG
---- Cut Here ----
しらい たかし