こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Patchの当て方について

Apacheのパッチの当てたいのですが、うまくいきません。
下記のURLを見て、当てようと思っています。
http://www.ossexpo.net/2009/11/solaris10-apache-2214segmentat.html

作業手順
cd /work/src/httpd-2.2.14/srclib/apr/poll/unix
bash-3.00# ls
epoll.c kqueue.c patch poll.o port.lo select.lo
epoll.lo kqueue.lo poll.c port.c port.o select.o
epoll.o kqueue.o poll.lo port.c.rej select.c test.patch
bash-3.00# patch -p0 < test.patch
結合されたコンテキスト diff のようです。
パッチを適用するファイル: port.c
逆方向の (あるいは以前に適用された) パッチが検出されました。-R と仮定します。[yes]
適用しますか? [no]
1 番目のパッチ内容を 0 行目で無視しました。
1 個のうち 1 個のパッチ内容を無視しました: 適用されなかったパッチを port.c.rej に保存します。
該当する場所にはパッチが見当たりません。

そもそも、やり方が間違っているのでしょうか?
cat test.patch
--- work/src/httpd-2.2.14/srclib/apr/poll/unix/port.c 2009/08/24 15:05:59 807269
+++ work/src/httpd-2.2.14/srclib/apr/poll/unix/port.c 2009/10/26 14:02:41 829803
@@ -101,8 +101,11 @@
}

ret = port_getn(port, list, max, nget, tvptr);
+ /* Note: 32-bit port_getn() on Solaris 10 x86 returns large negative
+ * values instead of 0 when returning immediately.
+ */

- if (ret < 0) {
+ if (ret == -1) {
rv = apr_get_netos_error();

switch(rv) {

勉強不足で申し訳ありませんが、教えていただけたら幸いです。
よろしくお願いします。

投稿日時 - 2009-11-29 19:56:00

QNo.5485675

すぐに回答ほしいです

質問者が選んだベストアンサー

> こちらの方で対処しよう思うんですが、
>>あと差分が少ないので、直接手で port.c を編修(俗に手パッチという)してもよいのでは?

C言語をご存知かどうか分かりませんので冗長な説明かも知れませんが、ご了承下さい。

+ /* Note: 32-bit port_getn() on Solaris 10 x86 returns large negative
+ * values instead of 0 when returning immediately.
+ */

パッチの上記部分は C言語のコメントなので追加しなくてもよいです。

- if (ret < 0) {
+ if (ret == -1) {

実質意味のある変更は上記の部分だけなので、 "< 0" を "== -1" に変えるだけです。

> 現状のport.cファイルを確認したところ、特に変える必要が無いような
> 気がします。

上記の「現状のport.c」とは httpd-2.2.14 のオリジナルのファイルではなく、なにかしら操作した後のファイルという認識でよいですか?

tarball から改めて port.c を取り出してみると分かりますが、少なくともオリジナルのファイルは該当箇所が、

if (ret < 0) {

となっているので、何かしら操作してしているうちにパッチがあたってしまったのではないでしょうか?

気になるなら、オリジナルの port.c と「現状の port.c」の差分をとってパッチファイルと一致しているか確認すればよいでしょう。

> パッチを当てる必要がないと言うことですよね?

少なくとも私が確認した限りにおいては、パッチはあてる必要があります。(なお、GNU patch コマンドでしか試していません。)

投稿日時 - 2009-11-29 22:39:17

お礼

xinuさん

>tarball から改めて port.c を取り出してみると分かりますが、少なく>と.もオリジナルのファイルは該当箇所が、
>if (ret < 0) {
>となっているので、何かしら操作してしているうちにパッチがあたってし>まったのではないでしょうか?
>気になるなら、オリジナルの port.c と「現状の port.c」の差分をとって>パッチファイルと一致しているか確認すればよいでしょう。

確かに、再度、tarから展開したら、if (ret < 0)になってました。
失礼いたしました。その後、編集し、再度、再コンパイルし
確認したところ、エラーが出なくなりました。
本当にありがとうございました。

投稿日時 - 2009-11-29 23:28:09

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(2)

> cd /work/src/httpd-2.2.14/srclib/apr/poll/unix
> bash-3.00# patch -p0 < test.patch
> cat test.patch
> --- work/src/httpd-2.2.14/srclib/apr/poll/unix/port.c 2009/08/24 15:05:59 807269
> +++ work/src/httpd-2.2.14/srclib/apr/poll/unix/port.c 2009/10/26 14:02:41 829803

上記の通りディレクトリ /work/src/httpd-2.2.14/srclib/apr/poll/unix で patch コマンドを実行しているのなら、-p0 ではなく -p7 とすべきです。
-p オプションの意味をよく確認しましょう。
(work/src/httpd-2.2.14/srclib/apr/poll/unix/port.c から削除すべき / の数を指定するのですよ。)

また、GNU patch (/usr/bin/gpatch)の方を使用しないと、うまくパッチが当たらないかもしれません。

あと差分が少ないので、直接手で port.c を編修(俗に手パッチという)してもよいのでは?

投稿日時 - 2009-11-29 20:22:35

補足

質問があります。
こちらの方で対処しよう思うんですが、
>あと差分が少ないので、直接手で port.c を編修(俗に手パッチという)してもよいのでは?

現状のport.cファイルを確認したところ、特に変える必要が無いような
気がします。間違っていたら申し訳ありません。

教えていただいたURLからのパッチファイル
@@ -101,8 +101,11 @@
}

ret = port_getn(port, list, max, nget, tvptr);
+ /* Note: 32-bit port_getn() on Solaris 10 x86 returns large negative
+ * values instead of 0 when returning immediately.
+ */

- if (ret < 0) {
+ if (ret == -1) {
rv = apr_get_netos_error();

switch(rv) {

現状のport.cファイル

ret = port_getn(port, list, max, nget, tvptr);
/* Note: 32-bit port_getn() on Solaris 10 x86 returns large negative
* values instead of 0 when returning immediately.
*/

if (ret == -1) {
rv = apr_get_netos_error();

switch(rv) {

パッチを当てる必要がないと言うことですよね?
質問とは、別なものになっているようであれば、新規投稿で聞いてみます。
よろしくお願いします。

投稿日時 - 2009-11-29 21:55:58

あなたにオススメの質問