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

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



 しらいです。

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 ----

                                               しらい たかし