Ich habe eine application which uses Perl's gethostbyname
to check if a hostname exists in DNS. Ich möchte den Quellcode der Anwendung, die nicht von mir geschrieben wurde, nicht patchen. Aber ich überlege, gethostbyname
in einer der Perl-geschriebenen Konfigurationsdateien zu überschreiben.Ist es möglich, Gethostbyname in Perl zu überschreiben oder zu affen, damit es IPv6 unterstützt?
Also frage ich mich, ob es eine Chance gibt, diese Funktion zu überschreiben, indem man sie irgendwie monkey-patchen.
Die 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
Bisher habe ich versucht:
$ 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
Und:.
$ 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
(Ich habe auch versucht main
statt *
und replace
statt add
replace
gerettet wie folgt: Replacing *::gethostbyname: must already exist at /usr/share/perl5/Monkey/Patch/Action.pm line 31.
)
Im zweiten Abschnitt benötigen Sie nur 'uses subs qw (gethostbyname);'. – ikegami
Im dritten Snippet denke ich, dass '' patch_package '' mit 'BEGIN' versehen werden kann. – ikegami
Aber wahrscheinlich möchten Sie von außerhalb des Moduls, das die Aufrufe von 'gethostbyname' hat (oder Sie würden einfach die richtige sub aufrufen). Sie können das tun, indem Sie Ihre Überschreibung 'CORE :: GLOBAL :: gethostbyname' benennen (bevor das Modul mit' gethostbyname' geladen wird). Siehe [Überschreiben von integrierten Funktionen] (https://perldoc.perl.org/perlsub.html#Overriding-Built-in-Functions). Sie können 'caller' verwenden, um die Überschreibung nur für ausgewählte Module bereitzustellen. – ikegami