*** nss.c.orig 2021-05-11 02:25:39.000000000 +0100 --- nss.c 2022-08-02 08:35:23.090458158 +0100 *************** *** 81,86 **** --- 81,104 ---- } } + static enum nss_status _convert_avahi_result(avahi_resolve_result_t r, int* errnop, int* h_errnop) { + switch (r) { + case AVAHI_RESOLVE_RESULT_SUCCESS: + return NSS_STATUS_SUCCESS; + + case AVAHI_RESOLVE_RESULT_HOST_NOT_FOUND: + *errnop = ETIMEDOUT; + *h_errnop = HOST_NOT_FOUND; + return NSS_STATUS_NOTFOUND; + + case AVAHI_RESOLVE_RESULT_UNAVAIL: + default: + *errnop = ETIMEDOUT; + *h_errnop = NO_RECOVERY; + return NSS_STATUS_UNAVAIL; + } + } + enum nss_status _nss_mdns_gethostbyname_impl(const char* name, int af, userdata_t* u, int* errnop, int* h_errnop) { *************** *** 123,150 **** if (mdns_allow_file) fclose(mdns_allow_file); #endif - if (!name_allowed) { *errnop = EINVAL; *h_errnop = NO_RECOVERY; return NSS_STATUS_UNAVAIL; } ! switch (do_avahi_resolve_name(af, name, u)) { ! case AVAHI_RESOLVE_RESULT_SUCCESS: ! return NSS_STATUS_SUCCESS; ! ! case AVAHI_RESOLVE_RESULT_HOST_NOT_FOUND: ! *errnop = ETIMEDOUT; ! *h_errnop = HOST_NOT_FOUND; ! return NSS_STATUS_NOTFOUND; ! ! case AVAHI_RESOLVE_RESULT_UNAVAIL: ! default: ! *errnop = ETIMEDOUT; ! *h_errnop = NO_RECOVERY; ! return NSS_STATUS_UNAVAIL; ! } } #ifndef __FreeBSD__ --- 141,166 ---- if (mdns_allow_file) fclose(mdns_allow_file); #endif if (!name_allowed) { + if (!strstr(name, ".")) { + const char *p="local"; + int fullnamesize; + char *fullname; + fullnamesize = strlen(name) + strlen(p) + 2; + if ((fullname = malloc(fullnamesize))){ + avahi_resolve_result_t r; + snprintf(fullname, fullnamesize, "%s.%s", name, p); + r = do_avahi_resolve_name(af, fullname, u); + free(fullname); + return _convert_avahi_result(r, errnop, h_errnop); + } + } *errnop = EINVAL; *h_errnop = NO_RECOVERY; return NSS_STATUS_UNAVAIL; } ! return _convert_avahi_result(do_avahi_resolve_name(af, name, u), errnop, h_errnop); } #ifndef __FreeBSD__