From 85e4cab1d949f1ab9ce04b96de0b8d1c8113df67 Mon Sep 17 00:00:00 2001 From: Derrell Lipman Date: Sun, 25 Dec 2005 21:46:58 +0000 Subject: [PATCH] r12485: r12044@cabra: derrell | 2005-12-25 16:46:47 -0500 When enumerating what could be a server name or a workgroup name, first check for an existing server structure. If none exists, then go through the previous determination of whether it's a serrver or a workgroup. This should avoid doing a NetBIOS name query each time, if we've already connected to the specified server. (While we're at it, clean up indenting and line length in this area of code.) --- source/libsmb/libsmbclient.c | 160 +++++++++++++++++++++++-------------------- 1 file changed, 87 insertions(+), 73 deletions(-) diff --git a/source/libsmb/libsmbclient.c b/source/libsmb/libsmbclient.c index d2d45a72284..b81dd88424c 100644 --- a/source/libsmb/libsmbclient.c +++ b/source/libsmb/libsmbclient.c @@ -2509,10 +2509,10 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname) * Server not an empty string ... Check the rest and see what * gives */ - if (share[0] == (char)0) { - - if (path[0] != (char)0) { /* Should not have empty share with path */ + if (*share == '\0') { + if (*path != '\0') { + /* Should not have empty share with path */ errno = EINVAL + 8197; if (dir) { SAFE_FREE(dir->fname); @@ -2522,12 +2522,28 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname) } - /* Check to see if <1D>, <1B>, or <20> translates */ - /* However, we check to see if is an IP address first */ + /* + * We don't know if is really a server name + * or is a workgroup/domain name. If we already have + * a server structure for it, we'll use it. + * Otherwise, check to see if <1D>, + * <1B>, or <20> translates. We check + * to see if is an IP address first. + */ + + /* See if we have an existing server */ + srv = smbc_server(context, server, "IPC$", + workgroup, user, password); + + /* + * If no existing server and not an IP addr, look for + * LMB or DMB + */ + if (!srv && + !is_ipaddress(server) && + (resolve_name(server, &rem_ip, 0x1d) || /* LMB */ + resolve_name(server, &rem_ip, 0x1b) )) { /* DMB */ - if (!is_ipaddress(server) && /* Not an IP addr so check next */ - (resolve_name(server, &rem_ip, 0x1d) || /* Found LMB */ - resolve_name(server, &rem_ip, 0x1b) )) { /* Found DMB */ fstring buserver; dir->dir_type = SMBC_SERVER; @@ -2535,22 +2551,23 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname) /* * Get the backup list ... */ + if (!name_status_find(server, 0, 0, + rem_ip, buserver)) { - - if (!name_status_find(server, 0, 0, rem_ip, buserver)) { - - DEBUG(0, ("Could not get name of local/domain master browser for server %s\n", server)); - errno = EPERM; /* FIXME, is this correct */ + DEBUG(0, ("Could not get name of " + "local/domain master browser " + "for server %s\n", server)); + errno = EPERM; return NULL; } /* - * Get a connection to IPC$ on the server if we do not already have one - */ - - srv = smbc_server(context, buserver, "IPC$", workgroup, user, password); - + * Get a connection to IPC$ on the server if + * we do not already have one + */ + srv = smbc_server(context, buserver, "IPC$", + workgroup, user, password); if (!srv) { DEBUG(0, ("got no contact to IPC$\n")); if (dir) { @@ -2564,8 +2581,8 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname) dir->srv = srv; /* Now, list the servers ... */ - - if (!cli_NetServerEnum(&srv->cli, server, 0x0000FFFE, list_fn, + if (!cli_NetServerEnum(&srv->cli, server, + 0x0000FFFE, list_fn, (void *)dir)) { if (dir) { @@ -2573,75 +2590,72 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname) SAFE_FREE(dir); } return NULL; - } - } - else { - - if (resolve_name(server, &rem_ip, 0x20)) { - - /* Now, list the shares ... */ - - dir->dir_type = SMBC_FILE_SHARE; - - srv = smbc_server(context, server, "IPC$", workgroup, user, password); - - if (!srv) { + } else if (srv || + (resolve_name(server, &rem_ip, 0x20))) { + + /* If we hadn't found the server, get one now */ + if (!srv) { + srv = smbc_server(context, server, + "IPC$", workgroup, + user, password); + } - if (dir) { - SAFE_FREE(dir->fname); - SAFE_FREE(dir); - } - return NULL; + if (!srv) { + if (dir) { + SAFE_FREE(dir->fname); + SAFE_FREE(dir); + } + return NULL; - } + } - dir->srv = srv; + dir->dir_type = SMBC_FILE_SHARE; + dir->srv = srv; - /* Now, list the servers ... */ + /* List the shares ... */ - if (net_share_enum_rpc( - &srv->cli, - list_fn, - (void *) dir) < 0 && - cli_RNetShareEnum( - &srv->cli, - list_fn, - (void *)dir) < 0) { + if (net_share_enum_rpc( + &srv->cli, + list_fn, + (void *) dir) < 0 && + cli_RNetShareEnum( + &srv->cli, + list_fn, + (void *)dir) < 0) { - errno = cli_errno(&srv->cli); - if (dir) { - SAFE_FREE(dir->fname); - SAFE_FREE(dir); - } - return NULL; - - } - - } - else { - - errno = ECONNREFUSED; /* Neither the workgroup nor server exists */ - if (dir) { - SAFE_FREE(dir->fname); - SAFE_FREE(dir); - } - return NULL; - - } + errno = cli_errno(&srv->cli); + if (dir) { + SAFE_FREE(dir->fname); + SAFE_FREE(dir); + } + return NULL; + } + } else { + /* Neither the workgroup nor server exists */ + errno = ECONNREFUSED; + if (dir) { + SAFE_FREE(dir->fname); + SAFE_FREE(dir); + } + return NULL; } } - else { /* The server and share are specified ... work from there ... */ + else { + /* + * The server and share are specified ... work from + * there ... + */ pstring targetpath; struct cli_state *targetcli; - /* Well, we connect to the server and list the directory */ - + /* We connect to the server and list the directory */ dir->dir_type = SMBC_FILE_SHARE; - srv = smbc_server(context, server, share, workgroup, user, password); + srv = smbc_server(context, server, share, + workgroup, user, password); if (!srv) { -- 2.11.4.GIT