[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 メーリングリストの案内