[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00927] File creation time for DOSDRIVE
- Subject: [FDclone-users:00927] File creation time for DOSDRIVE
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Sun, 26 Sep 2010 01:33:43 +0900
しらいです。
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 の必要なんてないので、更新時刻を変更する
ことで作成時刻が偶数秒に変更されてしまう「専用ソフト」って一
体どんなソフトなんでしょうね?
しらい たかし