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

[FDclone-users:00109] Re: {FreeBSD,OpenBSD}/sparc64, IA64



 しらいです。

In Message-Id <8665sp9zhw.wl@archon.local.idaemons.org>
        "Akinori MUSHA" <knu@iDaemons.org>さんwrites:
>  FreeBSD/sparc64 や OpenBSD/sparc64 で FDclone 2.02a をビルド
> して実行すると、
> 
> $ ./fd
> [1] + Stopped (tty input)  ./fd 
> $ ./fdsh
> [2] + Stopped (tty input)  ./fd 
> 
> のようにバックグラウンドに回されてしまいます。(fdbsh は動いた)

 knu さんから remote 環境をお貸しして頂いてこの件は修正完了
しました。まずは patch をつけます。

---- Cut Here ----
diff -u FD-2.02a/system.h ./system.h
--- FD-2.02a/system.h	Wed Nov 20 09:44:57 2002
+++ ./system.h	Mon Feb 17 02:27:11 2003
@@ -47,15 +47,20 @@
 #define	Xsigblock(o,m)	((o) = sigblock(m))
 #endif	/* !USESIGPMASK */
 
+#ifdef	POSIX
+#define	gettcpgrp(f, g)	(g = tcgetpgrp(f))
+#define	settcpgrp(f, g)	tcsetpgrp(f, g)
+#else
 #ifdef	TIOCGPGRP
 #define	gettcpgrp(f, g)	((ioctl(f, TIOCGPGRP, &g) < 0) ? (g = -1) : g)
 #else
-#define	gettcpgrp(f, g)	(g = tcgetpgrp(f))
+#define	gettcpgrp(f, g)	(-1)
 #endif
 #ifdef	TIOCSPGRP
 #define	settcpgrp(f, g)	ioctl(f, TIOCSPGRP, &(g))
 #else
-#define	settcpgrp(f, g)	tcsetpgrp(f, g)
+#define	settcpgrp(f, g)	(-1)
+#endif
 #endif
 
 #if	!MSDOS
---- Cut Here ----


>  i386 や alpha ではこうならず、またOS側に端末周りなどの基本的な
> 部分で arch 間の差があるとも考えにくいので、 FDclone 側に何か
> 原因がある気がしています。

 long が 64bits もあったのが敗因でした。ioctl(TIOCGPGRP) で
変数の pointer を指定して値を代入させるのですが、ioctl() 側
では多分 32bits 分の代入しか行なっていないために、64bits サ
イズの変数にはうまく代入出来ていないようです。
 bug は bug なのですが、little endian CPU では下 32bits が
同じ値になり、また printf() 等では下 32bits 分しか使われない
ため、おかしな代入値になっていることに気づきにくい状況となっ
ていました。

 本質的な対策としては、long ではなくて pid_t にするという対
処にすべきなのですが、上記 patch では場あたり的な対処として、
ioctl() の代わりに tcgetpgrp() 関数を使うようにして逃げてい
ます。
 この関数は POSIX 標準関数なので、POSIX OS ではこれを優先し
て使うことにしました。

 2.02b での正式な対応としては、この修正に加えて、念のために
pid_t を使うようにしました。
 POSIX OS かもしくは waitpid() が実装されている環境では、多
分 pid_t が定義されている筈なので、それ以外の環境でのみ従来
どおり long を用いることにします。


P.S.
 ひょっとすると、AIX でも上記 patch が効果あったりはしませ
んか?

                                               しらい たかし