[Mew-dist 11676] Re: mls

Shun-ichi GOTO gotoh at example.com
1999年 12月 7日 (火) 15:55:54 JST


>>>>> at Tue, 7 Dec 1999 14:05:53 +0900, kazu <kazu at example.com> said,

kazu> m.tar.gz というファイルを ftp.mew.org:/pub/Mew/alpha に置きました。こ
kazu> れには mls というプログラムが入っています。実行すると、たとえばこんな
kazu> 感じになります。

BSD/OS 3 ではサクッと configure & make が行なえましたが、Win32では問題あり。


kazu> これを Mew 側で受取り、復号して Summary モードの書式を埋めようと考えて
kazu> います。

kazu> それでお願いですが、mls が Windows で動くか試して下さい。Cygnus のライ
kazu> ブラリを持ってくればいい線行くのではないかと思います。

単純にconfigure & make すると、やまぐちさんもいっていたように失敗します。
なんでだか、 configure が sys/dirent.h を見つけてくれません。しょうがな
いので、出来上がったconfig.h の HAVE_DIRENT を1 にしてやりコンパイルする
と、やはり dirent->d_type 辺りで引っかかります。その他にも scandir() が
ありませんので、**暫定的に** 添付のファイルのdiff のようにしてみました。
しかし、これでBSD/OS でも動作するのですが、cygwin32 ではどういうわけか
opendir() で STATUS_ACCESS_VIOLATION が発生してしまいます。
なんで? > cygnus or 知ってる人


kazu> 僕はどうディレクトリを操作すべきかさえ知らないぐらい、MS-DOS に関して
kazu> は無知なので、よろしくご指導お願いします。Autoconf 形式の #ifdef を小
kazu> 人さんが増やしてくれると嬉しいです。:-)

添付したコードでは GetFileAttribute() というものを使っています。

もしcygwin でopendir() が使えないなら、Win32 は FindFirstFile(),
FindNextFile(), FindClose() でループを実現することになるか。。。

--- Regards,
 Shun-ichi Goto  <gotoh at example.com>
   R&D Group, TAIYO Corp., Tokyo, JAPAN
-------------- next part --------------
--- m/mls.c	Tue Dec 07 05:04:31 1999
+++ m-gotoh/mls.c	Tue Dec 07 06:52:38 1999
@@ -14,6 +14,10 @@
 #include <dirent.h>
 #endif
 
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
 #include <pwd.h>
 
 #define MAILHOME "Mail"
@@ -30,14 +34,18 @@
 int
 selectnum(struct dirent *dp) {
 	char *c = dp->d_name;
-	char *lim = c + dp->d_namlen;
+	char *lim = c + strlen(dp->d_name);
 	int ret = 1;
 
+#ifdef _WIN32
+	if ( ! (GetFileAttributes(dp->d_name) & FILE_ATTRIBUTE_NORMAL) ) 
+		return 0;
+#else
 	if (dp->d_type != DT_REG)
 		return 0;
-
+#endif
 	while (c < lim) {
-		if (! isnumber(*c)) {
+		if (! isdigit(*c)) {
 			ret = 0;
 			break;
 		}
@@ -145,12 +153,12 @@
 
 void
 scanfolder(char *fld) {
-	struct dirent **dirents;
-	char *dir = expandfolder(fld);
+    struct dirent *dirent;
 	FILE *fp;
 	int i, n;
+    DIR *dirp;
 
-	if (chdir(dir) != 0) {
+    if (chdir(expandfolder(fld)) != 0) {
 		fprintf(stderr, "can't change folder to %s\n", fld);
 		exit(EXIT_FAILURE);
 	}
@@ -158,14 +166,17 @@
 	for (i = 0; i < N; i++)
 		SLEN[i] = strlen(FIELDS[i]) - 1;
 
-	n = scandir(".", &dirents, selectnum, compnum);
-
-	for (i = 0; i < n; i++) {
-		fp = fopen(dirents[i]->d_name, "r");
-		if (fp == NULL) continue;
+    dirp = opendir( "." );
+    while ( (dirent=readdir( dirp )) != NULL ) {
+	if ( 0 < selectnum(dirent) ) {
+	    fp = fopen( dirent->d_name, "r" );
+	    if ( fp != NULL ) {
 		dumpheader(fp);
 		fclose(fp);
 	}
+	}
+    }
+    closedir( dirp );
 }
 
 void
@@ -174,7 +185,7 @@
 	exit(EXIT_FAILURE);
 }
 	
-void
+int
 main (int argc, char **argv)
 {
 	char *dir;
@@ -190,5 +201,5 @@
 		usage();
 	}
 	scanfolder(dir);
-	exit(EXIT_SUCCESS);
+	return EXIT_SUCCESS;
 }


Mew-dist メーリングリストの案内