Some more good stuff from coolo.
authorRichard Sharpe <sharpe@samba.org>
Fri, 4 Apr 2003 23:39:16 +0000 (23:39 +0000)
committerRichard Sharpe <sharpe@samba.org>
Fri, 4 Apr 2003 23:39:16 +0000 (23:39 +0000)
source/libsmb/cliconnect.c
source/libsmb/libsmbclient.c
source/utils/smbtree.c

index 75dcd62c2f37e88a62689a86c3b31bba49d9265a..4bfa694e63477afc51252507fe90a44e033794f8 100644 (file)
@@ -1384,3 +1384,74 @@ NTSTATUS cli_raw_tcon(struct cli_state *cli,
 
        return NT_STATUS_OK;
 }
+
+/* Return a cli_state pointing at the IPC$ share for the given server */
+
+struct cli_state *get_ipc_connect(char *server, struct in_addr *server_ip,
+                                         struct user_auth_info *user_info)
+{
+        struct cli_state *cli;
+        pstring myname;
+       NTSTATUS nt_status;
+
+        get_myname(myname);
+       
+       nt_status = cli_full_connection(&cli, myname, server, server_ip, 0, "IPC$", "IPC", 
+                                       user_info->username, lp_workgroup(), user_info->password, 
+                                       CLI_FULL_CONNECTION_ANNONYMOUS_FALLBACK, NULL);
+
+       if (NT_STATUS_IS_OK(nt_status)) {
+               return cli;
+       } else if (is_ipaddress(server)) {
+           /* windows 9* needs a correct NMB name for connections */
+           fstring remote_name;
+
+           if (name_status_find("*", 0, 0, *server_ip, remote_name)) {
+               cli = get_ipc_connect(remote_name, server_ip, user_info);
+               if (cli)
+                   return cli;
+           }
+       }
+       return NULL;
+}
+
+/* Return the IP address and workgroup of a master browser on the 
+   network. */
+
+struct cli_state *get_ipc_connect_master_ip_bcast(pstring workgroup, struct user_auth_info *user_info)
+{
+       struct in_addr *ip_list;
+       struct cli_state *cli;
+       int i, count;
+       struct in_addr server_ip; 
+
+        /* Go looking for workgroups by broadcasting on the local network */ 
+
+        if (!name_resolve_bcast(MSBROWSE, 1, &ip_list, &count)) {
+                return False;
+        }
+
+       for (i = 0; i < count; i++) {
+               static fstring name;
+
+               if (!name_status_find("*", 0, 0x1d, ip_list[i], name))
+                       continue;
+
+                if (!find_master_ip(name, &server_ip))
+                       continue;
+
+                pstrcpy(workgroup, name);
+
+                DEBUG(4, ("found master browser %s, %s\n", 
+                          name, inet_ntoa(ip_list[i])));
+
+               cli = get_ipc_connect(inet_ntoa(server_ip), &server_ip, user_info);
+
+               if (!cli)
+                   continue;
+               
+               return cli;
+       }
+
+       return NULL;
+}
index acbde95b91432881525b18b75b44b310bd8934e7..c04736d8f59a19653cf693bb0541d5615bb1d8b5 100644 (file)
@@ -1476,43 +1476,6 @@ dir_list_fn(file_info *finfo, const char *mask, void *state)
 
 }
 
-
-/* Return the IP address and workgroup of a master browser on the 
-   network. */
-
-static BOOL find_master_ip_bcast(pstring workgroup, struct in_addr *server_ip)
-{
-       struct in_addr *ip_list;
-       int i, count;
-
-        /* Go looking for workgroups by broadcasting on the local network */ 
-
-        if (!name_resolve_bcast(MSBROWSE, 1, &ip_list, &count)) {
-                return False;
-        }
-
-       for (i = count-1; i < count; i++) {
-               static fstring name;
-
-               DEBUG(0, ("name_status_find %d %s\n", i, inet_ntoa(ip_list[i])));
-
-               if (!name_status_find("*", 0, 0x1d, ip_list[i], name))
-                       continue;
-
-                if (!find_master_ip(name, server_ip))
-                       continue;
-
-                pstrcpy(workgroup, name);
-
-                DEBUG(4, ("found master browser %s, %s\n", 
-                          name, inet_ntoa(ip_list[i])));
-
-                return True;
-       }
-
-       return False;
-}
-
 static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname)
 {
        fstring server, share, user, password;
@@ -1568,9 +1531,8 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname)
 
        if (server[0] == (char)0) {
            struct in_addr server_ip;
-               DEBUG(4, ("empty server\n"));
                if (share[0] != (char)0 || path[0] != (char)0) {
-                   DEBUG(4,("share %d path %d\n", share[0], path[0]));
+
                        errno = EINVAL;
                        if (dir) {
                                SAFE_FREE(dir->fname);
@@ -1585,22 +1547,41 @@ static SMBCFILE *smbc_opendir_ctx(SMBCCTX *context, const char *fname)
 
                pstrcpy(workgroup, lp_workgroup());
 
-               if (!find_master_ip(lp_workgroup(), &server_ip)) {
+               if (!find_master_ip(workgroup, &server_ip)) {
+                   struct user_auth_info u_info;
+                   struct cli_state *cli;
+
                    DEBUG(4, ("Unable to find master browser for workgroup %s\n", 
                              workgroup));
-                   if (!find_master_ip_bcast(workgroup, &server_ip)) {
+
+                   /* find the name of the server ... */
+                   pstrcpy(u_info.username, user);
+                   pstrcpy(u_info.password, password);
+
+                   if (!(cli = get_ipc_connect_master_ip_bcast(workgroup, &u_info))) {
                        DEBUG(4, ("Unable to find master browser by "
                                  "broadcast\n"));
                        errno = ENOENT;
                        return NULL;
                    }
+
+                   fstrcpy(server, cli->desthost);
+
+                   cli_shutdown(cli);
+               } else {
+                   if (!name_status_find("*", 0, 0, server_ip, server)) {
+                       errno = ENOENT;
+                       return NULL;
+                   }
                }       
 
+               DEBUG(4, ("using workgroup %s %s\n", workgroup, server));
+
                /*
                 * Get a connection to IPC$ on the server if we do not already have one
                 */
 
-               srv = smbc_server(context, inet_ntoa(server_ip), "IPC$", workgroup, user, password);
+               srv = smbc_server(context, server, "IPC$", workgroup, user, password);
 
                if (!srv) {
                   
index d245c324dd5c5e73e485ee8fa9b7690470b9e20a..cbe1bd448f8b9ed2bb240590025d83a339b578df 100644 (file)
@@ -65,67 +65,6 @@ static void add_name(const char *machine_name, uint32 server_type,
         DLIST_ADD(*name_list, new_name);
 }
 
-/* Return a cli_state pointing at the IPC$ share for the given server */
-
-static struct cli_state *get_ipc_connect(char *server, struct in_addr *server_ip,
-                                         struct user_auth_info *user_info)
-{
-        struct cli_state *cli;
-        pstring myname;
-       NTSTATUS nt_status;
-
-        get_myname(myname);
-       
-       nt_status = cli_full_connection(&cli, myname, server, server_ip, 0, "IPC$", "IPC", 
-                                       user_info->username, lp_workgroup(), user_info->password, 
-                                       CLI_FULL_CONNECTION_ANNONYMOUS_FALLBACK, NULL);
-
-       if (NT_STATUS_IS_OK(nt_status)) {
-               return cli;
-       } else {
-               return NULL;
-       }
-}
-
-/* Return the IP address and workgroup of a master browser on the 
-   network. */
-
-static struct cli_state *get_ipc_connect_master_ip_bcast(pstring workgroup, struct user_auth_info *user_info)
-{
-       struct in_addr *ip_list;
-       struct cli_state *cli;
-       int i, count;
-       struct in_addr server_ip; 
-
-        /* Go looking for workgroups by broadcasting on the local network */ 
-
-        if (!name_resolve_bcast(MSBROWSE, 1, &ip_list, &count)) {
-                return False;
-        }
-
-       for (i = 0; i < count; i++) {
-               static fstring name;
-
-               if (!name_status_find("*", 0, 0x1d, ip_list[i], name))
-                       continue;
-
-                if (!find_master_ip(name, &server_ip))
-                       continue;
-
-                pstrcpy(workgroup, name);
-
-                DEBUG(4, ("found master browser %s, %s\n", 
-                          name, inet_ntoa(ip_list[i])));
-
-               if (!(cli = get_ipc_connect(inet_ntoa(server_ip), &server_ip, user_info)))
-                               continue;
-                       
-                       return cli;
-       }
-
-       return NULL;
-}
-
 /****************************************************************************
   display tree of smb workgroups, servers and shares
 ****************************************************************************/