diff options
Diffstat (limited to 'source3/nsswitch/wins.c')
-rw-r--r-- | source3/nsswitch/wins.c | 51 |
1 files changed, 25 insertions, 26 deletions
diff --git a/source3/nsswitch/wins.c b/source3/nsswitch/wins.c index 9bb2d6755c..2133f817d1 100644 --- a/source3/nsswitch/wins.c +++ b/source3/nsswitch/wins.c @@ -80,10 +80,14 @@ static void nss_wins_init(void) DEBUGLEVEL = 0; AllowDebugChange = False; + /* needed for lp_xx() functions */ + charset_initialise(); + TimeInit(); setup_logging("nss_wins",False); lp_load(dyn_CONFIGFILE,True,False,False); load_interfaces(); + codepage_initialise(lp_client_code_page()); } static struct node_status *lookup_byaddr_backend(char *addr, int *count) @@ -111,10 +115,10 @@ static struct node_status *lookup_byaddr_backend(char *addr, int *count) static struct in_addr *lookup_byname_backend(const char *name, int *count) { - int fd = -1; + int fd; struct in_addr *ret = NULL; struct in_addr p; - int j, flags = 0; + int j; if (!initialised) { nss_wins_init(); @@ -122,24 +126,33 @@ static struct in_addr *lookup_byname_backend(const char *name, int *count) *count = 0; - /* always try with wins first */ - if (resolve_wins(name,0x20,&ret,count)) { - return ret; - } - fd = wins_lookup_open_socket_in(); - if (fd == -1) { + if (fd == -1) return NULL; + + p = wins_srv_ip(); + if( !is_zero_ip(p) ) { + ret = name_query(fd,name,0x20,False,True, p, count); + goto out; + } + + if (lp_wins_support()) { + /* we are our own WINS server */ + ret = name_query(fd,name,0x20,False,True, *interpret_addr2("127.0.0.1"), count); + goto out; } /* uggh, we have to broadcast to each interface in turn */ - for (j=iface_count() - 1;j >= 0;j--) { + for (j=iface_count() - 1; + j >= 0; + j--) { struct in_addr *bcast = iface_n_bcast(j); - ret = name_query(fd,name,0x20,True,True,*bcast,count, &flags, NULL); + ret = name_query(fd,name,0x20,True,True,*bcast,count); if (ret) break; } -out: + out: + close(fd); return ret; } @@ -306,19 +319,5 @@ _nss_wins_gethostbyname_r(const char *name, struct hostent *he, return NSS_STATUS_SUCCESS; } - - -NSS_STATUS -_nss_wins_gethostbyname2_r(const char *name, int af, struct hostent *he, - char *buffer, size_t buflen, int *errnop, - int *h_errnop) -{ - if(af!=AF_INET) { - *h_errnop = NO_DATA; - *errnop = EAFNOSUPPORT; - return NSS_STATUS_UNAVAIL; - } - - return _nss_wins_gethostbyname_r(name,he,buffer,buflen,errnop,h_errnop); -} #endif + |