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

[FDclone-users:00927] File creation time for DOSDRIVE



 しらいです。

 FD-3.00j を release した直後ですが、時事ネタで bug に気づ
いたので修正しておきます。
 DOSDRIVE=1 で floppy 上に file を作成する場合、drive 名が
小文字の場合は LFN 拡張した FAT を用いるのですが、その作成時
刻が必ず偶数秒になっていました。

 FAT では時刻情報を 2 bytes に無理矢理納めるために奇数秒は
切捨てて処理しているのですが、作成時刻だけはもう 1byte 余分
に使って 1/100 秒の解像度を持っています。
 つまり、追加の 1byte の中に秒の最下位 bit と 1/100 秒とを
納めて 0-199 の値になる訳です。Windows の property では秒未
満は切捨てて表示していますけどね。

 FDclone の DOSDRIVE 機能ではこの 1byte に 1/100 秒の情報は
埋込んでたんですが、秒の最下位 bit を納めていなかったために、
奇数秒が偶数秒に丸められる結果になっていました。
 下記 patch では、この 1/100 秒情報の中に秒の最下位 bit を
含めるようにしたので、奇数秒に作成された file を Windows 側
から見ると、正しく奇数秒として表示されるようになります。

---- Cut Here ----
diff -u ../old/FD-3.00j/dosdisk.c ./dosdisk.c
--- ../old/FD-3.00j/dosdisk.c	Sat Sep 25 00:00:00 2010
+++ ./dosdisk.c	Sun Sep 26 00:05:47 2010
@@ -2269,7 +2269,7 @@
 {
 	time_t mt;
 	u_short date, time;
-	int isnow;
+	int sec, isnow;
 
 	mt = (time_t)0;
 	isnow = 0;
@@ -2277,9 +2277,12 @@
 		t = Xtime(&mt);
 		isnow++;
 	}
-	getdostime(&date, &time, t);
+	sec = getdostime(&date, &time, t);
 
-	if (!time && isnow) time = 0x0001;
+	if (isnow) {
+		if (!time) time = 0x0001;
+		mt += (sec & 0x01) * 1000L;
+	}
 	buf[0] = time & 0xff;
 	buf[1] = (time >> 8) & 0xff;
 	buf[2] = date & 0xff;
diff -u ../old/FD-3.00j/sysemu.c ./sysemu.c
--- ../old/FD-3.00j/sysemu.c	Sat Sep 25 00:00:00 2010
+++ ./sysemu.c	Sun Sep 26 00:03:20 2010
@@ -720,7 +720,7 @@
 	return(attr);
 }
 
-VOID getdostime(dp, tp, t)
+int getdostime(dp, tp, t)
 u_short *dp, *tp;
 time_t t;
 {
@@ -733,6 +733,8 @@
 	*tp = ((tm -> tm_hour & 0x1f) << 11)
 		+ ((tm -> tm_min & 0x3f) << 5)
 		+ ((tm -> tm_sec & 0x3e) >> 1);
+
+	return(tm -> tm_sec);
 }
 #endif	/* DEP_DOSPATH */
 
diff -u ../old/FD-3.00j/sysemu.h ./sysemu.h
--- ../old/FD-3.00j/sysemu.h	Sat Sep 25 00:00:00 2010
+++ ./sysemu.h	Sat Sep 25 23:59:47 2010
@@ -58,7 +58,7 @@
 extern u_int getunixmode __P_((u_int));
 extern time_t getunixtime __P_((u_int, u_int));
 extern u_short getdosmode __P_((u_int));
-extern VOID getdostime __P_((u_short *, u_short *, time_t));
+extern int getdostime __P_((u_short *, u_short *, time_t));
 #endif
 #if	defined (DEP_DIRENT)
 extern DIR *Xopendir __P_((CONST char *));
---- Cut Here ----

P.S.
 patch 適用前の FDclone でも、既存の file status を修正する
分には、変更部分以外の項目は元の値を用いるので、奇数秒の作成
時刻もそのまま保持されていました。
 Windows DLL で file status を修正しても当然保持されますし、
MS-DOS function call だと作成時刻自体を削除してしまうので、
奇数秒情報が消えるのは raw access した時だけでしょう。
 普通は raw access の必要なんてないので、更新時刻を変更する
ことで作成時刻が偶数秒に変更されてしまう「専用ソフト」って一
体どんなソフトなんでしょうね?

                                               しらい たかし