[SCM] Samba Shared Repository - branch v3-6-test updated

Jeremy Allison jra at samba.org
Mon May 2 18:26:58 MDT 2011


The branch, v3-6-test has been updated
       via  9bffdda s3: Tune broadcast namequeries for unique names
       via  49bcea3 s3: Make name_resolve_bcast return sockaddr_storage
       via  ae0436d s3: Remove ip_sevice from get_ipc_connect_master_ip
      from  498bb38 Add POSIX O_RDONLY test of a directory for bug #8112 - POSIX extension opens of a directory are denied with EISDIR.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit 9bffdda7f9b8a7e3e36c07f31fae227e2d8a7570
Author: Volker Lendecke <vl at samba.org>
Date:   Mon May 2 23:35:06 2011 +0200

    s3: Tune broadcast namequeries for unique names
    
    If we get a unique name via a broadcast query, there's no point in waiting the
    full timeout. A unique name is just what its name says: unique. No point in
    waiting longer.
    
    Autobuild-User: Volker Lendecke <vlendec at samba.org>
    Autobuild-Date: Tue May  3 00:57:24 CEST 2011 on sn-devel-104
    (cherry picked from commit 8da8c36b53cc115f0d446b666fc24fc9423d808e)

commit 49bcea3c5022e451402005029c187d7dbac6c761
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Apr 30 19:23:55 2011 +0200

    s3: Make name_resolve_bcast return sockaddr_storage
    
    Autobuild-User: Volker Lendecke <vlendec at samba.org>
    Autobuild-Date: Sat Apr 30 20:40:46 CEST 2011 on sn-devel-104
    (cherry picked from commit d87427973c0f43d85546f5875b223929ac1a50d4)

commit ae0436dc7b3cce8fe2e7d9fa5e12deb12cd07f77
Author: Volker Lendecke <vl at samba.org>
Date:   Sat Apr 30 17:10:35 2011 +0200

    s3: Remove ip_sevice from get_ipc_connect_master_ip
    
    Autobuild-User: Volker Lendecke <vlendec at samba.org>
    Autobuild-Date: Sat Apr 30 18:16:28 CEST 2011 on sn-devel-104
    (cherry picked from commit 020b691cf842f30ff42474c2b0102751b5fa17ac)

-----------------------------------------------------------------------

Summary of changes:
 source3/include/proto.h     |    5 +++--
 source3/libsmb/cliconnect.c |   21 ++++++++++++---------
 source3/libsmb/libsmb_dir.c |   23 +++++++++++++----------
 source3/libsmb/namequery.c  |   33 +++++++++++++++++++++------------
 4 files changed, 49 insertions(+), 33 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index d44dfb6..cfc075d 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1207,7 +1207,7 @@ struct cli_state *get_ipc_connect(char *server,
 				struct sockaddr_storage *server_ss,
 				const struct user_auth_info *user_info);
 struct cli_state *get_ipc_connect_master_ip(TALLOC_CTX *ctx,
-				struct ip_service *mb_ip,
+				struct sockaddr_storage *mb_ip,
 				const struct user_auth_info *user_info,
 				char **pp_workgroup_out);
 struct cli_state *get_ipc_connect_master_ip_bcast(TALLOC_CTX *ctx,
@@ -2057,7 +2057,8 @@ NTSTATUS name_query(const char *name, int name_type,
 		    int *num_addrs, uint8_t *flags);
 NTSTATUS name_resolve_bcast(const char *name,
 			int name_type,
-			struct ip_service **return_iplist,
+			TALLOC_CTX *mem_ctx,
+			struct sockaddr_storage **return_iplist,
 			int *return_count);
 NTSTATUS resolve_wins(const char *name,
 		int name_type,
diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index 6d1eaad..1383978 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -3414,7 +3414,7 @@ struct cli_state *get_ipc_connect(char *server,
  */
 
 struct cli_state *get_ipc_connect_master_ip(TALLOC_CTX *ctx,
-				struct ip_service *mb_ip,
+				struct sockaddr_storage *mb_ip,
 				const struct user_auth_info *user_info,
 				char **pp_workgroup_out)
 {
@@ -3425,7 +3425,7 @@ struct cli_state *get_ipc_connect_master_ip(TALLOC_CTX *ctx,
 
 	*pp_workgroup_out = NULL;
 
-	print_sockaddr(addr, sizeof(addr), &mb_ip->ss);
+	print_sockaddr(addr, sizeof(addr), mb_ip);
         DEBUG(99, ("Looking up name of master browser %s\n",
                    addr));
 
@@ -3440,8 +3440,8 @@ struct cli_state *get_ipc_connect_master_ip(TALLOC_CTX *ctx,
          * the original wildcard query as the first choice and fall back to
          * MSBROWSE if the wildcard query fails.
          */
-        if (!name_status_find("*", 0, 0x1d, &mb_ip->ss, name) &&
-            !name_status_find(MSBROWSE, 1, 0x1d, &mb_ip->ss, name)) {
+        if (!name_status_find("*", 0, 0x1d, mb_ip, name) &&
+            !name_status_find(MSBROWSE, 1, 0x1d, mb_ip, name)) {
 
                 DEBUG(99, ("Could not retrieve name status for %s\n",
                            addr));
@@ -3472,9 +3472,10 @@ struct cli_state *get_ipc_connect_master_ip_bcast(TALLOC_CTX *ctx,
 					const struct user_auth_info *user_info,
 					char **pp_workgroup_out)
 {
-	struct ip_service *ip_list;
+	struct sockaddr_storage *ip_list;
 	struct cli_state *cli;
 	int i, count;
+	NTSTATUS status;
 
 	*pp_workgroup_out = NULL;
 
@@ -3482,15 +3483,17 @@ struct cli_state *get_ipc_connect_master_ip_bcast(TALLOC_CTX *ctx,
 
         /* Go looking for workgroups by broadcasting on the local network */
 
-        if (!NT_STATUS_IS_OK(name_resolve_bcast(MSBROWSE, 1, &ip_list,
-						&count))) {
-                DEBUG(99, ("No master browsers responded\n"));
+	status = name_resolve_bcast(MSBROWSE, 1, talloc_tos(),
+				    &ip_list, &count);
+        if (!NT_STATUS_IS_OK(status)) {
+                DEBUG(99, ("No master browsers responded: %s\n",
+			   nt_errstr(status)));
                 return False;
         }
 
 	for (i = 0; i < count; i++) {
 		char addr[INET6_ADDRSTRLEN];
-		print_sockaddr(addr, sizeof(addr), &ip_list[i].ss);
+		print_sockaddr(addr, sizeof(addr), &ip_list[i]);
 		DEBUG(99, ("Found master browser %s\n", addr));
 
 		cli = get_ipc_connect_master_ip(ctx, &ip_list[i],
diff --git a/source3/libsmb/libsmb_dir.c b/source3/libsmb/libsmb_dir.c
index 3d50107..3602bc5 100644
--- a/source3/libsmb/libsmb_dir.c
+++ b/source3/libsmb/libsmb_dir.c
@@ -456,9 +456,10 @@ SMBC_opendir_ctx(SMBCCTX *context,
                 int i;
                 int count;
                 int max_lmb_count;
-                struct ip_service *ip_list;
-                struct ip_service server_addr;
+                struct sockaddr_storage *ip_list;
+                struct sockaddr_storage server_addr;
                 struct user_auth_info u_info;
+		NTSTATUS status;
 
 		if (share[0] != (char)0 || path[0] != (char)0) {
 
@@ -498,13 +499,14 @@ SMBC_opendir_ctx(SMBCCTX *context,
                  */
 
                 ip_list = NULL;
-                if (!NT_STATUS_IS_OK(name_resolve_bcast(MSBROWSE, 1, &ip_list,
-                                                        &count)))
+		status = name_resolve_bcast(MSBROWSE, 1, talloc_tos(),
+					    &ip_list, &count);
+                if (!NT_STATUS_IS_OK(status))
 		{
 
-                        SAFE_FREE(ip_list);
+                        TALLOC_FREE(ip_list);
 
-                        if (!find_master_ip(workgroup, &server_addr.ss)) {
+                        if (!find_master_ip(workgroup, &server_addr)) {
 
 				if (dir) {
 					SAFE_FREE(dir->fname);
@@ -515,8 +517,9 @@ SMBC_opendir_ctx(SMBCCTX *context,
                                 return NULL;
                         }
 
-			ip_list = (struct ip_service *)memdup(
-				&server_addr, sizeof(server_addr));
+			ip_list = (struct sockaddr_storage *)talloc_memdup(
+				talloc_tos(), &server_addr,
+				sizeof(server_addr));
 			if (ip_list == NULL) {
 				if (dir) {
 					SAFE_FREE(dir->fname);
@@ -534,7 +537,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
 			char *wg_ptr = NULL;
                 	struct cli_state *cli = NULL;
 
-			print_sockaddr(addr, sizeof(addr), &ip_list[i].ss);
+			print_sockaddr(addr, sizeof(addr), &ip_list[i]);
                         DEBUG(99, ("Found master browser %d of %d: %s\n",
                                    i+1, MAX(count, max_lmb_count),
                                    addr));
@@ -594,7 +597,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
                         }
                 }
 
-                SAFE_FREE(ip_list);
+                TALLOC_FREE(ip_list);
         } else {
                 /*
                  * Server not an empty string ... Check the rest and see what
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
index 0d61720..6d8f158 100644
--- a/source3/libsmb/namequery.c
+++ b/source3/libsmb/namequery.c
@@ -1253,6 +1253,7 @@ static bool name_query_validator(struct packet_struct *p, void *private_data)
 		private_data, struct name_query_state);
 	struct nmb_packet *nmb = &p->packet.nmb;
 	struct sockaddr_storage *tmp_addrs;
+	bool got_unique_netbios_name = false;
 	int i;
 
 	debug_nmb_packet(p);
@@ -1327,7 +1328,12 @@ static bool name_query_validator(struct packet_struct *p, void *private_data)
 		 "from %s ( ", inet_ntoa(p->ip)));
 
 	for (i=0; i<nmb->answers->rdlength/6; i++) {
+		uint16_t flags;
 		struct in_addr ip;
+
+		flags = RSVAL(&nmb->answers->rdata[i*6], 0);
+		got_unique_netbios_name |= ((flags & 0x8000) == 0);
+
 		putip((char *)&ip,&nmb->answers->rdata[2+i*6]);
 		in_addr_to_sockaddr_storage(
 			&state->addrs[state->num_addrs], ip);
@@ -1352,10 +1358,10 @@ static bool name_query_validator(struct packet_struct *p, void *private_data)
 
 	if (state->bcast) {
 		/*
-		 * We have to collect all entries coming in from
-		 * broadcast queries
+		 * We have to collect all entries coming in from broadcast
+		 * queries. If we got a unique name, we're done.
 		 */
-		return false;
+		return got_unique_netbios_name;
 	}
 	/*
 	 * WINS responses are accepted when they are received
@@ -1489,7 +1495,8 @@ static bool convert_ss2service(struct ip_service **return_iplist,
 
 NTSTATUS name_resolve_bcast(const char *name,
 			int name_type,
-			struct ip_service **return_iplist,
+			TALLOC_CTX *mem_ctx,
+			struct sockaddr_storage **return_iplist,
 			int *return_count)
 {
 	int i;
@@ -1537,11 +1544,7 @@ NTSTATUS name_resolve_bcast(const char *name,
 	return status;
 
 success:
-
-	if (!convert_ss2service(return_iplist, ss_list, *return_count) )
-		status = NT_STATUS_NO_MEMORY;
-
-	TALLOC_FREE(ss_list);
+	*return_iplist = ss_list;
 	return status;
 }
 
@@ -2048,10 +2051,16 @@ NTSTATUS internal_resolve_name(const char *name,
 				}
 			}
 		} else if(strequal( tok, "bcast")) {
-			status = name_resolve_bcast(name, name_type,
-						    return_iplist,
-						    return_count);
+			struct sockaddr_storage *ss_list;
+			status = name_resolve_bcast(
+				name, name_type, talloc_tos(),
+				&ss_list, return_count);
 			if (NT_STATUS_IS_OK(status)) {
+				if (!convert_ss2service(return_iplist,
+							ss_list,
+							*return_count)) {
+					status = NT_STATUS_NO_MEMORY;
+				}
 				goto done;
 			}
 		} else {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list