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

[FDclone-users:00771] Re: [FDclone-users:00769] のパッチ検証結果



 しらいです。

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

                                               しらい たかし