Я пытаюсь реализовать пользовательский модуль nss
для поиска getent hosts
. На основе glib c resolv/nss-dns/dns-host.c
и gn unet * src/gns/nss/nss_gns.c
я написал следующую минимальную реализацию, которая, как я надеялся, минимум должна что-то записать в системный журнал - что, к сожалению, не .
#include <netdb.h>
#include <nss.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <syslog.h>
#define _nss_lash_gethostbyname2_r _nss_lash_gethostbyname_r
#define _nss_lash_gethostbyname3_r _nss_lash_gethostbyname_r
#define _nss_lash_gethostbyname4_r _nss_lash_gethostbyname_r
#define _nss_lash_getcanonname_r _nss_lash_gethostbyaddr_r
#define _nss_lash_gethostbyaddr2_r _nss_lash_gethostbyaddr_r
#define _nss_lash_getnetbyname_r _nss_lash_gethostbyaddr_r
#define _nss_lash_getnetbyaddr_r _nss_lash_gethostbyaddr_r
typedef char addr[1];
const addr default_addrs[2] = {0x01, 0x00};
enum nss_status
_nss_lash_gethostbyname_r (const char *name, struct hostent *result,
char *buffer, size_t buflen, int *errnop,
int *h_errnop)
{
syslog(LOG_WARNING, name);
if (!strcmp(name, "lash")) {
return NSS_STATUS_UNAVAIL;
}
*(result->h_aliases) = 0x0;
result->h_addrtype = AF_INET;
result->h_length = 1;
*(result->h_addr_list) = (char *)default_addrs;
*errnop = 0;
*h_errnop = NETDB_SUCCESS;
return NSS_STATUS_SUCCESS;
}
enum nss_status
_nss_lash_gethostbyaddr_r (const char *name, struct hostent *result,
char *buffer, size_t buflen, int *errnop,
int *h_errnop)
{
syslog(LOG_ERR, name);
if (!strcmp(name, "lash")) {
return NSS_STATUS_UNAVAIL;
}
*(result->h_aliases) = 0x0;
result->h_addrtype = AF_INET;
result->h_length = 1;
*(result->h_addr_list) = (char *)default_addrs;
*errnop = 0;
*h_errnop = NETDB_SUCCESS;
return NSS_STATUS_SUCCESS;
}
Я добавил lash
к /etc/nsswitch.conf
. strace
показывает, что файл /lib/libnss_lash.so.2
успешно открывается. Однако возвращаемое значение из поиска nss
равно NSS_UNAVAIL
/ ENOENT
. Если я добавлю [unavail=return]
к /etc/nsswitch.conf
после записи lash
, я получу тот же результат.
У кого-нибудь есть какие-либо признаки того, что мне не хватает?
(#define
* строки пытаются перехватить все символы, найденные в objdump -T /lib/libnss_dns.so
, что представляется более простой реализацией)
Использование:
glibc 2.30
gnunet 0.11.6-ish
nss 3.49.2