[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00771] Re: [FDclone-users:00769] のパッチ検証結果
- Subject: [FDclone-users:00771] Re: [FDclone-users:00769] のパッチ検証結果
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Sat, 12 Apr 2008 05:55:09 +0900
しらいです。
In Message-Id <20080411023153.GB29613@trix.islocal>
Takeshi Hamasaki <hma@syd.odn.ne.jp>さんwrites:
> 濱崎です。
> 00769 のパッチを適用し、同じ手順で試したところ、
> x86, x86_64 とも期待通りの動作をすることを確認しました。
> ありがとうございました。
その後試してみたら、*BSD な OS でも似たような挙動を示して
いるようです。どうも、LFN を使える file system だと vfat に
限らず大文字小文字を区別して扱っているようですね。
ということで、FSID_VFAT は廃止して FSID_LFN 全般で先の対応
をしようと思います。
そこで改めて *BSD msdosfs の LFN 対応状況を確認してみたん
ですが、ややこしいことになってますねー。
FreeBSD:
2.2.6 まで SFN のみ。2.2.7 以降 LFN 対応。
NetBSD:
1.0/1.1 は SFN のみ。1.2 以降 LFN 対応。
OpenBSD:
全て LFN 対応。
*BSD の LFN 対応は NetBSD 起源なので、伝搬速度の違いにより
採用時期が微妙に異なっているんですが、問題はその境界をどうや
って検出するかです。
OpenBSD は問題なしとして、NetBSD は /sys/param.h で識別子
「NetBSDX_X」を定義してるので、「NetBSD1_0」と「NetBSD1_1」
だけ弾けば残りは全て LFN 対応になります。
ややこしいのは FreeBSD で、最近のものだと /sys/param.h で
識別子「__FreeBSD_version」を定義してるんですが 2.2.7 当時は
osreldate.h での定義なんで include してやる必要があります。
しかも 3.0.0 からはこの header は作られないので、OS major
番号を見てから osreldate.h を include して、そこで初めて識別
子で OS version を判断するという面倒な手続きになります。
おまけに 2.2.6 以前の msdosfs には致命的な bug があって、
directory を rename(2) するとその directory を破壊してしまう
ので使いものになりません。
まぁともあれ、Linux 以外の msdosfs 環境にも対応してみたの
で、この patch を適用して改めて検証してみて下さい。FD-2.09h
に適用する場合は先に [FDclone-users:00769] を当てて下さい。
msdosfs 周りは、この週末に改めて再検証してみるので、次回の
release は来週以降になる予定です。
---- Cut Here ----
diff -u old/file.c ./file.c
--- old/file.c Sat Apr 19 00:00:00 2008
+++ ./file.c Sat Apr 12 04:47:03 2008
@@ -26,8 +26,7 @@
#define FAT_NONE 0
#define FAT_PRIMAL 1
#define FAT_LFN 2
-#define FAT_VFAT 3
-#define FAT_DOSDRIVE 4
+#define FAT_DOSDRIVE 3
#ifndef O_BINARY
#define O_BINARY 0
@@ -1502,8 +1501,9 @@
i++;
lfn = 1;
}
- else if (fat == FAT_VFAT && islower2(s[i])) lfn = 1;
- else if (!lfn && strchr(LFNONLY, s[i])) lfn = 1;
+ else if (lfn) /*EMPTY*/;
+ else if (islower2(s[i])) lfn = 1;
+ else if (strchr(LFNONLY, s[i])) lfn = 1;
}
if (lfn) /*EMPTY*/;
else if (dot) {
@@ -1723,13 +1723,6 @@
dirsize = 4; /* short + short */
namofs = 3;
break;
- case FSID_VFAT: /* Linux File System for Windows */
- fat = FAT_VFAT;
- headbyte = -1;
- boundary = LFNENTSIZ;
- dirsize = DOSDIRENT;
- namofs = 0;
- break;
# ifndef _NODOSDRIVE
case FSID_DOSDRIVE: /* Windows95 File System on DOSDRIVE */
fat = FAT_DOSDRIVE;
@@ -1906,7 +1899,6 @@
case FSID_SYSV: /* SystemV R3 File System */
case FSID_FAT: /* MS-DOS File System */
case FSID_LFN: /* Windows95 File System */
- case FSID_VFAT: /* Linux File System for Windows */
ent = size;
break;
default:
diff -u old/info.c ./info.c
--- old/info.c Sat Apr 19 00:00:00 2008
+++ ./info.c Sat Apr 12 05:18:03 2008
@@ -206,6 +206,21 @@
#define blocksize(fs) (fs).f_bsize
#endif
+#ifdef LINUX
+#define SFN_MSDOSFS
+#endif
+#if defined (FREEBSD) && (__FreeBSD__ < 3)
+# include <osreldate.h>
+# if defined (__FreeBSD_version) && (__FreeBSD_version < 227000)
+# define SFN_MSDOSFS
+# endif
+#endif /* FREEBSD && (__FreeBSD__ < 3) */
+#ifdef NETBSD
+# if defined (NetBSD1_0) || defined (NetBSD1_1)
+# define SFN_MSDOSFS
+# endif
+#endif /* NETBSD */
+
extern VOID error __P_((CONST char *));
extern int _chdir2 __P_((CONST char *));
extern char *strcpy2 __P_((char *, CONST char *));
@@ -383,14 +398,14 @@
{FSID_SYSV, MNTTYPE_DGUX},
{FSID_LINUX, MNTTYPE_EXT2},
{FSID_LINUX, MNTTYPE_EXT3},
-# ifdef LINUX
+# ifdef SFN_MSDOSFS
{FSID_FAT, MNTTYPE_MSDOS},
# else
{FSID_LFN, MNTTYPE_MSDOS},
# endif
{FSID_LFN, MNTTYPE_MSDOSFS},
{FSID_LFN, MNTTYPE_UMSDOS},
- {FSID_VFAT, MNTTYPE_VFAT},
+ {FSID_LFN, MNTTYPE_VFAT},
{0, MNTTYPE_ADVFS},
{0, MNTTYPE_VXFS},
# ifdef DARWIN
diff -u old/types.h ./types.h
--- old/types.h Sat Apr 19 00:00:00 2008
+++ ./types.h Sat Apr 12 04:45:40 2008
@@ -360,8 +360,7 @@
#define FSID_LINUX 4
#define FSID_FAT 5
#define FSID_LFN 6
-#define FSID_VFAT 7
-#define FSID_DOSDRIVE 8
+#define FSID_DOSDRIVE 7
#define LCK_READ 0
#define LCK_WRITE 1
---- Cut Here ----
しらい たかし