nss_status_t _nscd_doorcall(int callnum) { size_t buflen; nss_pheader_t *phdr; void *dptr; size_t ndata; size_t adata; int ret; char *me = "_nscd_doorcall"; _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "processing door call %d ...\n", callnum); /* allocate door buffer from the stack */ NSCD_ALLOC_DOORBUF(callnum, 0, dptr, buflen); ndata = buflen; adata = buflen; ret = _nsc_trydoorcall(&dptr, &ndata, &adata); if (ret != NSS_SUCCESS) { phdr = (nss_pheader_t *)dptr; _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door call (%d) failed (status = %d, error = %s)\n", callnum, ret, strerror(NSCD_GET_ERRNO(phdr))); } return (ret); }
struct hostent * _door_gethostbyaddr_r(const char *addr, int length, int type, struct hostent *result, char *buffer, int buflen, int *h_errnop) { /* * allocate space on the stack for the nscd to return * host and host alias information */ union { nsc_data_t s_d; char s_b[8192]; } space; nsc_data_t *sptr; int ndata; int adata; struct hostent *resptr = NULL; if (addr == NULL) { if (h_errnop) *h_errnop = HOST_NOT_FOUND; return (NULL); } ndata = sizeof (space); adata = length + sizeof (nsc_call_t) + 1; sptr = &space.s_d; space.s_d.nsc_call.nsc_callnumber = GETHOSTBYADDR; space.s_d.nsc_call.nsc_u.addr.a_type = type; space.s_d.nsc_call.nsc_u.addr.a_length = length; (void) memcpy(space.s_d.nsc_call.nsc_u.addr.a_data, addr, length); switch (_nsc_trydoorcall(&sptr, &ndata, &adata)) { case SUCCESS: /* positive cache hit */ break; case NOTFOUND: /* negative cache hit */ if (h_errnop) *h_errnop = space.s_d.nsc_ret.nsc_errno; return (NULL); default: return ((struct hostent *)_switch_gethostbyaddr_r(addr, length, type, result, buffer, buflen, h_errnop)); } resptr = process_gethost(result, buffer, buflen, h_errnop, sptr); /* * check if doors realloced buffer underneath of us.... * munmap it or suffer a memory leak */ if (sptr != &space.s_d) { munmap((char *)sptr, ndata); /* return memory */ } return (resptr); }
struct hostent * _door_gethostbyname_r(const char *name, struct hostent *result, char *buffer, int buflen, int *h_errnop) { /* * allocate space on the stack for the nscd to return * host and host alias information */ union { nsc_data_t s_d; char s_b[8192]; } space; nsc_data_t *sptr; int ndata; int adata; struct hostent *resptr = NULL; if ((name == NULL) || (strlen(name) >= (sizeof (space) - sizeof (nsc_data_t)))) { errno = ERANGE; if (h_errnop) *h_errnop = HOST_NOT_FOUND; return (NULL); } adata = (sizeof (nsc_call_t) + strlen(name) + 1); ndata = sizeof (space); space.s_d.nsc_call.nsc_callnumber = GETHOSTBYNAME; (void) strcpy(space.s_d.nsc_call.nsc_u.name, name); sptr = &space.s_d; switch (_nsc_trydoorcall(&sptr, &ndata, &adata)) { case SUCCESS: /* positive cache hit */ break; case NOTFOUND: /* negative cache hit */ if (h_errnop) *h_errnop = space.s_d.nsc_ret.nsc_errno; return (NULL); default: return ((struct hostent *)_switch_gethostbyname_r(name, result, buffer, buflen, h_errnop)); } resptr = process_gethost(result, buffer, buflen, h_errnop, sptr); /* * check if doors realloced buffer underneath of us.... * munmap or suffer a memory leak */ if (sptr != &space.s_d) { munmap((char *)sptr, ndata); /* return memory */ } return (resptr); }
nss_status_t _nscd_doorcall_data(int callnum, void *indata, int indlen, void *outdata, int outdlen, nss_pheader_t *phdr) { void *uptr; size_t buflen; void *dptr; void *datap; size_t ndata; size_t adata; nss_pheader_t *phdr_d; int ret; char *me = "_nscd_doorcall_data"; _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "processing door call %d ...\n", callnum); /* allocate door buffer from the stack */ NSCD_ALLOC_DOORBUF(callnum, indlen, uptr, buflen); dptr = uptr; ndata = buflen; adata = buflen; datap = NSCD_N2N_DOOR_DATA(void, dptr); if (indata != NULL) (void) memmove(datap, indata, indlen); ret = _nsc_trydoorcall(&dptr, &ndata, &adata); phdr_d = (nss_pheader_t *)dptr; if (ret != NSS_SUCCESS) { _NSCD_LOG(NSCD_LOG_FRONT_END, NSCD_LOG_LEVEL_DEBUG) (me, "door call (%d) failed (status = %d, error = %s)\n", callnum, ret, strerror(NSCD_GET_ERRNO(phdr_d))); } else { if (phdr != NULL) { NSCD_COPY_STATUS(phdr, phdr_d); } ret = copy_output(outdata, outdlen, phdr_d, phdr); } /* if new buffer allocated for this door call, free it */ if (dptr != uptr) (void) munmap(dptr, ndata); return (ret); }