Rev 634: merge from volker in http://samba.org/~tridge/3_0-ctdb

tridge at samba.org tridge at samba.org
Tue Sep 25 04:52:21 GMT 2007


------------------------------------------------------------
revno: 634
revision-id: tridge at samba.org-20070925045220-oaeja7d7ms4to01i
parent: tridge at samba.org-20070924052737-sa5rzzlzc8k4gdyj
committer: Andrew Tridgell <tridge at samba.org>
branch nick: s3-ctdb-tridge
timestamp: Tue 2007-09-25 14:52:20 +1000
message:
  merge from volker
modified:
  source/nsswitch/wb_common.c    wb_common.c-20070210173807-1wjifrbwaz6xnmgl-719
=== modified file 'source/nsswitch/wb_common.c'
--- a/source/nsswitch/wb_common.c	2007-09-11 05:25:56 +0000
+++ b/source/nsswitch/wb_common.c	2007-09-25 04:52:20 +0000
@@ -34,7 +34,15 @@
 
 int winbindd_fd = -1;           /* fd for winbindd socket */
 static int is_privileged = 0;
-static char *priv_directory;
+
+/*
+ * Location of the winbind privileged directory
+ *
+ * This is used for two purposes: First, this being != NULL is an indication
+ * that winbind is around and we should retry hard on failure. Second, this
+ * saves the child smbd some round-trips to winbind
+ */
+static char *priv_directory = NULL;
 
 /* Free a response structure */
 
@@ -241,6 +249,14 @@
 		int connect_errno = 0;
 		socklen_t errnosize;
 
+		if (priv_directory == NULL) {
+			/*
+			 * Our first connection attempt to winbind at all
+			 * failed, so directly bail out.
+			 */
+			goto error_out;
+		}
+
 		if (wait_time >= CONNECT_TIMEOUT)
 			goto error_out;
 
@@ -268,6 +284,7 @@
 				slept = CONNECT_TIMEOUT;
 				break;
 			case EAGAIN:
+			case ECONNREFUSED:
 				slept = rand() % 3 + 1;
 				sleep(slept);
 				break;
@@ -295,6 +312,7 @@
 	static pid_t our_pid;
 	struct winbindd_request request;
 	struct winbindd_response response;
+	NSS_STATUS result;
 	ZERO_STRUCT(request);
 	ZERO_STRUCT(response);
 
@@ -342,21 +360,27 @@
 		return -1;
 	}
 
-	if (need_priv == 0) {
-		return winbindd_fd;
-	}
-
 	/* try and get priv pipe */
 
 	request.flags = WBFLAG_RECURSE;
-	if (winbindd_request_response(WINBINDD_PRIV_PIPE_DIR, &request, &response) == NSS_STATUS_SUCCESS) {
+
+	result = winbindd_request_response(WINBINDD_PRIV_PIPE_DIR, &request,
+					   &response);
+
+	if (result == NSS_STATUS_SUCCESS) {
 		int fd;
-		if ((fd = winbind_named_pipe_sock((char *)response.extra_data.data)) != -1) {
+		priv_directory = (char *)response.extra_data.data;
+
+		if (need_priv == 0) {
+			return winbindd_fd;
+		}
+
+		fd = winbind_named_pipe_sock((char *)response.extra_data.data);
+
+		if (fd != -1) {
 			close(winbindd_fd);
 			winbindd_fd = fd;
 			is_privileged = 1;
-			priv_directory = strdup(
-				(char *)response.extra_data.data);
 		}
 	}
 
@@ -364,8 +388,6 @@
 		return -1;
 	}
 
-	SAFE_FREE(response.extra_data.data);
-
 	return winbindd_fd;
 #else
 	return -1;
@@ -651,6 +673,14 @@
 			    && (request->flags & WBFLAG_RECURSE)) {
 				return status;
 			}
+			if (priv_directory == NULL) {
+				/*
+				 * Our first connection attempt to winbind
+				 * failed, so directly bail out.
+				 */
+				return status;
+			}
+				
 			/*
 			 * Something might have failed in the previous
 			 * iteration which caused the filehandle to be closed
@@ -685,6 +715,13 @@
 			    && (request->flags & WBFLAG_RECURSE)) {
 				return status;
 			}
+			if (priv_directory == NULL) {
+				/*
+				 * Our first connection attempt to winbind
+				 * failed, so directly bail out.
+				 */
+				return status;
+			}
 			/*
 			 * Something might have failed in the previous
 			 * iteration which caused the filehandle to be closed



More information about the samba-cvs mailing list