J'ai un application which uses Perl's gethostbyname
to check if a hostname exists in DNS donné. Je ne veux pas patcher le code source de cette application non écrite par moi. Mais je pense à écraser gethostbyname
dans l'un des fichiers de configuration écrits en Perl.Est-il possible d'écraser ou d'obtenir gethostbyname de monkey-patch en Perl pour qu'il prenne en charge IPv6?
Alors je me demande s'il y a une chance d'écraser cette fonction en la corrigeant d'une manière ou d'une autre.
Le 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
Jusqu'à présent, j'essayé:
$ 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
Et:
$ 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
(j'ai aussi essayé main
au lieu de *
et replace
au lieu de add
.renflouées comme suit: Replacing *::gethostbyname: must already exist at /usr/share/perl5/Monkey/Patch/Action.pm line 31.
)
Dans le deuxième extrait, tout ce dont vous avez besoin est 'use subs qw (gethostbyname);'. – ikegami
Dans le troisième extrait, je pense que l'emballage 'patch_package' avec un' BEGIN' fera l'affaire. – ikegami
Mais vous voulez probablement corriger depuis l'extérieur du module qui a les appels à 'gethostbyname' (ou vous appelleriez simplement le bon sous à la place). Vous pouvez le faire en nommant votre remplacement 'CORE :: GLOBAL :: gethostbyname' (avant que le module utilisant' gethostbyname' soit chargé). Voir [Remplacement des fonctions intégrées] (https://perldoc.perl.org/perlsub.html#Overriding-Built-in-Functions). Vous pouvez utiliser 'caller' pour fournir uniquement le remplacement de certains modules. – ikegami