/scripts/

len != 0) resultbuf->canon = (char *) (resultbuf->family + resultbuf->naddrs); else resultbuf->canon = NULL; if (respdata == NULL) { /* Read the data from the socket. */ if ((size_t) __readall (sock, resultbuf + 1, datalen) == datalen) { retval = 0; *result = resultbuf; } else { free (resultbuf); *h_errnop = NETDB_INTERNAL; } } else { /* Copy the data in the block. */ memcpy (resultbuf + 1, respdata, datalen); /* Try to detect corrupt databases. */ if (resultbuf->canon != NULL && resultbuf->canon[ai_resp.canonlen - 1] != '\0') /* We cannot use the database. */ { if (mapped->head->gc_cycle != gc_cycle) retval = -2; else free (resultbuf); goto out_close; } retval = 0; *result = resultbuf; } } else { if (__builtin_expect (ai_resp.found == -1, 0)) { /* The daemon does not cache this database. */ __nss_not_use_nscd_hosts = 1; goto out_close; } /* Store the error number. */ *h_errnop = ai_resp.error; /* Set errno to 0 to indicate no error, just no found record. */ __set_errno (0); /* Even though we have not found anything, the result is zero. */ retval = 0; } out_close: if (sock != -1) close_not_cancel_no_status (sock); out: if (__nscd_drop_map_ref (mapped, &gc_cycle) != 0) { /* When we come here this means there has been a GC cycle while we were looking for the data. This means the data might have been inconsistent. Retry if possible. */ if ((gc_cycle & 1) != 0 || ++nretries == 5 || retval == -1) { /* nscd is just running gc now. Disable using the mapping. */ if (atomic_decrement_val (&mapped->counter) == 0) __nscd_unmap (mapped); mapped = NO_MAPPING; } if (retval != -1) { *result = NULL; free (resultbuf); goto retry; } } return retval; }