void winbindd_wins_byip(struct winbindd_cli_state *state) { fstring response; int i, count, maxlen, size; struct node_status *status; /* Ensure null termination */ state->request->data.winsreq[sizeof(state->request->data.winsreq)-1]='\0'; DEBUG(3, ("[%5lu]: wins_byip %s\n", (unsigned long)state->pid, state->request->data.winsreq)); *response = '\0'; maxlen = sizeof(response) - 1; if ((status = lookup_byaddr_backend( state->mem_ctx, state->request->data.winsreq, &count))) { size = strlen(state->request->data.winsreq); if (size > maxlen) { TALLOC_FREE(status); request_error(state); return; } fstrcat(response,state->request->data.winsreq); fstrcat(response,"\t"); for (i = 0; i < count; i++) { /* ignore group names */ if (status[i].flags & 0x80) continue; if (status[i].type == 0x20) { size = sizeof(status[i].name) + strlen(response); if (size > maxlen) { TALLOC_FREE(status); request_error(state); return; } fstrcat(response, status[i].name); fstrcat(response, " "); } } /* make last character a newline */ response[strlen(response)-1] = '\n'; TALLOC_FREE(status); } fstrcpy(state->response->data.winsresp,response); request_ok(state); }
enum winbindd_result winbindd_wins_byip(struct winbindd_cli_state *state) { fstring response; int i, count, maxlen, size; struct node_status *status; DEBUG(3, ("[%5d]: wins_byip %s\n", state->pid, state->request.data.winsreq)); *response = '\0'; maxlen = sizeof(response) - 1; if ((status = lookup_byaddr_backend(state->request.data.winsreq, &count))){ size = strlen(state->request.data.winsreq); if (size > maxlen) { SAFE_FREE(status); return WINBINDD_ERROR; } safe_strcat(response,state->request.data.winsreq,maxlen); safe_strcat(response,"\t",maxlen); for (i = 0; i < count; i++) { /* ignore group names */ if (status[i].flags & 0x80) continue; if (status[i].type == 0x20) { size = sizeof(status[i].name) + strlen(response); if (size > maxlen) { SAFE_FREE(status); return WINBINDD_ERROR; } safe_strcat(response, status[i].name, maxlen); safe_strcat(response, " ", maxlen); } } /* make last character a newline */ response[strlen(response)-1] = '\n'; SAFE_FREE(status); } fstrcpy(state->response.data.winsresp,response); return WINBINDD_OK; }
int lookup(nsd_file_t *rq) { char *map; char *key; char *addr; int i, count, len, size; char response[1024]; bool found = False; nsd_logprintf(NSD_LOG_MIN, "entering lookup (wins)\n"); if (! rq) return NSD_ERROR; map = nsd_attr_fetch_string(rq->f_attrs, "table", (char*)0); if (! map) { rq->f_status = NS_FATAL; return NSD_ERROR; } key = nsd_attr_fetch_string(rq->f_attrs, "key", (char*)0); if (! key || ! *key) { rq->f_status = NS_FATAL; return NSD_ERROR; } response[0] = '\0'; len = sizeof(response) - 2; /* * response needs to be a string of the following format * ip_address[ ip_address]*\tname[ alias]* */ if (strcasecmp_m(map,"hosts.byaddr") == 0) { char *name; name = lookup_byaddr_backend(key); if (name != NULL) { size = strlen(key) + 1; if (size > len) { return NSD_ERROR; } len -= size; strncat(response,key,size); strncat(response,"\t",1); size = strlen(name) + 1; if (size > len) { return NSD_ERROR; } len -= size; strncat(response, name, size); strncat(response, " ", 1); found = True; } response[strlen(response)-1] = '\n'; } else if (strcasecmp_m(map,"hosts.byname") == 0) { char *ip; ip = lookup_byname_backend(key); if (ip != NULL) { size = strlen(ip) + 1; if (size > len) { wbcFreeMemory(ip); return NSD_ERROR; } len -= size; strncat(response,ip,size); strncat(response,"\t",1); size = strlen(key) + 1; wbcFreeMemory(ip); if (size > len) { return NSD_ERROR; } strncat(response,key,size); strncat(response,"\n",1); found = True; } } if (found) { nsd_logprintf(NSD_LOG_LOW, "lookup (wins %s) %s\n",map,response); nsd_set_result(rq,NS_SUCCESS,response,strlen(response),VOLATILE); return NSD_OK; } nsd_logprintf(NSD_LOG_LOW, "lookup (wins) not found\n"); rq->f_status = NS_NOTFOUND; return NSD_NEXT; }