私は与えられた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番目のスニペットで必要なのは、 'use subs qw(gethostbyname);'です。 – ikegami
3番目のスニペットでは、 'BEGIN'を使って' patch_package'をラッピングすると思います。 – ikegami
しかし、おそらく 'gethostbyname'の呼び出しを持つモジュールの外側からパッチを適用したいと思うかもしれません。あなたは 'CORE :: GLOBAL :: gethostbyname'(' gethostbyname'を使ってモジュールがロードされる前に)をオーバーライドすることでそれを行うことができます。 [組み込み関数のオーバーライド](https://perldoc.perl.org/perlsub.html#Overriding-Built-in-Functions)を参照してください。 'caller'を使って、モジュールを選択するためのオーバーライドのみを提供することができます。 – ikegami