[SCM] Samba Shared Repository - branch v4-19-stable updated

Jule Anger janger at samba.org
Mon Jan 8 14:38:39 UTC 2024


The branch, v4-19-stable has been updated
       via  95474d8589e VERSION: Disable GIT_SNAPSHOT for the 4.19.4 release.
       via  44fe0868402 WHATSNEW: Add release notes for Samba 4.19.4.
       via  c6c14c07d37 docs-xml: use XML_CATALOG_FILES env var if defined
       via  a8ab61b8ab2 winbind_nss_netbsd: fix missing semicolon
       via  2084a27c9ab s3:utils: Fix the auth function to print correct values to the user
       via  98e62c70894 s3:utils: Handle the domain before username and password
       via  3a39e21d087 doc-xml: fix name of vfs_linux_xfs man page
       via  f11643fee31 smbd: Fix traversing snapshot dirs that vanished in current fileset
       via  e97ec6ffb7a shadow_copy: Add test for missing directory in "current" fileset
       via  50f74d04884 s3:smbd multichannel: always refresh the network information
       via  8c63b219a26 s3:ctdbd_conn: fix ctdbd_public_ip_foreach() for ipv6 addresses
       via  efc1a606a27 VERSION: move COPYRIGHT_STARTUP_MESSAGE as SAMBA_COPYRIGHT_STRING into version.h
       via  2298b92f183 lib/util: convert DBG_STARTUP_NOTICE() to use debug_set_forced_log_priority(DBGLVL_NOTICE)
       via  98d79426022 lib/util: add debug_set_forced_log_priority()
       via  928dfe6e94d source3/nmbd/nmbd.c: use DBG_STARTUP_NOTICE
       via  ed2806fd166 lib/util/become_daemon.c: use DBG_STARTUP_NOTICE
       via  51ce833dd52 logging: use DBG_STARTUP_NOTICE for startup message
       via  fb08893cde4 debug.h: introduce DEBUG_STARTUP_NOTICE
       via  13748870c37 lib/util: move copyright define to copyright.h
       via  c05330a909f s4/server.c: move some log messages from ERR to NOTICE
       via  8b913da8b99 profile: issues info message with lower log level
       via  3d3cc1bd68f s3:rpc_server: call reopen_logs before we print the copyright notice
       via  853efb9dd7b ctdb-server: Drop unnecessary copy of destination address
       via  2e93e358ef9 ctdb-daemon: Use ctdb_connection_to_buf() to simplify
       via  2640bae75e3 smbd: Remove callback for release_ip when "state" is free'ed
       via  43b7068676a s3:selftest: add samba3.blackbox.smbXsrv_client_ctdb_registered_ips
       via  d96cb627b66 selftest: export/use CTDB related envvars in order to run the ctdb command
       via  8add947b212 ctdbd_conn: add ctdbd_passed_ips()
       via  e3a4feda112 ctdbd_conn: add ctdbd_unregister_ips()
       via  acf080817b5 ctdbd_conn: Add deregister_from_ctdbd()
       via  d039fa07f7e ctdbd_conn: let register_with_ctdbd() call CTDB_CONTROL_REGISTER_SRVID just once
       via  e09f92422eb ctdbd_conn: don't use uninitialized memory in ctdbd_register_ips()
       via  118d6c81ec9 ctdb: add/implement CTDB_CONTROL_TCP_CLIENT_PASSED
       via  b6906f37c66 ctdb: add/implement CTDB_CONTROL_TCP_CLIENT_DISCONNECTED
       via  24bd10ebfc1 ctdb: add ctdb_connection_same() helper
       via  0d6a38604b2 ctdb: make use of ctdb_canonicalize_ip_inplace() in ctdb_control_tcp_client()
       via  69c4f498c84 ctdb: add ctdb_canonicalize_ip_inplace() helper
       via  38134f374ca ctdb: remove unused ctdb->client_ip_list and print debug on ctdb_tcp_list instead
       via  1b6096a1dff s3:utils: Fix auth callback with smburl
       via  37e24c60d82 s3:tests: Add interactive smbget test for password entry
       via  88c297575b6 auth:creds: Add cli_credentials_get_domain_and_obtained()
       via  ec913897169 auth:creds: Fix cli_credentials_get_password_and_obtained() with callback
       via  259cc2b51d5 auth:creds:tests: Add test for password callback
       via  8dc5d522774 s3:tests: Fix smbget test
       via  b2e427b48c4 s3:tests: Remove the non-working test_kerberos_upn_denied of smbget
       via  9fe9f02cb3b s3:tests: Fix the test_kerberos_trust in smbget testsuite
       via  fd20e3223df s3:tests: Fix test_kerberos in smbget tests
       via  e6d14a8560a s3:tests: Pass down a normal domain user for test_smbget.sh
       via  4fca26641b1 selftest: Add DOMAIN_ADMIN and DOMAIN_USER variables
       via  3738e0a904a selftest: Remove trailing tabs/white spaces in Samba4.pm
       via  7998197398a s3:tests: Fix authentication with smbget_user in smbget tests
       via  63969fe9ade s3:utils: Fix setting the debug level
       via  402042b5483 s3:tests: Add smbget test for smb://DOAMIN;user%password@server/share/file
       via  b2d450cc697 smbd: Fix read_symlink_reparse()
       via  fcbda8c7525 vfs_ceph: call 'ceph_fgetxattr' only if valid fd
       via  62c90dfa32e s3:auth: Allow 'Unix Users' and 'Unix Groups' to create a local token
       via  9b26a0eaae8 s3:auth: Remove trailing white spaces from auth_util.c
       via  b3ac235ba96 selftest: Show that 'allow trusted domains = no' firewalls Unix User|Group
       via  e4505c10a76 testprogs: Add net offlinejoin composeodj tests
       via  4deac6a2170 testprogs: Cleanup machine account in net offlinejoin tests
       via  89e830251d0 s3:net: Allow to load ODJ blob from stdin
       via  152d2592f0f s3:net: Load ODJ blob from file only if "loadfile" parameter is present
       via  df294c92acb s3:net: Add "net offlinejoin composeodj" command
       via  4f81c780125 s3:libnetapi: Implement NetComposeOfflineDomainJoin_l()
       via  224b8dffe80 s3:libnetapi: Add NetComposeOfflineDomainJoin() to API.
       via  dfa8dfaa752 s3:libnetapi: Add NetComposeOfflineDomainJoin() boilerplate
       via  202b817f7be s3:libnetapi: Add NetComposeOfflineDomainJoin() to IDL
       via  0f324795d24 s3:libnetapi: Add some comments to document ODJ blob charset conversions
       via  1f91db224fa s3:libnetapi: Return error from RequestOfflineJoin
       via  f45acdafa90 VERSION: Bump version up to Samba 4.19.4...
      from  fcd094b208f VERSION: Disable GIT_SNAPSHOT for the 4.19.3 release.

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-19-stable


- Log -----------------------------------------------------------------
-----------------------------------------------------------------------

Summary of changes:
 VERSION                                            |   4 +-
 WHATSNEW.txt                                       |  85 +++++-
 auth/credentials/credentials.c                     |  26 +-
 auth/credentials/credentials.h                     |   3 +
 auth/credentials/tests/test_creds.c                |  38 +++
 buildtools/wafsamba/samba_patterns.py              |   2 +-
 buildtools/wafsamba/samba_version.py               |   1 +
 buildtools/wafsamba/wafsamba.py                    |   2 +-
 ctdb/common/common.h                               |   1 +
 ctdb/common/ctdb_util.c                            |   7 +
 ctdb/include/ctdb_private.h                        |   7 +-
 ctdb/protocol/protocol.h                           |   2 +
 ctdb/protocol/protocol_control.c                   |  30 ++
 ctdb/protocol/protocol_debug.c                     |   2 +
 ctdb/protocol/protocol_util.c                      |  18 ++
 ctdb/protocol/protocol_util.h                      |   3 +
 ctdb/server/ctdb_control.c                         |   8 +
 ctdb/server/ctdb_takeover.c                        | 292 ++++++++++++-------
 docs-xml/manpages/vfs_linux_xfs_sgid.8.xml         |   4 +-
 lib/param/param.h                                  |   1 +
 lib/util/become_daemon.c                           |   2 +-
 lib/util/debug.c                                   |  10 +
 lib/util/debug.h                                   |   7 +
 nsswitch/winbind_nss_netbsd.c                      |   2 +-
 selftest/target/Samba.pm                           |  23 ++
 selftest/target/Samba3.pm                          |  51 +++-
 selftest/target/Samba4.pm                          |  16 +-
 source3/auth/auth_util.c                           |  81 +++---
 source3/include/ctdbd_conn.h                       |  32 +++
 source3/include/proto.h                            |   1 +
 source3/include/smb.h                              |   3 -
 source3/lib/ctdb_dummy.c                           |  42 +++
 source3/lib/ctdbd_conn.c                           | 261 ++++++++++++++++-
 source3/lib/netapi/joindomain.c                    | 206 +++++++++++++-
 source3/lib/netapi/libnetapi.c                     |  67 +++++
 source3/lib/netapi/libnetapi.h                     |  17 ++
 source3/lib/netapi/netapi.h                        |  43 +++
 source3/lib/version.c                              |   5 +
 source3/librpc/idl/libnetapi.idl                   |  20 ++
 source3/modules/vfs_ceph.c                         |  27 +-
 source3/nmbd/nmbd.c                                |   4 +-
 source3/profile/profile_dummy.c                    |   2 +-
 source3/rpc_server/rpc_host.c                      |  10 +-
 source3/rpc_server/rpc_worker.c                    |  10 +-
 source3/script/tests/test_shadow_copy.sh           |  27 ++
 .../test_smbXsrv_client_ctdb_registered_ips.sh     | 159 +++++++++++
 source3/script/tests/test_smbget.sh                | 164 +++++++----
 source3/selftest/tests.py                          |  10 +-
 source3/smbd/filename.c                            |   2 +-
 source3/smbd/files.c                               |  14 +-
 source3/smbd/server.c                              |   5 +-
 source3/smbd/smb2_ioctl_network_fs.c               |  12 +-
 source3/smbd/smb2_negprot.c                        |   7 +
 source3/smbd/smb2_process.c                        |  33 +++
 source3/utils/net_offlinejoin.c                    | 312 ++++++++++++++++++++-
 source3/utils/net_proto.h                          |   2 +
 source3/utils/smbget.c                             |  67 +++--
 source3/winbindd/winbindd.c                        |   5 +-
 source3/wscript_build                              |   3 +-
 source4/samba/server.c                             |  13 +-
 testprogs/blackbox/test_net_offline.sh             |  94 +++++++
 61 files changed, 2135 insertions(+), 272 deletions(-)
 create mode 100755 source3/script/tests/test_smbXsrv_client_ctdb_registered_ips.sh


Changeset truncated at 500 lines:

diff --git a/VERSION b/VERSION
index 7da956b9a0f..af4c5a922e2 100644
--- a/VERSION
+++ b/VERSION
@@ -13,6 +13,8 @@
 #                                                      #
 ########################################################
 
+SAMBA_COPYRIGHT_STRING="Copyright Andrew Tridgell and the Samba Team 1992-2023"
+
 ########################################################
 # This are the main SAMBA version numbers              #
 #                                                      #
@@ -25,7 +27,7 @@
 ########################################################
 SAMBA_VERSION_MAJOR=4
 SAMBA_VERSION_MINOR=19
-SAMBA_VERSION_RELEASE=3
+SAMBA_VERSION_RELEASE=4
 
 ########################################################
 # If a official release has a serious bug              #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 2d098c61f18..1f174e9be54 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,3 +1,85 @@
+                   ==============================
+                   Release Notes for Samba 4.19.4
+                          January 08, 2024
+                   ==============================
+
+
+This is the latest stable release of the Samba 4.19 release series.
+
+
+Changes since 4.19.3
+--------------------
+
+o  Samuel Cabrero <scabrero at samba.org>
+   * BUG 13577: net changesecretpw cannot set the machine account password if
+     secrets.tdb is empty.
+
+o  Björn Jacke <bjacke at samba.org>
+   * BUG 15540: For generating doc, take, if defined, env XML_CATALOG_FILES.
+   * BUG 15541: Trivial C typo in nsswitch/winbind_nss_netbsd.c.
+   * BUG 15542: vfs_linux_xfs is incorrectly named.
+
+o  Björn Jacke <bj at sernet.de>
+   * BUG 15377: systemd stumbled over copyright-message at smbd startup.
+
+o  Volker Lendecke <vl at samba.org>
+   * BUG 15505: Following intermediate abolute share-local symlinks is broken.
+   * BUG 15523: ctdb RELEASE_IP causes a crash in release_ip if a connection to
+     a non-public address disconnects first.
+   * BUG 15544: shadow_copy2 broken when current fileset's directories are
+     removed.
+
+o  Stefan Metzmacher <metze at samba.org>
+   * BUG 15377: systemd stumbled over copyright-message at smbd startup.
+   * BUG 15523: ctdb RELEASE_IP causes a crash in release_ip if a connection to
+     a non-public address disconnects first.
+   * BUG 15534: smbd does not detect ctdb public ipv6 addresses for multichannel
+     exclusion.
+
+o  Andreas Schneider <asn at samba.org>
+   * BUG 15469: 'force user = localunixuser' doesn't work if 'allow trusted
+     domains = no' is set.
+   * BUG 15525: smbget debug logging doesn't work.
+   * BUG 15532: smget: username in the smburl and interactive password entry
+     doesn't work.
+   * BUG 15538: smbget auth function doesn't set values for password prompt
+     correctly.
+
+o  Martin Schwenke <mschwenke at ddn.com>
+   * BUG 15523: ctdb RELEASE_IP causes a crash in release_ip if a connection to
+     a non-public address disconnects first.
+
+o  Shachar Sharon <ssharon at redhat.com>
+   * BUG 15440: Unable to copy and write files from clients to Ceph cluster via
+     SMB Linux gateway with Ceph VFS module.
+
+o  Jones Syue <jonessyue at qnap.com>
+   * BUG 15547: Multichannel refresh network information.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical:matrix.org matrix room, or
+#samba-technical IRC channel on irc.libera.chat.
+
+If you do report problems then please try to send high quality
+feedback. If you don't provide vital information to help us track down
+the problem then you will probably be ignored.  All bug reports should
+be filed under the Samba 4.1 and newer product in the project's Bugzilla
+database (https://bugzilla.samba.org/).
+
+
+======================================================================
+== Our Code, Our Bugs, Our Responsibility.
+== The Samba Team
+======================================================================
+
+
+Release notes for older releases follow:
+----------------------------------------
                    ==============================
                    Release Notes for Samba 4.19.3
                          November 27, 2023
@@ -119,8 +201,7 @@ database (https://bugzilla.samba.org/).
 ======================================================================
 
 
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
                    ==============================
                    Release Notes for Samba 4.19.2
                           October 16, 2023
diff --git a/auth/credentials/credentials.c b/auth/credentials/credentials.c
index 0485cc4e64e..7a00279b8b4 100644
--- a/auth/credentials/credentials.c
+++ b/auth/credentials/credentials.c
@@ -465,11 +465,13 @@ _PUBLIC_ const char *
 cli_credentials_get_password_and_obtained(struct cli_credentials *cred,
 					  enum credentials_obtained *obtained)
 {
+	const char *password = cli_credentials_get_password(cred);
+
 	if (obtained != NULL) {
 		*obtained = cred->password_obtained;
 	}
 
-	return cli_credentials_get_password(cred);
+	return password;
 }
 
 /* Set a password on the credentials context, including an indication
@@ -736,6 +738,28 @@ _PUBLIC_ const char *cli_credentials_get_domain(struct cli_credentials *cred)
 	return cred->domain;
 }
 
+/**
+ * @brief Obtain the domain for this credential context.
+ *
+ * @param[in] cred  The credential context.
+ *
+ * @param[out] obtained A pointer to store the obtained information.
+ *
+ * @return The domain name or NULL if an error occurred.
+ */
+_PUBLIC_ const char *cli_credentials_get_domain_and_obtained(
+	struct cli_credentials *cred,
+	enum credentials_obtained *obtained)
+{
+	const char *domain = cli_credentials_get_domain(cred);
+
+	if (obtained != NULL) {
+		*obtained = cred->domain_obtained;
+	}
+
+	return domain;
+}
+
 
 _PUBLIC_ bool cli_credentials_set_domain(struct cli_credentials *cred,
 				const char *val,
diff --git a/auth/credentials/credentials.h b/auth/credentials/credentials.h
index c3a048ecc8d..c5ffe536e07 100644
--- a/auth/credentials/credentials.h
+++ b/auth/credentials/credentials.h
@@ -127,6 +127,9 @@ int cli_credentials_get_keytab(struct cli_credentials *cred,
 			       struct loadparm_context *lp_ctx,
 			       struct keytab_container **_ktc);
 const char *cli_credentials_get_domain(struct cli_credentials *cred);
+const char *cli_credentials_get_domain_and_obtained(
+	struct cli_credentials *cred,
+	enum credentials_obtained *obtained);
 struct netlogon_creds_CredentialState *cli_credentials_get_netlogon_creds(struct cli_credentials *cred);
 void cli_credentials_set_machine_account_pending(struct cli_credentials *cred,
 						 struct loadparm_context *lp_ctx);
diff --git a/auth/credentials/tests/test_creds.c b/auth/credentials/tests/test_creds.c
index a2f9642bfe0..2cb2e6d0e34 100644
--- a/auth/credentials/tests/test_creds.c
+++ b/auth/credentials/tests/test_creds.c
@@ -48,6 +48,7 @@ static void torture_creds_init(void **state)
 	const char *username = NULL;
 	const char *domain = NULL;
 	const char *password = NULL;
+	enum credentials_obtained dom_obtained = CRED_UNINITIALISED;
 	enum credentials_obtained usr_obtained = CRED_UNINITIALISED;
 	enum credentials_obtained pwd_obtained = CRED_UNINITIALISED;
 	bool ok;
@@ -65,6 +66,11 @@ static void torture_creds_init(void **state)
 	domain = cli_credentials_get_domain(creds);
 	assert_string_equal(domain, "WURST");
 
+	domain = cli_credentials_get_domain_and_obtained(creds,
+							 &dom_obtained);
+	assert_int_equal(dom_obtained, CRED_SPECIFIED);
+	assert_string_equal(domain, "WURST");
+
 	username = cli_credentials_get_username(creds);
 	assert_null(username);
 	ok = cli_credentials_set_username(creds, "brot", CRED_SPECIFIED);
@@ -285,6 +291,37 @@ static void torture_creds_gensec_feature(void **state)
 	assert_int_equal(creds->gensec_features, GENSEC_FEATURE_SIGN);
 }
 
+static const char *torture_get_password(struct cli_credentials *creds)
+{
+	return talloc_strdup(creds, "SECRET");
+}
+
+static void torture_creds_password_callback(void **state)
+{
+	TALLOC_CTX *mem_ctx = *state;
+	struct cli_credentials *creds = NULL;
+	const char *password = NULL;
+	enum credentials_obtained pwd_obtained = CRED_UNINITIALISED;
+	bool ok;
+
+	creds = cli_credentials_init(mem_ctx);
+	assert_non_null(creds);
+
+	ok = cli_credentials_set_domain(creds, "WURST", CRED_SPECIFIED);
+	assert_true(ok);
+	ok = cli_credentials_set_username(creds, "brot", CRED_SPECIFIED);
+	assert_true(ok);
+
+	ok = cli_credentials_set_password_callback(creds, torture_get_password);
+	assert_true(ok);
+	assert_int_equal(creds->password_obtained, CRED_CALLBACK);
+
+	password = cli_credentials_get_password_and_obtained(creds,
+							     &pwd_obtained);
+	assert_int_equal(pwd_obtained, CRED_CALLBACK_RESULT);
+	assert_string_equal(password, "SECRET");
+}
+
 int main(int argc, char *argv[])
 {
 	int rc;
@@ -296,6 +333,7 @@ int main(int argc, char *argv[])
 		cmocka_unit_test(torture_creds_parse_string),
 		cmocka_unit_test(torture_creds_krb5_state),
 		cmocka_unit_test(torture_creds_gensec_feature),
+		cmocka_unit_test(torture_creds_password_callback)
 	};
 
 	if (argc == 2) {
diff --git a/buildtools/wafsamba/samba_patterns.py b/buildtools/wafsamba/samba_patterns.py
index a9c5fcc4b4c..41296810e13 100644
--- a/buildtools/wafsamba/samba_patterns.py
+++ b/buildtools/wafsamba/samba_patterns.py
@@ -15,7 +15,7 @@ def write_version_header(task):
     return 0
 
 
-def SAMBA_MKVERSION(bld, target, source='VERSION'):
+def SAMBA_MKVERSION(bld, target, source='VERSION buildtools/wafsamba/samba_version.py'):
     '''generate the version.h header for Samba'''
 
     # We only force waf to re-generate this file if we are installing,
diff --git a/buildtools/wafsamba/samba_version.py b/buildtools/wafsamba/samba_version.py
index 54ae62f38bd..31103e0f8c4 100644
--- a/buildtools/wafsamba/samba_version.py
+++ b/buildtools/wafsamba/samba_version.py
@@ -174,6 +174,7 @@ also accepted as dictionary entries here
 
     def __str__(self):
         string="/* Autogenerated by waf */\n" +\
+                "#define SAMBA_COPYRIGHT_STRING \"%s\"\n" % self.SAMBA_COPYRIGHT_STRING +\
                 "#define SAMBA_VERSION_MAJOR %u\n" % self.MAJOR +\
                 "#define SAMBA_VERSION_MINOR %u\n" % self.MINOR +\
                 "#define SAMBA_VERSION_RELEASE %u\n" % self.RELEASE
diff --git a/buildtools/wafsamba/wafsamba.py b/buildtools/wafsamba/wafsamba.py
index 40c7b866fba..2d20eabbc8b 100644
--- a/buildtools/wafsamba/wafsamba.py
+++ b/buildtools/wafsamba/wafsamba.py
@@ -1183,7 +1183,7 @@ def SAMBAMANPAGES(bld, manpages, extra_source=None):
     bld.env.SAMBA_EXPAND_XSL = bld.srcnode.abspath() + '/docs-xml/xslt/expand-sambadoc.xsl'
     bld.env.SAMBA_MAN_XSL = bld.srcnode.abspath() + '/docs-xml/xslt/man.xsl'
     bld.env.SAMBA_CATALOG = bld.bldnode.abspath() + '/docs-xml/build/catalog.xml'
-    bld.env.SAMBA_CATALOGS = 'file:///etc/xml/catalog file:///usr/local/share/xml/catalog file://' + bld.env.SAMBA_CATALOG
+    bld.env.SAMBA_CATALOGS = os.getenv('XML_CATALOG_FILES', 'file:///etc/xml/catalog file:///usr/local/share/xml/catalog') + ' file://' + bld.env.SAMBA_CATALOG
 
     for m in manpages.split():
         source = [m + '.xml']
diff --git a/ctdb/common/common.h b/ctdb/common/common.h
index c50b52a5eb5..9a73bec1ac6 100644
--- a/ctdb/common/common.h
+++ b/ctdb/common/common.h
@@ -132,6 +132,7 @@ struct ctdb_rec_data_old *ctdb_marshall_loop_next(
 					TDB_DATA *key, TDB_DATA *data);
 
 void ctdb_canonicalize_ip(const ctdb_sock_addr *ip, ctdb_sock_addr *cip);
+void ctdb_canonicalize_ip_inplace(ctdb_sock_addr *ip);
 
 bool ctdb_same_ip(const ctdb_sock_addr *tip1, const ctdb_sock_addr *tip2);
 
diff --git a/ctdb/common/ctdb_util.c b/ctdb/common/ctdb_util.c
index 3f8fff925f0..5c7731c5d2a 100644
--- a/ctdb/common/ctdb_util.c
+++ b/ctdb/common/ctdb_util.c
@@ -388,6 +388,13 @@ void ctdb_canonicalize_ip(const ctdb_sock_addr *ip, ctdb_sock_addr *cip)
 	}
 }
 
+void ctdb_canonicalize_ip_inplace(ctdb_sock_addr *ip)
+{
+	ctdb_sock_addr tmp;
+	ctdb_canonicalize_ip(ip, &tmp);
+	memcpy(ip, &tmp, sizeof(tmp));
+}
+
 bool ctdb_same_ip(const ctdb_sock_addr *tip1, const ctdb_sock_addr *tip2)
 {
 	ctdb_sock_addr ip1, ip2;
diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h
index 3395f077ab9..80278123778 100644
--- a/ctdb/include/ctdb_private.h
+++ b/ctdb/include/ctdb_private.h
@@ -296,7 +296,6 @@ struct ctdb_context {
 	struct ctdb_statistics statistics_history[MAX_STAT_HISTORY];
 	struct ctdb_vnn_map *vnn_map;
 	uint32_t num_clients;
-	struct ctdb_client_ip *client_ip_list;
 	bool do_checkpublicip;
 	bool do_setsched;
 	const char *event_script_dir;
@@ -893,6 +892,12 @@ int ctdb_set_public_addresses(struct ctdb_context *ctdb, bool check_addresses);
 
 int32_t ctdb_control_tcp_client(struct ctdb_context *ctdb, uint32_t client_id,
 				TDB_DATA indata);
+int32_t ctdb_control_tcp_client_disconnected(struct ctdb_context *ctdb,
+					     uint32_t client_id,
+					     TDB_DATA indata);
+int32_t ctdb_control_tcp_client_passed(struct ctdb_context *ctdb,
+				       uint32_t client_id,
+				       TDB_DATA indata);
 int32_t ctdb_control_tcp_add(struct ctdb_context *ctdb, TDB_DATA indata,
 			     bool tcp_update_needed);
 int32_t ctdb_control_tcp_remove(struct ctdb_context *ctdb, TDB_DATA indata);
diff --git a/ctdb/protocol/protocol.h b/ctdb/protocol/protocol.h
index fb6e39f33b5..3b66c403ab8 100644
--- a/ctdb/protocol/protocol.h
+++ b/ctdb/protocol/protocol.h
@@ -381,6 +381,8 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS          = 0,
 		    CTDB_CONTROL_ECHO_DATA               = 156,
 		    CTDB_CONTROL_DISABLE_NODE            = 157,
 		    CTDB_CONTROL_ENABLE_NODE             = 158,
+		    CTDB_CONTROL_TCP_CLIENT_DISCONNECTED = 159,
+		    CTDB_CONTROL_TCP_CLIENT_PASSED       = 160,
 };
 
 #define MAX_COUNT_BUCKETS 16
diff --git a/ctdb/protocol/protocol_control.c b/ctdb/protocol/protocol_control.c
index a7c797f5dbc..83ed6cb4ee1 100644
--- a/ctdb/protocol/protocol_control.c
+++ b/ctdb/protocol/protocol_control.c
@@ -410,6 +410,14 @@ static size_t ctdb_req_control_data_len(struct ctdb_req_control_data *cd)
 
 	case CTDB_CONTROL_ENABLE_NODE:
 		break;
+
+	case CTDB_CONTROL_TCP_CLIENT_DISCONNECTED:
+		len = ctdb_connection_len(cd->data.conn);
+		break;
+
+	case CTDB_CONTROL_TCP_CLIENT_PASSED:
+		len = ctdb_connection_len(cd->data.conn);
+		break;
 	}
 
 	return len;
@@ -1016,6 +1024,22 @@ static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
 					  &cd->data.echo_data,
 					  &np);
 		break;
+
+	case CTDB_CONTROL_TCP_CLIENT_DISCONNECTED:
+		ret = ctdb_connection_pull(buf,
+					   buflen,
+					   mem_ctx,
+					   &cd->data.conn,
+					   &np);
+		break;
+
+	case CTDB_CONTROL_TCP_CLIENT_PASSED:
+		ret = ctdb_connection_pull(buf,
+					   buflen,
+					   mem_ctx,
+					   &cd->data.conn,
+					   &np);
+		break;
 	}
 
 	if (ret != 0) {
@@ -1376,6 +1400,12 @@ static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd)
 
 	case CTDB_CONTROL_ENABLE_NODE:
 		break;
+
+	case CTDB_CONTROL_TCP_CLIENT_DISCONNECTED:
+		break;
+
+	case CTDB_CONTROL_TCP_CLIENT_PASSED:
+		break;
 	}
 
 	return len;
diff --git a/ctdb/protocol/protocol_debug.c b/ctdb/protocol/protocol_debug.c
index d94cb548d68..ae091b04d32 100644
--- a/ctdb/protocol/protocol_debug.c
+++ b/ctdb/protocol/protocol_debug.c
@@ -245,6 +245,8 @@ static void ctdb_opcode_print(uint32_t opcode, FILE *fp)
 		{ CTDB_CONTROL_ECHO_DATA, "ECHO_DATA" },
 		{ CTDB_CONTROL_DISABLE_NODE, "DISABLE_NODE" },
 		{ CTDB_CONTROL_ENABLE_NODE, "ENABLE_NODE" },
+		{ CTDB_CONTROL_TCP_CLIENT_DISCONNECTED, "TCP_CLIENT_DISCONNECTED" },
+		{ CTDB_CONTROL_TCP_CLIENT_PASSED, "TCP_CLIENT_PASSED" },
 		{ MAP_END, "" },
 	};
 
diff --git a/ctdb/protocol/protocol_util.c b/ctdb/protocol/protocol_util.c
index fe757658f48..87ecc87ac36 100644
--- a/ctdb/protocol/protocol_util.c
+++ b/ctdb/protocol/protocol_util.c
@@ -497,6 +497,24 @@ bool ctdb_sock_addr_same(const ctdb_sock_addr *addr1,
 	return (ctdb_sock_addr_cmp(addr1, addr2) == 0);
 }
 
+bool ctdb_connection_same(const struct ctdb_connection *conn1,
+			  const struct ctdb_connection *conn2)
+{
+	bool same;
+
+	same = ctdb_sock_addr_same(&conn1->src, &conn2->src);
+	if (!same) {
+		return false;
+	}
+
+	same = ctdb_sock_addr_same(&conn1->dst, &conn2->dst);
+	if (!same) {
+		return false;
+	}
+
+	return true;
+}
+
 int ctdb_connection_to_buf(char *buf,
 			   size_t buflen,
 			   struct ctdb_connection *conn,
diff --git a/ctdb/protocol/protocol_util.h b/ctdb/protocol/protocol_util.h
index 2bdbb0c2ad0..70f35d122a8 100644
--- a/ctdb/protocol/protocol_util.h
+++ b/ctdb/protocol/protocol_util.h
@@ -55,6 +55,9 @@ bool ctdb_sock_addr_same_ip(const ctdb_sock_addr *addr1,
 bool ctdb_sock_addr_same(const ctdb_sock_addr *addr1,
 			 const ctdb_sock_addr *addr2);
 
+bool ctdb_connection_same(const struct ctdb_connection *conn1,
+			  const struct ctdb_connection *conn2);
+
 int ctdb_connection_to_buf(char *buf,
 			   size_t buflen,
 			   struct ctdb_connection * conn,
diff --git a/ctdb/server/ctdb_control.c b/ctdb/server/ctdb_control.c
index 08268512bfa..422c4cf1e58 100644
--- a/ctdb/server/ctdb_control.c
+++ b/ctdb/server/ctdb_control.c
@@ -868,6 +868,14 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
 		CHECK_CONTROL_DATA_SIZE(0);
 		return ctdb_control_enable_node(ctdb);
 
+	case CTDB_CONTROL_TCP_CLIENT_DISCONNECTED:
+		CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_connection));
+		return ctdb_control_tcp_client_disconnected(ctdb, client_id, indata);
+
+	case CTDB_CONTROL_TCP_CLIENT_PASSED:
+		CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_connection));
+		return ctdb_control_tcp_client_passed(ctdb, client_id, indata);
+
 	default:
 		DEBUG(DEBUG_CRIT,(__location__ " Unknown CTDB control opcode %u\n", opcode));
 		return -1;
diff --git a/ctdb/server/ctdb_takeover.c b/ctdb/server/ctdb_takeover.c
index 26cca1aefff..e333105e633 100644
--- a/ctdb/server/ctdb_takeover.c
+++ b/ctdb/server/ctdb_takeover.c
@@ -348,20 +348,10 @@ struct ctdb_takeover_arp {
  */
 struct ctdb_tcp_list {
 	struct ctdb_tcp_list *prev, *next;
+	struct ctdb_client *client;
 	struct ctdb_connection connection;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list