sandbox:main signal SIGQUIT already had a handler ...

なんか emerge すると前から出てたけど。

$ ebuild sandbox-1.6-r2.ebuild unpack 
 * sandbox-1.6.tar.lzma RMD160 SHA1 SHA256 size ;-) ...                  [ ok ]
 * checking ebuild checksums ;-) ...                                     [ ok ]
 * checking auxfile checksums ;-) ...                                    [ ok ]
 * checking miscfile checksums ;-) ...                                   [ ok ]
 * checking sandbox-1.6.tar.lzma ;-) ...                                 [ ok ]
 * CPV:  sys-apps/sandbox-1.6-r2
 * REPO: 
 * USE:  amd64 elibc_glibc kernel_linux multilib userland_GNU
sandbox:main  signal SIGQUIT already had a handler ...

>>> Unpacking source...
>>> Unpacking sandbox-1.6.tar.lzma to /var/tmp/portage/sys-apps/sandbox-1.6-r2/work
 * Applying sandbox-1.6-disable-qa-static.patch ...                       [ ok ]
 * Applying sandbox-1.6-disable-pthread.patch ...                         [ ok ]
 * Applying 0001-libsandbox-handle-more-at-functions.patch ...            [ ok ]
>>> Source unpacked in /var/tmp/portage/sys-apps/sandbox-1.6-r2/work

表示が邪魔なだけで特にコレといった致命的な不具合ではない感じなので放っておいたんだけど、最近やたらと出るようになって。さすがに気になったので調べてみました。

バグなのかなぁ? コレを見た感じだとパッチも出ています。パッチの中身を見る限り警告文を出すところをいじっているだけのようなので、当ててみても特に重大な問題は引き起こさないだろうと判断して当ててみます。

オーバーレイを作る

ローカルオーバーレイ用のディレクトリを作ります。私の場合 /usr/local/portage/original/ というディレクトリにオリジナルオーバーレイを作っていますので、ここに本家 sys-apps/sandbox の中身をそのままコピーしてきます。

$ cd /usr/local/portage/original/               ←ローカルオーバーレイの場所
$ mkdir sys-apps                                ←sys-apps カテゴリを作る。すでにある場合は無視
$ cd sys-apps
$ cp -a /usr/portage/sys-apps/sandbox/ ./       ←本家のものを持ってくる

パッチを作る

作ると行っても、ココにあるパッチをコピー、上の2行だけちょっと改変してこんなパッチを書くだけ…。

−-- sandbox-1.6/src/sandbox.c
+++ sandbox-1.6/src/sandbox.c
@@ -131,7 +131,7 @@ static void stop(int signum)
 {
        if (0 == stop_called) {
                stop_called = 1;
-               sb_warn("caught signal %d in pid %d\n", signum, getpid());
+               sb_warn("caught signal %d in pid %d", signum, getpid());
        } else
                sb_warn("signal already caught and busy still cleaning up!");
 }
@@ -316,9 +316,9 @@ int main(int argc, char **argv)
        do { \
                sighandler_t _old = signal(sig, act); \
                if (_old == SIG_ERR) \
-                       sb_pwarn("unable to bind signal %s\n", #sig); \
−               else if (_old != SIG_DFL) \
−                       sb_warn("signal %s already had a handler ...\n", #sig); \
+                       sb_pwarn("unable to bind signal %s", #sig); \
+               else if (_old != SIG_DFL && _old != SIG_IGN) \
+                       sb_warn("signal %s already had a handler ...", #sig); \
        } while (0)
        wsignal(SIGINT, &stop);
        wsignal(SIGQUIT, &stop);

パッチファイルは sandbox-1.6-gentoobug-285341.patch という名前でさっき作ったローカルオーバーレイの files ディレクトリに入れておきます。

ebuildスクリプトにパッチを当てる

保存したパッチを当ててくれるように ebuild スクリプトを修正します。1行追加するだけです。

$ nano -w /usr/local/portage/original/sys-apps/sandbox/sandbox-1.6-r2.ebuild

epatch "${FILESDIR}"/${P}-gentoobug-285341.patch
↑ この1行を unpack の epatch の中に追加


パッチファイルで書くとこんな感じ。

--- /usr/portage/sys-apps/sandbox/sandbox-1.6-r2.ebuild 2009-09-09 03:06:55.000000000 +0900
+++ /usr/local/portage/original/sys-apps/sandbox/sandbox-1.6-r2.ebuild  2010-03-20 01:23:48.000000000 +0900
@@ -37,6 +37,7 @@
        epatch "${FILESDIR}"/${P}-disable-qa-static.patch
        epatch "${FILESDIR}"/${P}-disable-pthread.patch
        epatch "${FILESDIR}"/0001-libsandbox-handle-more-at-functions.patch
+       epatch "${FILESDIR}"/${P}-gentoobug-285341.patch
 }

 src_compile() {

ebuild の digest を更新する

ebuild はファイルの改変とかをチェックしていますので、コレを更新しときます。

$ ebuild /usr/local/portage/original/sys-apps/sandbox/sandbox-1.6-r2.ebuild digest

テストする

パッチがちゃんと当たるかテストしておきます。

$ ebuild /usr/local/portage/original/sys-apps/sandbox/sandbox-1.6-r2.ebuild unpack


ちなみに、展開場所は PORTAGE_TMPDIR 変数で指定されます。デフォルトだと /var/tmp です。テストなので変更したい!とかいう場合はこんな感じにするとそちらに展開されます。

$ PORTAGE_TMPDIR="~/tmp" ebuild /usr/local/portage/original/sys-apps/sandbox/sandbox-1.6-r2.ebuild unpack

実際にマージする

実際にマージする場合 PORTDIR_OVERLAY 変数を与えます。

$ sudo PORTDIR_OVELAY="/usr/local/portage/original/" emerge -v sandbox

PORTDIR_OVERLAY 変数は /etc/make.conf に書いてもいいです。私はそうしています。

当てた結果

今のところ変な症状は出ていません。…これから出ないとも限りませんけどね。(笑)