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

[FDclone-users:00799] Re: configure 時のエラーについて



 しらいです。

In Message-Id <20080626131146.2b94b0c1.yasushi_imao@imao.jp>
        Yasushi Imao <yasushi_imao@imao.jp>さんwrites:
> お世話になります。今尾です。

> まず、私の勘違いがありましたので、訂正させていただきます。
> FreeBSD 6.3R では問題なく、FreeBSD 7.0R で問題が発生したと書きましたが、
> これは 6.3R に bash がインストールしてあるためでした。これを取り除いたと
> ころ、ご報告させていただいたエラーは再現しました。

 そもそも、一般的な /bin/sh が真っ先に候補から外されてしま
う辺り、最近の configure は凝り過ぎなんじゃないかと思います。
もっと汎用的な機能だけ使えばいいのに。
 FreeBSD の場合、OS 標準の shell だけでは configure 出来な
くて ports から bash を入れないといけないというのが現状だと
思います。

 実際、BSD4 の元祖 Bourne shell では先の configure は通りま
せん。FDclone も Bourne shell 互換を謳っている以上、本来なら
失敗する方が正しいのかも知れません。
 まぁ、明らかな bug は直しますが、仕様の違いによって失敗し
ている箇所は、出来れば Bourne shell の挙動に合わせて実装した
いなと思っています。


> すいません。試しましたがうまくいきませんでした。unbound-1.0.0 に対して
> configure スクリプトを走らせたところ、

 その挙動を示すのは configure の先頭行を /bin/sh から fdsh
に書換えた場合なんじゃないかと思うんですが、一応その環境でも
configure が成功するように修正を加えてみました。
 修正 patch は最後に引用しておきます。


> unknown
> 
> という行が 8行表示され、その後

 これは FDclone の bug でした。redirect が複数の節に跨って
作用する場合、redirect 情報を各節用に複製しているのですが、
それぞれの節の完了時に redirect を戻してしまっていました。
 例えば「`... || echo unknown`」の場合、標準出力を受け取っ
て代入先に redirect する節が二つあるのですが、前節完了時に元
に戻すと後節は本来の標準出力に出力してしまいます。
 複製時にその旨を表す flag を用意して、複製の redirect に関
しては完了時に file descriptor を元に戻さないようにしました。


> 上の行であっているのでしょうか? unknown というエラー(?) も気になり
> ますが、何に対して unknown なのか、どれに該当するのか分かりませんでした。

 表示行はどの shell を使っても多少はずれる筈です。parser は
何行か先読みしないいけないので、行番号を評価する段階では多少
後ろの行を読んでいることが多いと思います。
 単文の集まりだと正確に行番号を表示出来ますが、configure の
ような複雑な複文では行番号は参考程度にしか使えないと思った方
がいいでしょう。


 下記 patch は 3.00a に対するものなので、先の patch を一旦
破棄してから当て直して下さい。
 変更箇所が多いだけでなく、configure の期待する挙動と合って
いない仕様の数自体がかなり多いので、かなり直す必要がありまし
た。
 週末にでも時間が取れれば少し解説したいと思います。

---- Cut Here ----
diff -u ../old/FD-3.00a/pathname.c ./pathname.c
--- ../old/FD-3.00a/pathname.c	Sat Jun 21 00:00:00 2008
+++ ./pathname.c	Thu Jun 26 22:00:04 2008
@@ -616,21 +616,12 @@
 #else	/* !FAKEMETA */
 	if (s[ptr] != PMETA || quote == '\'') return(0);
 
-	if (len >= 0) {
-		if (!(flags & EA_EOLMETA) && ptr + 1 >= len) return(0);
-# ifndef	BASHSTYLE
-	/* bash does not treat "\" as \ */
-		if (quote == '"' && s[ptr + 1] == quote && ptr + 2 >= len)
-			return(0);
-# endif
+	if (flags & EA_EOLMETA) /*EMPTY*/;
+	else if (len >= 0) {
+		if (ptr + 1 >= len) return(0);
 	}
 	else {
-		if (!(flags & EA_EOLMETA) && !s[ptr + 1]) return(0);
-# ifndef	BASHSTYLE
-	/* bash does not treat "\" as \ */
-		if (quote == '"' && s[ptr + 1] == quote && !s[ptr + 2])
-			return(0);
-# endif
+		if (!s[ptr + 1]) return(0);
 	}
 
 # ifdef	BSPATHDELIM
@@ -2184,7 +2175,7 @@
 		*qp = *s;
 		return(PC_OPQUOTE);
 	}
-	else if (*s == '"') {
+	else if (!(flags & EA_NOEVALDQ) && *s == '"') {
 		*qp = *s;
 		return(PC_OPQUOTE);
 	}
@@ -3205,6 +3196,8 @@
 			else if ((flags & EA_BACKQ) && *cp == '`') /*EMPTY*/;
 			else if ((flags & EA_STRIPQ)
 			&& (*cp == '\'' || *cp == '"'))
+				/*EMPTY*/;
+			else if ((flags & EA_STRIPMETA) && *cp == PMETA)
 				/*EMPTY*/;
 			else pc = PC_NORMAL;
 
diff -u ../old/FD-3.00a/pathname.h ./pathname.h
--- ../old/FD-3.00a/pathname.h	Sat Jun 21 00:00:00 2008
+++ ./pathname.h	Thu Jun 26 21:47:20 2008
@@ -143,15 +143,17 @@
 	u_char flags;
 } wild_t;
 
-#define	EA_STRIPQ		0001
-#define	EA_BACKQ		0002
-#define	EA_KEEPMETA		0004
-#define	EA_NOEVALQ		0010
-#define	EA_STRIPQLATER		0020
-#define	EA_NOUNIQDELIM		0040
-#define	EA_EOLMETA		0100
-#define	EA_FINDMETA		0200
-#define	EA_FINDDELIM		0400
+#define	EA_STRIPQ		00001
+#define	EA_STRIPMETA		00002
+#define	EA_KEEPMETA		00004
+#define	EA_NOEVALQ		00010
+#define	EA_NOEVALDQ		00020
+#define	EA_BACKQ		00040
+#define	EA_STRIPQLATER		00100
+#define	EA_NOUNIQDELIM		00200
+#define	EA_EOLMETA		00400
+#define	EA_FINDMETA		01000
+#define	EA_FINDDELIM		02000
 
 #ifdef	NOUID_T
 typedef u_short			uid_t;
diff -u ../old/FD-3.00a/posixsh.c ./posixsh.c
--- ../old/FD-3.00a/posixsh.c	Sat Jun 21 00:00:00 2008
+++ ./posixsh.c	Thu Jun 26 21:49:05 2008
@@ -1195,7 +1195,7 @@
 			break;
 		case 'f':
 			if (s) ret = (*s && Xstat(s, &st) >= 0
-			&& (st.st_mode & S_IFMT) != S_IFDIR)
+			&& (st.st_mode & S_IFMT) == S_IFREG)
 				? RET_SUCCESS : RET_FAIL;
 			break;
 		case 'd':
diff -u ../old/FD-3.00a/system.c ./system.c
--- ../old/FD-3.00a/system.c	Sat Jun 21 00:00:00 2008
+++ ./system.c	Fri Jun 27 01:25:26 2008
@@ -2173,7 +2173,8 @@
 	duperrno = errno;
 	if (havetty()) {
 		exectrapcomm();
-		if (!noexit && (trapmode[0] & TR_STAT) == TR_TRAP) {
+		if (mypid != orgpid) /*EMPTY*/;
+		else if (!noexit && (trapmode[0] & TR_STAT) == TR_TRAP) {
 			trapmode[0] = 0;
 			if (trapcomm[0] && *(trapcomm[0]))
 				_dosystem(trapcomm[0]);
@@ -2266,6 +2267,8 @@
 			keyflush();
 		}
 #endif
+		exec_line(NULL);
+		_dosystem(NULL);
 	}
 	prepareexit(0);
 #ifdef	FD
@@ -2328,6 +2331,10 @@
 	else
 #endif
 	if (argvar && argvar[0]) fprintf2(Xstderr, "%k: ", argvar[0]);
+#ifndef	MINIMUMSHELL
+	if (!interactive && shlineno > 0L)
+		fprintf2(Xstderr, "%ld: ", shlineno);
+#endif
 	if (s) fprintf2(Xstderr, "%a: ",
 		(*s && syntaxerrno != ER_UNEXPNL) ? s : "syntax error");
 	if (syntaxerrstr[syntaxerrno])
@@ -3023,6 +3030,9 @@
 	new -> filename = path;
 	new -> buf = NULL;
 	new -> fd = fd;
+#ifndef	USEFAKEPIPE
+	new -> pipein = (p_id_t)-1;
+#endif
 	new -> flags = flags;
 
 	return(new);
@@ -3054,7 +3064,7 @@
 	new = (redirectlist *)malloc2(sizeof(redirectlist));
 	new -> fd = fd;
 	new -> filename = filename;
-	new -> type = (u_char)type;
+	new -> type = (u_short)type;
 	new -> new = new -> old = -1;
 #ifdef	DEP_DOSDRIVE
 	new -> fakepipe = NULL;
@@ -3452,8 +3462,13 @@
 static VOID NEAR closeredirect(rp)
 redirectlist *rp;
 {
+#ifndef	USEFAKEPIPE
+	heredoc_t *hdp;
+#endif
+
 	if (!rp) return;
 	closeredirect(rp -> next);
+	if (rp -> type & MD_DUPL) return;
 
 	if ((rp -> type & MD_WITHERR) && rp -> fd != STDOUT_FILENO) {
 		if (rp -> fd != STDERR_FILENO) {
@@ -3468,7 +3483,14 @@
 		safeclose(rp -> old);
 	}
 	if (rp -> new >= 0) {
-		if (rp -> type & MD_HEREDOC) closepipe2(rp -> new, -1);
+		if (rp -> type & MD_HEREDOC) {
+#ifndef	USEFAKEPIPE
+			hdp = (heredoc_t *)(rp -> filename);
+			if (hdp -> pipein >= (p_id_t)0)
+				VOID_C waitchild(hdp -> pipein, NULL);
+#endif
+			closepipe2(rp -> new, -1);
+		}
 		else if (!(rp -> type & MD_FILEDESC)) safeclose(rp -> new);
 	}
 #ifdef	DEP_DOSDRIVE
@@ -3547,7 +3569,10 @@
 	if (cp) {
 		if (!(hdp -> flags & HD_QUOTED)) {
 			for (i = 0; cp[i]; i++) {
-				if (cp[i] == PMETA && !cp[i + 1]) break;
+				if (cp[i] == PMETA) {
+					if (!cp[i + 1]) break;
+					i++;
+				}
 				else if (iskanji1(cp, i)) i++;
 #ifdef	CODEEUC
 				else if (isekana(cp, i)) i++;
@@ -3617,10 +3642,7 @@
 
 	if (pipein > (p_id_t)0) {
 #ifndef	USEFAKEPIPE
-		if (waitchild(pipein, NULL) != RET_SUCCESS) {
-			closepipe2(fd, -1);
-			return(seterrno(-1));
-		}
+		hdp -> pipein = pipein;
 #endif
 		safeclose(fdin);
 		return(fd);
@@ -3635,7 +3657,9 @@
 		}
 
 		if (!(hdp -> flags & HD_QUOTED) && ret == RET_SUCCESS) {
-			cp = evalvararg(buf, '\'', EA_BACKQ, 1);
+			cp = evalvararg(buf, '\'',
+				EA_STRIPMETA
+				| EA_NOEVALQ | EA_NOEVALDQ | EA_BACKQ, 1);
 			if (!cp) ret = RET_FAIL;
 			free2(buf);
 			buf = cp;
@@ -4492,7 +4516,7 @@
 	if (rp -> type & MD_HEREDOC)
 		filename = (char *)duplheredoc((heredoc_t *)(rp -> filename));
 	else filename = strdup2(rp -> filename);
-	new = newrlist(rp -> fd, filename, rp -> type, next);
+	new = newrlist(rp -> fd, filename, rp -> type | MD_DUPL, next);
 	new -> new = rp -> new;
 	new -> old = rp -> old;
 #ifdef	DEP_DOSDRIVE
@@ -5208,7 +5232,7 @@
 	size = c_allocsize(len + *tptrp + n + 2);
 	if (size > *sp) cp = realloc2(cp, *sp = size);
 	memmove(&(cp[len]), cp, *tptrp);
-	strncpy2(cp, rp -> filename, len);
+	memcpy(cp, rp -> filename, len);
 	*tptrp += len;
 	strncpy2(&(cp[*tptrp]), &(s[*ptrp]), n);
 	*tptrp += n;
@@ -5527,10 +5551,13 @@
 				if ((stype = getparenttype(trp)) != STT_INCASE
 				&& stype != STT_CASEEND)
 					(*ptrp)--;
-				else if (!(s[*ptrp]) || s[*ptrp] == '\n')
+				else if (!s[*ptrp] || s[*ptrp] == '\n')
 					syntaxerrno = ER_UNEXPNL;
 				else if (s[*ptrp] == ')' || s[*ptrp] == '|')
 					(*ptrp)--;
+				else if (s[*ptrp] == PMETA
+				&& (!s[*ptrp + 1] || s[*ptrp] == '\n'))
+					(*ptrp)--;
 				else syntaxerrno = ER_UNEXPTOK;
 			}
 			break;
@@ -7270,11 +7297,17 @@
 int *nump;
 {
 	char **argv;
-	int i, n, f, argc;
+	int i, n, f, argc, noopt;
 
 	argv = (trp -> comm) -> argv;
 	argc = (trp -> comm) -> argc;
 	f = '\0';
+	noopt = 0;
+	if (*opt == '-') {
+		opt++;
+		noopt++;
+	}
+
 	for (n = 1; n < argc; n++) {
 		if (!argv[n] || argv[n][0] != '-') break;
 		if (argv[n][1] == '-' && !(argv[n][2])) {
@@ -7283,12 +7316,15 @@
 		}
 
 		for (i = 1; argv[n][i]; i++) {
-			if (!strchr2(opt, argv[n][i])) {
+			if (strchr2(opt, argv[n][i])) /*EMPTY*/;
+			else if (noopt) break;
+			else {
 				execerror(argv, argv[n], ER_BADOPTIONS, 2);
 				return(-1);
 			}
 			f = argv[n][i];
 		}
+		if (!f) break;
 	}
 	if (nump) *nump = n;
 
@@ -8928,7 +8964,7 @@
 {
 	int i, n, opt;
 
-	if ((opt = tinygetopt(trp, "nN", &n)) < 0) return(RET_FAIL);
+	if ((opt = tinygetopt(trp, "-nN", &n)) < 0) return(RET_FAIL);
 
 	for (i = n; i < (trp -> comm) -> argc; i++) {
 		if (i > n) Xfputc(' ', Xstdout);
@@ -10287,11 +10323,9 @@
 	int ret;
 
 	if (!command) {
-		if (stree) {
-			freestree(stree);
-			free2(stree);
-			stree = trp = NULL;
-		}
+		freestree(stree);
+		free2(stree);
+		stree = trp = NULL;
 		return(0);
 	}
 
@@ -10319,10 +10353,11 @@
 static int NEAR _dosystem(command)
 CONST char *command;
 {
-	syntaxtree *trp;
+	static syntaxtree *trp = NULL;
 	int ret;
 
-	if (!(trp = analyzeline(command))) ret = RET_SYNTAXERR;
+	if (!command) ret = 0;
+	else if (!(trp = analyzeline(command))) ret = RET_SYNTAXERR;
 	else {
 		if (notexec) {
 			ret = RET_SUCCESS;
@@ -10335,10 +10370,11 @@
 			ret = RET_FAIL;
 #endif
 		else ret = exec_stree(trp, 0);
-		freestree(trp);
-		free2(trp);
+		errorexit = tmperrorexit;
 	}
-	errorexit = tmperrorexit;
+	freestree(trp);
+	free2(trp);
+	trp = NULL;
 
 	return((ret >= 0) ? ret : RET_FAIL);
 }
@@ -10392,9 +10428,9 @@
 		tv.tv_usec = 500000L;	/* maybe enough waiting limit */
 		VOID_C readselect(1, &fd, NULL, &tv);
 #endif
-		nownstree(trp);
 	}
 	else {
+		nownstree(trp);
 		if (!trp) ret_status = RET_SYNTAXERR;
 		else if (!(trp -> comm)) ret_status = RET_SUCCESS;
 		else if (notexec) {
diff -u ../old/FD-3.00a/system.h ./system.h
--- ../old/FD-3.00a/system.h	Sat Jun 21 00:00:00 2008
+++ ./system.h	Fri Jun 27 01:25:32 2008
@@ -125,6 +125,9 @@
 	char *filename;
 	char *buf;
 	int fd;
+#ifndef	USEFAKEPIPE
+	p_id_t pipein;
+#endif
 	u_char flags;
 } heredoc_t;
 
@@ -134,7 +137,7 @@
 typedef struct _redirectlist {
 	int fd;
 	char *filename;
-	u_char type;
+	u_short type;
 	int new;
 	int old;
 #ifdef	DEP_DOSDRIVE
@@ -154,6 +157,7 @@
 #define	MD_HEREDOC		0040
 #define	MD_FORCED		0100
 #define	MD_REST			0200
+#define	MD_DUPL			0400
 
 typedef struct _command_t {
 	hashlist *hash;
---- Cut Here ----

                                               しらい たかし