diff options
Diffstat (limited to 'source/nsswitch/winbindd_wins.c')
-rw-r--r-- | source/nsswitch/winbindd_wins.c | 70 |
1 files changed, 34 insertions, 36 deletions
diff --git a/source/nsswitch/winbindd_wins.c b/source/nsswitch/winbindd_wins.c index af624170eb4..ca21ccb4853 100644 --- a/source/nsswitch/winbindd_wins.c +++ b/source/nsswitch/winbindd_wins.c @@ -1,5 +1,6 @@ /* - Unix SMB/CIFS implementation. + Unix SMB/Netbios implementation. + Version 2.0 Winbind daemon - WINS related functions @@ -94,7 +95,7 @@ static struct in_addr *lookup_byname_backend(const char *name, int *count) return NULL; p = wins_srv_ip(); - if( !is_zero_ip(p) ) { + if( !zero_ip(p) ) { ret = name_query(fd,name,0x20,False,True, p, count); goto out; } @@ -124,42 +125,42 @@ static struct in_addr *lookup_byname_backend(const char *name, int *count) enum winbindd_result winbindd_wins_byip(struct winbindd_cli_state *state) { - fstring response; - int i, count, maxlen, size; + char response[1024]; + int i, count, len, size, maxsize; struct node_status *status; DEBUG(3, ("[%5d]: wins_byip %s\n", state->pid, - state->request.data.winsreq)); + state->request.data.name)); *response = '\0'; - maxlen = sizeof(response) - 1; + maxsize = len = sizeof(response) - 1; - if ((status = lookup_byaddr_backend(state->request.data.winsreq, &count))){ - size = strlen(state->request.data.winsreq); - if (size > maxlen) { + if ((status = lookup_byaddr_backend(state->request.data.name, &count))){ + size = strlen(state->request.data.name) + 1; + if (size > len) { SAFE_FREE(status); return WINBINDD_ERROR; } - safe_strcat(response,state->request.data.winsreq,maxlen); - safe_strcat(response,"\t",maxlen); + len -= size; + safe_strcat(response,state->request.data.name,maxsize); + safe_strcat(response,"\t",maxsize); 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) { + size = sizeof(status[i].name) + 1; + if (size > len) { SAFE_FREE(status); return WINBINDD_ERROR; } - safe_strcat(response, status[i].name, maxlen); - safe_strcat(response, " ", maxlen); + len -= size; + safe_strcat(response, status[i].name, maxsize); + safe_strcat(response, " ", maxsize); } } - /* make last character a newline */ - response[strlen(response)-1] = '\n'; SAFE_FREE(status); } - fstrcpy(state->response.data.winsresp,response); + fstrcpy(state->response.data.name.name,response); return WINBINDD_OK; } @@ -168,43 +169,40 @@ enum winbindd_result winbindd_wins_byip(struct winbindd_cli_state *state) enum winbindd_result winbindd_wins_byname(struct winbindd_cli_state *state) { struct in_addr *ip_list; - int i, count, maxlen, size; - fstring response; + int i, count, len, size, maxsize; + char response[1024]; char * addr; DEBUG(3, ("[%5d]: wins_byname %s\n", state->pid, - state->request.data.winsreq)); + state->request.data.name)); *response = '\0'; - maxlen = sizeof(response) - 1; + maxsize = len = sizeof(response) - 1; - if ((ip_list = lookup_byname_backend(state->request.data.winsreq,&count))){ + if ((ip_list = lookup_byname_backend(state->request.data.name,&count))){ for (i = count; i ; i--) { addr = inet_ntoa(ip_list[i-1]); - size = strlen(addr); - if (size > maxlen) { + size = strlen(addr) + 1; + if (size > len) { SAFE_FREE(ip_list); return WINBINDD_ERROR; } - if (i != 0) { - /* Clear out the newline character */ - response[strlen(response)-1] = ' '; - } - safe_strcat(response,addr,maxlen); - safe_strcat(response,"\t",maxlen); + len -= size; + safe_strcat(response,addr,maxsize); + safe_strcat(response," ",maxsize); } - size = strlen(state->request.data.winsreq) + strlen(response); - if (size > maxlen) { + size = strlen(state->request.data.name) + 1; + if (size > len) { SAFE_FREE(ip_list); return WINBINDD_ERROR; } - safe_strcat(response,state->request.data.winsreq,maxlen); - safe_strcat(response,"\n",maxlen); + response[strlen(response)-1] = '\t'; + safe_strcat(response,state->request.data.name,maxsize); SAFE_FREE(ip_list); } else return WINBINDD_ERROR; - fstrcpy(state->response.data.winsresp,response); + fstrcpy(state->response.data.name.name,response); return WINBINDD_OK; } |