diff options
| -rw-r--r-- | source3/libsmb/namequery.c | 61 | 
1 files changed, 60 insertions, 1 deletions
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index 52ff6287c4..81dadebd3b 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -108,7 +108,7 @@ static BOOL internal_name_status(int fd,char *name,int name_type,BOOL recurse,  {    BOOL found=False;    int retries = 2; -  int retry_time = 5000; +  int retry_time = 2000;    struct timeval tval;    struct packet_struct p;    struct packet_struct *p2; @@ -822,12 +822,70 @@ BOOL find_master_ip(char *group, struct in_addr *master_ip)  	return False;  } +#if !defined(I_HATE_WINDOWS_REPLY_CODE) +/******************************************************** + Internal function to extract the MACHINE<0x20> name. +*********************************************************/ + +static void _lookup_pdc_name(char *p, char *master,char *rname) +{ +  int numnames = CVAL(p,0); + +  *rname = '\0'; + +  p += 1; +  while (numnames--) { +    int type = CVAL(p,15); +    if(type == 0x20) { +      StrnCpy(rname,p,15); +      trim_string(rname,NULL," "); +      return; +    } +    p += 18; +  } +} +#endif /* I_HATE_WINDOWS_REPLY_CODE */  /********************************************************   Lookup a PDC name given a Domain name and IP address.  *********************************************************/ +  BOOL lookup_pdc_name(const char *srcname, const char *domain, struct in_addr *pdc_ip, char *ret_name)  { +#if !defined(I_HATE_WINDOWS_REPLY_CODE) + +  fstring pdc_name; +  BOOL ret; + +  /* +   * Due to the fact win WinNT *sucks* we must do a node status +   * query here... JRA. +   */ + +  int sock = open_socket_in(SOCK_DGRAM, 0, 3, interpret_addr(lp_socket_address()), True ); + +  if(sock == -1) +    return False; + +  *pdc_name = '\0'; + +  ret = internal_name_status(sock,"*SMBSERVER",0x20,True, +		 *pdc_ip,NULL,pdc_name,False,_lookup_pdc_name); + +  close(sock); + +  if(ret && *pdc_name) { +    fstrcpy(ret_name, pdc_name); +    return True; +  } + +  return False; + +#else /* defined(I_HATE_WINDOWS_REPLY_CODE) */ + +JRA - This code is broken with BDC rollover - we need to do a full +NT GETDC call, UNICODE, NT domain SID and uncle tom cobbley and all... +  	int retries = 3;  	int retry_time = 2000;  	struct timeval tval; @@ -998,6 +1056,7 @@ BOOL lookup_pdc_name(const char *srcname, const char *domain, struct in_addr *pd  	close(sock);  	return False; +#endif /* defined(I_HATE_WINDOWS_REPLY_CODE) */  }  | 
