2017-09-19 9 views
0

私は与えられたapplication which uses Perl's gethostbyname to check if a hostname exists in DNSを持っています。私は私の書かれていないアプリケーションのソースコードにパッチを当てたくない。しかし、私はPerlで書かれた設定ファイルの一つにgethostbynameを上書きすることを考えています。Perlでgethostbynameを上書きしたり、monkey-patchでIPv6対応にすることはできますか?

だから私はその機能を何らかの方法で猿のパッチで上書きする機会があるのだろうかと思います。

documentation of that application says that its hostname lookups work as follows

$ perl -e 'print(gethostbyname("ipv6.google.com") ? "ok\n" : "not found\n");' 
not found 

は、これまでのところ、私が試した:

$ perl -E 'use Socket qw(:DEFAULT getaddrinfo); sub gethostbyname { my ($err, @result) = getaddrinfo(@_); return @result; }; print(gethostbyname("ipv6.google.com") ? "ok\n" : "not found\n");' 
not found 

そして:

$ perl -E 'use Socket qw(:DEFAULT getaddrinfo); use Monkey::Patch::Action qw(patch_package); patch_package("*", "gethostbyname", "add", sub { my ($err, @result) = getaddrinfo(@_); return @result; }); print(gethostbyname("ipv6.google.com") ? "ok\n" : "not found\n");' 
not found 

を(私もmain代わりの*replaceの代わりaddを試してみました。次のようには救済:Replacing *::gethostbyname: must already exist at /usr/share/perl5/Monkey/Patch/Action.pm line 31.

+2

2番目のスニペットで必要なのは、 'use subs qw(gethostbyname);'です。 – ikegami

+0

3番目のスニペットでは、 'BEGIN'を使って' patch_package'をラッピングすると思います。 – ikegami

+2

しかし、おそらく 'gethostbyname'の呼び出しを持つモジュールの外側からパッチを適用したいと思うかもしれません。あなたは 'CORE :: GLOBAL :: gethostbyname'(' gethostbyname'を使ってモジュールがロードされる前に)をオーバーライドすることでそれを行うことができます。 [組み込み関数のオーバーライド](https://perldoc.perl.org/perlsub.html#Overriding-Built-in-Functions)を参照してください。 'caller'を使って、モジュールを選択するためのオーバーライドのみを提供することができます。 – ikegami

答えて

3

TL; TR:それは、これはIPv6の準備ができて、この特定のコードを作るあなたの実際の問題を解決していないことを説明する代わりにすることをやって)が、助けるべきgethostbyname(既存のコメントをオーバーライドする方法を説明していません。


まず、IPv6対応のgethostbynameは何を返すべきですか? IPv4では、パックされたIPv4アドレスを返します。これは、コードgethostbynameを呼び出すことによって期待されます。そのようなコードには通常sockaddr_inPF_INETソケットなどが使用されますが、IPv6の場合はとPF_INET6を使用する必要があります。つまり、gethostbynameにパッチを当てるだけでは不十分です。

さらにコードを見て、これを修正する必要があります。質問の中で定義された値を返すかどうかを確認するgethostbynameの呼び出しにリンクしただけです。しかし、further in the codeと表示された場合は、inet_atonPF_INETソケットなどの明示的な使用、つまりIPv4のみのアドレスとみなされます。

+0

これをキャッチしていただきありがとうございます。私は急いでいたわけではありませんでしたが、それが答えの代わりにコメントを投稿した理由です:) – ikegami

+0

それを深く掘り下げていただきありがとうございます。ホスト名が解決するかどうかだけを調べているので、戻り値の実際の型は無関係です。 –

関連する問題