[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00799] Re: configure 時のエラーについて
- Subject: [FDclone-users:00799] Re: configure 時のエラーについて
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Fri, 27 Jun 2008 02:10:09 +0900
しらいです。
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 ----
しらい たかし