From 098b7b378c72632d8c3df0b795ac1e4c5dbfb04a Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Mon, 3 Jul 2000 04:24:31 +0000 Subject: first pass at merging rpcclient from TNG to HEAD. You can get a semi-connection and a rpcclient prompt, but no functionality there yet. Will be a few more days on that. These files changed only with the addition of some support functions from TNG --jerry (This used to be commit a04ea15f723e559db3c60bed03318cc7be851f69) --- source3/libsmb/clientgen.c | 17 +++++++++++++ source3/libsmb/namequery.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++ source3/libsmb/nterr.c | 22 +++++++++++----- source3/libsmb/pwd_cache.c | 9 +++++++ 4 files changed, 105 insertions(+), 6 deletions(-) diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index 32564aaf82..c6f24c5e80 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -150,6 +150,23 @@ static void cli_process_oplock(struct cli_state *cli) cli->outbuf = oldbuf; } +/**************************************************************************** +initialise a client structure +****************************************************************************/ +void cli_init_creds(struct cli_state *cli, const struct ntuser_creds *usr) +{ + /* copy_nt_creds(&cli->usr, usr); */ + safe_strcpy(cli->domain , usr->domain , sizeof(usr->domain )-1); + safe_strcpy(cli->user_name, usr->user_name, sizeof(usr->user_name)-1); + memcpy(&cli->pwd, &usr->pwd, sizeof(usr->pwd)); + cli->ntlmssp_flags = usr->ntlmssp_flags; + cli->ntlmssp_cli_flgs = usr != NULL ? usr->ntlmssp_flags : 0; + + DEBUG(10,("cli_init_creds: user %s domain %s flgs: %x\nntlmssp_cli_flgs:%x\n", + cli->user_name, cli->domain, + cli->ntlmssp_flags,cli->ntlmssp_cli_flgs)); +} + /**************************************************************************** initialise a client structure diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index 5dadd4d474..8fb607bd8f 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -593,6 +593,23 @@ static BOOL resolve_hosts(const char *name, return False; } +/******************************************************** + Resolve a name into an IP address. Use this function if + the string is either an IP address, DNS or host name + or NetBIOS name. This uses the name switch in the + smb.conf to determine the order of name resolution. +*********************************************************/ +BOOL is_ip_address(const char *name) +{ + int i; + for (i=0; name[i]; i++) + if (!(isdigit((int)name[i]) || name[i] == '.')) + return False; + + return True; +} + + /******************************************************** Internal interface to resolve a name into an IP address. Use this function if the string is either an IP address, DNS @@ -686,6 +703,52 @@ BOOL resolve_name(const char *name, struct in_addr *return_ip, int name_type) return False; } + +/******************************************************** + resolve a name of format \\server_name or \\ipaddress + into a name. also, cut the \\ from the front for us. +*********************************************************/ + +BOOL resolve_srv_name(const char* srv_name, fstring dest_host, + struct in_addr *ip) +{ + BOOL ret; + const char *sv_name = srv_name; + + DEBUG(10,("resolve_srv_name: %s\n", srv_name)); + + if (srv_name == NULL || strequal("\\\\.", srv_name)) + { + extern pstring global_myname; + fstrcpy(dest_host, global_myname); + ip = interpret_addr2("127.0.0.1"); + return True; + } + + if (strnequal("\\\\", srv_name, 2)) + { + sv_name = &srv_name[2]; + } + + fstrcpy(dest_host, sv_name); + /* treat the '*' name specially - it is a magic name for the PDC */ + if (strcmp(dest_host,"*") == 0) { + extern pstring global_myname; + ret = resolve_name(lp_workgroup(), ip, 0x1B); + lookup_pdc_name(global_myname, lp_workgroup(), ip, dest_host); + } else { + ret = resolve_name(dest_host, ip, 0x20); + } + + if (is_ip_address(dest_host)) + { + fstrcpy(dest_host, "*SMBSERVER"); + } + + return ret; +} + + /******************************************************** Find the IP address of the master browser or DMB for a workgroup. *********************************************************/ diff --git a/source3/libsmb/nterr.c b/source3/libsmb/nterr.c index 3f19a66941..f9d717477a 100644 --- a/source3/libsmb/nterr.c +++ b/source3/libsmb/nterr.c @@ -519,22 +519,32 @@ nt_err_code_struct nt_errs[] = /***************************************************************************** returns an NT error message. not amazingly helpful, but better than a number. *****************************************************************************/ -char *get_nt_error_msg(uint32 nt_code) +BOOL get_safe_nt_error_msg(uint32 nt_code,char *msg, size_t len) { - static pstring msg; int idx = 0; - pstrcpy(msg, "Unknown NT error"); + slprintf(msg, len-1, "NT code %08x", nt_code); while (nt_errs[idx].nt_errstr != NULL) { if ((nt_errs[idx].nt_errcode & 0xFFFFFF) == (nt_code & 0xFFFFFF)) { - pstrcpy(msg, nt_errs[idx].nt_errstr); - return msg; + safe_strcpy(msg, nt_errs[idx].nt_errstr, len); + return True; } idx++; } - return msg; + return False; } +/***************************************************************************** + returns an NT error message. not amazingly helpful, but better than a number. + *****************************************************************************/ +const char *get_nt_error_msg(uint32 nt_code) +{ + static pstring msg; + get_safe_nt_error_msg(nt_code, msg, sizeof(msg)); + return msg; +} + + diff --git a/source3/libsmb/pwd_cache.c b/source3/libsmb/pwd_cache.c index 1c5f8b5176..26b1d192f0 100644 --- a/source3/libsmb/pwd_cache.c +++ b/source3/libsmb/pwd_cache.c @@ -40,6 +40,15 @@ void pwd_init(struct pwd_info *pwd) pwd->crypted = False; } +/**************************************************************************** +returns NULL password flag +****************************************************************************/ +BOOL pwd_is_nullpwd(const struct pwd_info *pwd) +{ + return pwd->null_pwd; +} + + /**************************************************************************** compares two passwords. hmm, not as trivial as expected. hmm. ****************************************************************************/ -- cgit