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

[FDclone-users:00201] Re: FDClone の HP-UX 対応について(2.03b)



 しらいです。

 HP の test drive に登録して実機で確認してみました。

In Message-Id <03May18.141434jst.119050@inetgw.lightwell.co.jp>
        SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>さんwrites:
> 潮田です。

> >  この他に stty -a の結果も示して下さい。tostop になっている
> > 場合、それは FDclone の仕業ではなくて端末設定がそのように指
> > 定されていることに依存します。

> となっていますので、 -tostop です。
> また、 fdbsh では普通にコマンドが実行できますので...

 これ、考えてみたら全然別の話ですね。ここで SIGTTOU で停止
させられているのは background job ではなく foreground job で
すので、tostop は関係ありませんでした。


> tostop にしてから、 ./fd, ./fdsh, ./fdbsh を試すと、
> ./fd は起動後、何もせず終了でも -tostop になりました。
> (fdsh, fdbsh は tostop で変化なし)

 これはどうやら HP-UX の shell の仕業のようです。標準 shell
上では stty tostop 状態には出来ないようです。多分 ./fd が起
動される前から -tostop に戻っているんでしょう。
 ./fdbsh 上から stty -> ./fd と行なうと stty tostop に出来
ると思います。多分 command line 実行後に強制的に端末を戻して
いるのかと。


 で。問題の本質は別のところにあり、鬼子の HP-UX は SVR4 扱
いにして貰えなかったために tcsetpgrp() を使えない状態になっ
ていたのでした。
 その場合は TIOCSPGRP を使うようになっているのですが、この
ioctl は BSD 由来のため HP-UX では未定義なのです。その結果、
current process group に端末を渡そうとすると常に失敗していた
という訳です。
 この実装は 2.02b で他の 64bit OS 用に対処したものなので、
この箇所を 2.02a 以前の実装に戻せば HP-UX でも無事動くように
なると思います。
 以下に patch を示します。

---- Cut Here ----
diff -u FD-2.03b/system.h ./system.h
--- FD-2.03b/system.h	Thu May 15 00:00:00 2003
+++ ./system.h	Wed May 28 23:28:22 2003
@@ -47,20 +47,15 @@
 #define	Xsigblock(o,m)	((o) = sigblock(m))
 #endif	/* !USESIGPMASK */
 
-#ifdef	USETERMIOS
+#ifdef	TIOCGPGRP
+#define	gettcpgrp(f, g)	((ioctl(f, TIOCGPGRP, &g) < 0) ? (g = -1) : g)
+#else
 #define	gettcpgrp(f, g)	(g = tcgetpgrp(f))
-#define	settcpgrp(f, g)	tcsetpgrp(f, g)
+#endif
+#ifdef	TIOCSPGRP
+#define	settcpgrp(f, g)	ioctl(f, TIOCSPGRP, &(g))
 #else
-# ifdef	TIOCGPGRP
-# define	gettcpgrp(f, g)	((ioctl(f, TIOCGPGRP, &g) < 0) ? (g = -1) : g)
-# else
-# define	gettcpgrp(f, g)	(-1)
-# endif
-# ifdef	TIOCSPGRP
-# define	settcpgrp(f, g)	ioctl(f, TIOCSPGRP, &(g))
-# else
-# define	settcpgrp(f, g)	(-1)
-# endif
+#define	settcpgrp(f, g)	tcsetpgrp(f, g)
 #endif
 
 #if	!MSDOS
---- Cut Here ----

 敗因の一つは tcsetpgrp() の返り値を見ていなかったことにも
ありますので、今後はこの返り値を見て、失敗したらその時点で即
error で落とすようにしようと思います。
 基本的には失敗しない関数なので、失敗したら message を吐い
てそのまま死なせてやればいいでしょうかね。

                                               しらい たかし