summaryrefslogtreecommitdiffstats
path: root/source/nsswitch/winbindd_wins.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/nsswitch/winbindd_wins.c')
-rw-r--r--source/nsswitch/winbindd_wins.c70
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;
}