X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnss-myhostname%2Fnss-myhostname.c;h=dcf7c1f5de025d561094b400c0172aed4d91aaf0;hb=d920e59c7df63300e5b5191d2a4be7b3baac6ea8;hp=bf1e31113713be7e7e6289b49c02394ea9013ad5;hpb=a3eca41994de42f5448b35e8815d3009b2b5df38;p=elogind.git diff --git a/src/nss-myhostname/nss-myhostname.c b/src/nss-myhostname/nss-myhostname.c index bf1e31113..dcf7c1f5d 100644 --- a/src/nss-myhostname/nss-myhostname.c +++ b/src/nss-myhostname/nss-myhostname.c @@ -47,6 +47,13 @@ NSS_GETHOSTBYNAME_PROTOTYPES(myhostname); NSS_GETHOSTBYADDR_PROTOTYPES(myhostname); +static bool is_gateway(const char *hostname) { + assert(hostname); + + return streq(hostname, "gateway") || + streq(hostname, "gateway."); +} + enum nss_status _nss_myhostname_gethostbyname4_r( const char *name, struct gaih_addrtuple **pat, @@ -77,6 +84,18 @@ enum nss_status _nss_myhostname_gethostbyname4_r( canonical = "localhost"; local_address_ipv4 = htonl(INADDR_LOOPBACK); + + } else if (is_gateway(name)) { + + n_addresses = local_gateways(NULL, 0, AF_UNSPEC, &addresses); + if (n_addresses <= 0) { + *errnop = ENOENT; + *h_errnop = HOST_NOT_FOUND; + return NSS_STATUS_NOTFOUND; + } + + canonical = "gateway"; + } else { hn = gethostname_malloc(); if (!hn) { @@ -92,7 +111,7 @@ enum nss_status _nss_myhostname_gethostbyname4_r( return NSS_STATUS_NOTFOUND; } - n_addresses = local_addresses(&addresses); + n_addresses = local_addresses(NULL, 0, AF_UNSPEC, &addresses); if (n_addresses < 0) n_addresses = 0; @@ -165,6 +184,11 @@ enum nss_status _nss_myhostname_gethostbyname4_r( if (ttlp) *ttlp = 0; + /* Explicitly reset all error variables */ + *errnop = 0; + *h_errnop = NETDB_SUCCESS; + h_errno = 0; + return NSS_STATUS_SUCCESS; } @@ -289,6 +313,11 @@ static enum nss_status fill_in_hostent( if (canonp) *canonp = r_name; + /* Explicitly reset all error variables */ + *errnop = 0; + *h_errnop = NETDB_SUCCESS; + h_errno = 0; + return NSS_STATUS_SUCCESS; } @@ -304,7 +333,7 @@ enum nss_status _nss_myhostname_gethostbyname3_r( _cleanup_free_ struct local_address *addresses = NULL; const char *canonical, *additional = NULL; _cleanup_free_ char *hn = NULL; - uint32_t local_address_ipv4; + uint32_t local_address_ipv4 = 0; int n_addresses = 0; assert(name); @@ -325,6 +354,18 @@ enum nss_status _nss_myhostname_gethostbyname3_r( if (is_localhost(name)) { canonical = "localhost"; local_address_ipv4 = htonl(INADDR_LOOPBACK); + + } else if (is_gateway(name)) { + + n_addresses = local_gateways(NULL, 0, af, &addresses); + if (n_addresses <= 0) { + *errnop = ENOENT; + *h_errnop = HOST_NOT_FOUND; + return NSS_STATUS_NOTFOUND; + } + + canonical = "gateway"; + } else { hn = gethostname_malloc(); if (!hn) { @@ -339,7 +380,7 @@ enum nss_status _nss_myhostname_gethostbyname3_r( return NSS_STATUS_NOTFOUND; } - n_addresses = local_addresses(&addresses); + n_addresses = local_addresses(NULL, 0, af, &addresses); if (n_addresses < 0) n_addresses = 0; @@ -415,16 +456,42 @@ enum nss_status _nss_myhostname_gethostbyaddr2_r( } - n_addresses = local_addresses(&addresses); - if (n_addresses < 0) - n_addresses = 0; + n_addresses = local_addresses(NULL, 0, AF_UNSPEC, &addresses); + if (n_addresses > 0) { + for (a = addresses, n = 0; (int) n < n_addresses; n++, a++) { + if (af != a->family) + continue; - for (a = addresses, n = 0; (int) n < n_addresses; n++, a++) { - if (af != a->family) - continue; + if (memcmp(addr, &a->address, FAMILY_ADDRESS_SIZE(af)) == 0) { - if (memcmp(addr, &a->address, FAMILY_ADDRESS_SIZE(af)) == 0) - goto found; + hn = gethostname_malloc(); + if (!hn) { + *errnop = ENOMEM; + *h_errnop = NO_RECOVERY; + return NSS_STATUS_TRYAGAIN; + } + + canonical = hn; + goto found; + } + } + } + + free(addresses); + addresses = NULL; + + n_addresses = local_gateways(NULL, 0, AF_UNSPEC, &addresses); + if (n_addresses > 0) { + for (a = addresses, n = 0; (int) n < n_addresses; n++, a++) { + if (af != a->family) + continue; + + if (memcmp(addr, &a->address, FAMILY_ADDRESS_SIZE(af)) == 0) { + + canonical = "gateway"; + goto found; + } + } } *errnop = ENOENT; @@ -433,16 +500,6 @@ enum nss_status _nss_myhostname_gethostbyaddr2_r( return NSS_STATUS_NOTFOUND; found: - if (!canonical) { - hn = gethostname_malloc(); - if (!hn) { - *errnop = ENOMEM; - *h_errnop = NO_RECOVERY; - return NSS_STATUS_TRYAGAIN; - } - - canonical = hn; - } return fill_in_hostent( canonical, additional,