[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00201] Re: FDClone の HP-UX 対応について(2.03b)
- Subject: [FDclone-users:00201] Re: FDClone の HP-UX 対応について(2.03b)
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Wed, 28 May 2003 23:53:19 +0900
しらいです。
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 を吐い
てそのまま死なせてやればいいでしょうかね。
しらい たかし