[SCM] SAMBA-CTDB repository - branch v3-6-ctdb updated - 3.6.0-ctdb-21-14-g55c4bb1

Michael Adam obnox at samba.org
Fri Sep 2 08:18:25 MDT 2011


The branch, v3-6-ctdb has been updated
       via  55c4bb13d605f10e48ae9b44dd1dd27d25c1b9bd (commit)
       via  4820de304cb17ea8e0cdb21c8fe048c23398543b (commit)
       via  64aff3f769709529963b86727cbd7261816e5fd9 (commit)
       via  5fe766ff1e0f857ca40bc84c5f931c6ecb2f2222 (commit)
       via  cc24117195d676521b75ba4a7f375e19c910abb7 (commit)
       via  3f09ba7ae837ae881917e7a162ccf3325e2f19f8 (commit)
       via  7f28b311d681e61048e3ce66a4ca4bd796d70a95 (commit)
       via  085292b09abbbc54d48ce321a3a1d22b7adbe4b7 (commit)
       via  85c0556a9468468028addea5f54c29a9b84136db (commit)
       via  35c4dde6ee5a60cd9212f3623b9fc6be47875bf9 (commit)
       via  c85a4ba040f53c65c9cbe8409775dd358ef8e8c1 (commit)
       via  15179994c272f7f141c4bf07eb7264fc79ff6455 (commit)
       via  5b66f736bf9311a8d445432be628b9724da80841 (commit)
       via  20649820b232a8b6bf3d2e4f2b641501a7f15917 (commit)
      from  40b973957d7f5bc58fdf2545e7a5575a1950a7e4 (commit)

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


- Log -----------------------------------------------------------------
commit 55c4bb13d605f10e48ae9b44dd1dd27d25c1b9bd
Author: Christian Ambach <ambi at samba.org>
Date:   Thu Aug 25 13:52:04 2011 +0200

    v3-6-ctdb: bump vendor level to 22

commit 4820de304cb17ea8e0cdb21c8fe048c23398543b
Author: Christian Ambach <ambi at samba.org>
Date:   Wed Aug 24 16:21:37 2011 +0200

    s3:winbindd fix a return code check
    
    talloc_traverse_dict will return with -1 in case of an error and
    might return positive values that indicate the count of found
    entries

commit 64aff3f769709529963b86727cbd7261816e5fd9
Author: Gregor Beck <gbeck at sernet.de>
Date:   Wed Aug 24 10:52:01 2011 +0200

    s3:smbcontrol: let smbd pass the idmap msg to its children for convenience
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 5fe766ff1e0f857ca40bc84c5f931c6ecb2f2222
Author: Michael Adam <obnox at samba.org>
Date:   Wed Aug 24 01:14:22 2011 +0200

    s3:registry: fix the v2_to_v3 upgrade code so that it does not create value list security records for the INFO/version key ...

commit cc24117195d676521b75ba4a7f375e19c910abb7
Author: Michael Adam <obnox at samba.org>
Date:   Wed Aug 24 01:13:47 2011 +0200

    s3:registry: fix the v1_to_v2 upgrade code so that it does not normalize the INFO/version key ...

commit 3f09ba7ae837ae881917e7a162ccf3325e2f19f8
Author: Michael Adam <obnox at samba.org>
Date:   Wed Aug 24 01:12:28 2011 +0200

    s3:registry: define a constant REGDB_VERSION_KEYNAME for the key INFO/version (and use it)

commit 7f28b311d681e61048e3ce66a4ca4bd796d70a95
Author: Michael Adam <obnox at samba.org>
Date:   Thu Aug 25 17:18:12 2011 +0200

    s3:registry: hand db context in to v2_to_v3 upgrade code via private_data
    
    This also fixes the earlier faulty handing in of a useless stackframe
    memory context via private_data.

commit 085292b09abbbc54d48ce321a3a1d22b7adbe4b7
Author: Michael Adam <obnox at samba.org>
Date:   Thu Aug 25 17:12:33 2011 +0200

    s3:registry: fix broken use of dbwrap store record in v1_to_v2 upgrade code
    
    This also fixes broken private_data parameter for the traverse function
    (making use of it): Originally a memory context was handed in but was not used.

commit 85c0556a9468468028addea5f54c29a9b84136db
Author: Gregor Beck <gbeck at sernet.de>
Date:   Thu Aug 25 16:32:50 2011 +0200

    s3:net let "net registry check" be a little more verbose
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 35c4dde6ee5a60cd9212f3623b9fc6be47875bf9
Author: Gregor Beck <gbeck at sernet.de>
Date:   Thu Aug 25 16:28:16 2011 +0200

    s3:net fix commandline help of "net registry check"
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit c85a4ba040f53c65c9cbe8409775dd358ef8e8c1
Author: Gregor Beck <gbeck at sernet.de>
Date:   Thu Aug 25 16:26:25 2011 +0200

    s3:doc manpage for "net registry check"
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 15179994c272f7f141c4bf07eb7264fc79ff6455
Author: Gregor Beck <gbeck at sernet.de>
Date:   Tue Aug 23 19:10:43 2011 +0200

    s3:net: registry check ignore __db_sequence_number__ records

commit 5b66f736bf9311a8d445432be628b9724da80841
Author: Gregor Beck <gbeck at sernet.de>
Date:   Tue Aug 23 19:09:33 2011 +0200

    s3:net: registry check handle INFO records
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 20649820b232a8b6bf3d2e4f2b641501a7f15917
Author: Gregor Beck <gbeck at sernet.de>
Date:   Tue Aug 23 18:31:08 2011 +0200

    s3:net: check return value of check_ctx_create()
    
    Signed-off-by: Michael Adam <obnox at samba.org>

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

Summary of changes:
 docs-xml/manpages-3/net.8.xml      |   70 ++++++++++++++++++++++++++++++++++++
 source3/VERSION                    |    2 +-
 source3/registry/reg_backend_db.c  |   56 +++++++++++++++++++----------
 source3/smbd/msg_idmap.c           |   16 ++++++++
 source3/utils/net_registry.c       |   23 ++++++------
 source3/utils/net_registry_check.c |   29 ++++++++++++---
 source3/winbindd/winbindd_group.c  |    4 +-
 7 files changed, 161 insertions(+), 39 deletions(-)


Changeset truncated at 500 lines:

diff --git a/docs-xml/manpages-3/net.8.xml b/docs-xml/manpages-3/net.8.xml
index fac9ba6..0c50959 100644
--- a/docs-xml/manpages-3/net.8.xml
+++ b/docs-xml/manpages-3/net.8.xml
@@ -1875,6 +1875,8 @@ string.</member>
 </member>
 <member>net registry convert     - Convert a registration entries (.reg) file.
 </member>
+<member>net registry check       - Check and reapair a registry database.
+</member>
 </simplelist>
 </para>
 
@@ -2015,6 +2017,74 @@ string.</member>
   </para>
 </refsect3>
 
+<refsect3>
+  <title>REGISTRY CHECK [-ravTl] [-o <ODB>] [--wipe] [<DB>]</title>
+  <para>Check and repair the registry database. If no option is given a read only check of the database is done. Among others an interactive or automatic repair mode may be chosen with one of the following options
+
+  <variablelist>
+    <varlistentry><term>-r|--repair</term>
+    <listitem><para>
+      Interactive repair mode, ask a lot of questions.
+    </para></listitem>
+    </varlistentry>
+
+    <varlistentry><term>-a|--auto</term>
+    <listitem><para>
+      Noninteractive repair mode, use default answers.
+    </para></listitem>
+    </varlistentry>
+
+    <varlistentry><term>-v|--verbose</term>
+      <listitem><para>
+	Produce more output.
+      </para></listitem>
+    </varlistentry>
+
+    <varlistentry><term>-T|--test</term>
+      <listitem><para>
+	Dry run, show what changes would be made but don't touch anything.
+      </para></listitem>
+    </varlistentry>
+
+    <varlistentry><term>-l|--lock</term>
+      <listitem><para>
+	Lock the database while doing the check.
+      </para></listitem>
+    </varlistentry>
+
+   <varlistentry><term>--force-version={1,2,3}</term>
+      <listitem><para>
+	Specify the format of the registry database.
+      </para></listitem>
+    </varlistentry>
+
+    <varlistentry><term>[--db] <DB></term>
+      <listitem><para>
+	Check the specified database.
+      </para></listitem>
+    </varlistentry>
+
+    <varlistentry><term>-o|--output <ODB></term>
+      <listitem><para>
+	Create a new registry database <ODB> instead of modifying the
+	input. If <ODB> is already existing --wipe may be used to override it.
+      </para></listitem>
+    </varlistentry>
+
+   <varlistentry><term>--wipe</term>
+      <listitem><para>
+	Replace the registry database with the fixed one instead of modifying the
+	input.
+      </para></listitem>
+    </varlistentry>
+
+    <varlistentry><term></term>
+      <listitem><para>
+      </para></listitem>
+    </varlistentry>
+  </variablelist>
+  </para>
+</refsect3>
 
 </refsect2>
 
diff --git a/source3/VERSION b/source3/VERSION
index c2d80e9..99d389c 100644
--- a/source3/VERSION
+++ b/source3/VERSION
@@ -85,7 +85,7 @@ SAMBA_VERSION_IS_GIT_SNAPSHOT=no
 #                                                      #
 ########################################################
 SAMBA_VERSION_VENDOR_SUFFIX="ctdb"
-SAMBA_VERSION_VENDOR_PATCH=21
+SAMBA_VERSION_VENDOR_PATCH=22
 
 ########################################################
 # This can be set by vendors if they want..            #
diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c
index 6e5e150..ddccaad 100644
--- a/source3/registry/reg_backend_db.c
+++ b/source3/registry/reg_backend_db.c
@@ -35,6 +35,8 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_REGISTRY
 
+#define REGDB_VERSION_KEYNAME "INFO/version"
+
 static struct db_context *regdb = NULL;
 static int regdb_refcount;
 
@@ -366,15 +368,26 @@ static int regdb_normalize_keynames_fn(struct db_record *rec,
 	TALLOC_CTX *mem_ctx = talloc_tos();
 	const char *keyname;
 	NTSTATUS status;
+	struct db_context *db = (struct db_context *)private_data;
 
 	if (rec->key.dptr == NULL || rec->key.dsize == 0) {
 		return 0;
 	}
 
+	if (db == NULL) {
+		DEBUG(0, ("regdb_normalize_keynames_fn: ERROR: "
+			  "NULL db context handed in via private_data\n"));
+		return 1;
+	}
+
+	if (strncmp((const char *)rec->key.dptr, REGDB_VERSION_KEYNAME,
+	    strlen(REGDB_VERSION_KEYNAME)) == 0)
+	{
+		return 0;
+	}
+
 	keyname = strchr((const char *) rec->key.dptr, '/');
 	if (keyname) {
-		struct db_record new_rec;
-
 		keyname = talloc_string_sub(mem_ctx,
 					    (const char *) rec->key.dptr,
 					    "/",
@@ -384,10 +397,6 @@ static int regdb_normalize_keynames_fn(struct db_record *rec,
 			  (const char *) rec->key.dptr,
 			  keyname));
 
-		new_rec.value = rec->value;
-		new_rec.key = string_term_tdb_data(keyname);
-		new_rec.private_data = rec->private_data;
-
 		/* Delete the original record and store the normalized key */
 		status = rec->delete_rec(rec);
 		if (!NT_STATUS_IS_OK(status)) {
@@ -397,7 +406,8 @@ static int regdb_normalize_keynames_fn(struct db_record *rec,
 			return 1;
 		}
 
-		status = rec->store(&new_rec, new_rec.value, TDB_REPLACE);
+		status = dbwrap_store_bystring(db, keyname, rec->value,
+					       TDB_REPLACE);
 		if (!NT_STATUS_IS_OK(status)) {
 			DEBUG(0,("regdb_normalize_keynames_fn: "
 				 "failed to store new record for [%s]!\n",
@@ -412,20 +422,18 @@ static int regdb_normalize_keynames_fn(struct db_record *rec,
 static WERROR regdb_store_regdb_version(struct db_context *db, uint32_t version)
 {
 	NTSTATUS status;
-	const char *version_keyname = "INFO/version";
-
 	if (db == NULL) {
 		return WERR_CAN_NOT_COMPLETE;
 	}
 
-	status = dbwrap_trans_store_int32(db, version_keyname, version);
+	status = dbwrap_trans_store_int32(db, REGDB_VERSION_KEYNAME, version);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(1, ("regdb_store_regdb_version: error storing %s = %d: %s\n",
-			  version_keyname, version, nt_errstr(status)));
+			  REGDB_VERSION_KEYNAME, version, nt_errstr(status)));
 		return ntstatus_to_werror(status);
 	} else {
 		DEBUG(10, ("regdb_store_regdb_version: stored %s = %d\n",
-			  version_keyname, version));
+			  REGDB_VERSION_KEYNAME, version));
 		return WERR_OK;
 	}
 }
@@ -438,7 +446,7 @@ static WERROR regdb_upgrade_v1_to_v2(struct db_context *db)
 
 	mem_ctx = talloc_stackframe();
 
-	rc = regdb->traverse(db, regdb_normalize_keynames_fn, mem_ctx);
+	rc = db->traverse(db, regdb_normalize_keynames_fn, db);
 
 	talloc_free(mem_ctx);
 
@@ -460,13 +468,26 @@ static int regdb_upgrade_v2_to_v3_fn(struct db_record *rec, void *private_data)
 	uint32_t buflen, len;
 	uint32_t num_items;
 	uint32_t i;
+	struct db_context *db = (struct db_context *)private_data;
 
 	if (rec->key.dptr == NULL || rec->key.dsize == 0) {
 		return 0;
 	}
 
+	if (db == NULL) {
+		DEBUG(0, ("regdb_normalize_keynames_fn: ERROR: "
+			  "NULL db context handed in via private_data\n"));
+		return 1;
+	}
+
 	keyname = (const char *)rec->key.dptr;
 
+	if (strncmp(keyname, REGDB_VERSION_KEYNAME,
+		    strlen(REGDB_VERSION_KEYNAME)) == 0)
+	{
+		return 0;
+	}
+
 	if (strncmp(keyname, REG_SORTED_SUBKEYS_PREFIX,
 		    strlen(REG_SORTED_SUBKEYS_PREFIX)) == 0)
 	{
@@ -518,7 +539,7 @@ static int regdb_upgrade_v2_to_v3_fn(struct db_record *rec, void *private_data)
 		DEBUG(10, ("regdb_upgrade_v2_to_v3: "
 			   "writing subkey list for [%s\\%s]\n",
 			   keyname, subkeyname));
-		werr = regdb_store_subkey_list(regdb, keyname, subkeyname);
+		werr = regdb_store_subkey_list(db, keyname, subkeyname);
 		if (!W_ERROR_IS_OK(werr)) {
 			return 1;
 		}
@@ -531,9 +552,8 @@ static WERROR regdb_upgrade_v2_to_v3(struct db_context *db)
 {
 	int rc;
 	WERROR werr;
-	TALLOC_CTX *frame = talloc_stackframe();
 
-	rc = regdb->traverse(db, regdb_upgrade_v2_to_v3_fn, frame);
+	rc = regdb->traverse(db, regdb_upgrade_v2_to_v3_fn, db);
 	if (rc < 0) {
 		werr = WERR_REG_IO_FAILURE;
 		goto done;
@@ -542,7 +562,6 @@ static WERROR regdb_upgrade_v2_to_v3(struct db_context *db)
 	werr = regdb_store_regdb_version(db, REGVER_V3);
 
 done:
-	talloc_free(frame);
 	return werr;
 }
 
@@ -552,7 +571,6 @@ done:
 
 WERROR regdb_init(void)
 {
-	const char *vstring = "INFO/version";
 	uint32 vers_id, expected_version;
 	WERROR werr;
 
@@ -584,7 +602,7 @@ WERROR regdb_init(void)
 
 	expected_version = REGVER_V3;
 
-	vers_id = dbwrap_fetch_int32(regdb, vstring);
+	vers_id = dbwrap_fetch_int32(regdb, REGDB_VERSION_KEYNAME);
 	if (vers_id == -1) {
 		DEBUG(10, ("regdb_init: registry version uninitialized "
 			   "(got %d), initializing to version %d\n",
diff --git a/source3/smbd/msg_idmap.c b/source3/smbd/msg_idmap.c
index 2a00f1b..564952b 100644
--- a/source3/smbd/msg_idmap.c
+++ b/source3/smbd/msg_idmap.c
@@ -149,6 +149,17 @@ static void delete_from_cache(const struct id* id)
 	}
 }
 
+static void messaging_send_to_children(struct messaging_context *msg_ctx,
+				       uint32_t msg_type, DATA_BLOB* data)
+{
+	struct child_pid *child;
+	for (child = children; child != NULL; child = child->next) {
+		messaging_send(msg_ctx, pid_to_procid(child->pid),
+			       msg_type, data);
+	}
+}
+
+
 
 static void message_idmap_flush(struct messaging_context *msg_ctx,
 				void* private_data,
@@ -167,7 +178,10 @@ static void message_idmap_flush(struct messaging_context *msg_ctx,
 		flush_uid_cache();
 	} else {
 		DEBUG(0, ("Invalid argument: %s\n", msg));
+		return;
 	}
+
+	messaging_send_to_children(msg_ctx, msg_type, data);
 }
 
 
@@ -187,6 +201,8 @@ static void message_idmap_delete(struct messaging_context *msg_ctx,
 		return;
 	}
 
+	messaging_send_to_children(msg_ctx, msg_type, data);
+
 	if( do_kill && id_in_use(validated_users, &id) ) {
 		exit_server_cleanly(msg);
 	} else {
diff --git a/source3/utils/net_registry.c b/source3/utils/net_registry.c
index 9a436cf..403385e 100644
--- a/source3/utils/net_registry.c
+++ b/source3/utils/net_registry.c
@@ -1253,18 +1253,18 @@ static int net_registry_check(struct net_context *c, int argc,
 	if (argc > 1|| c->display_usage) {
 		d_printf("%s\n%s",
 			 _("Usage:"),
-			 _("net registry check  [-v] [-r] [-a] [-T] [-f] [-l] [[--db=]<TDB>]\n"
+			 _("net registry check  [-vraTfl] [-o <ODB>] [--wipe] [<TDB>]\n"
 			   "  Check a registry database.\n"
-			   "    --verbose,-v\tverbose\n"
-			   "    --repair,-r\trepair\n"
-			   "    --auto,-a\tnoninteractive mode\n"
-			   "    --test,-T\tdry run\n"
-			   "    --force,-f\tforce\n"
-			   "    --lock,-l\tlock db while doing the check\n"
-			   "    --force-version\tgive database format {1,2,3}\n"
-			   "    --output,-o\toutput database\n"
-			   "    --wipe\t\n"
-			   "    TDB\tregistry database\n"));
+			   "    -v|--verbose\t be verbose\n"
+			   "    -r|--repair\t\t interactive repair mode\n"
+			   "    -a|--auto\t\t noninteractive repair mode\n"
+			   "    -T|--test\t\t dry run\n"
+			   "    -f|--force\t\t force\n"
+			   "    -l|--lock\t\t lock <TDB> while doing the check\n"
+			   "    -o|--output=<ODB>\t output database\n"
+			   "    --force-version=n\t assume database format version {n|1,2,3}\n"
+			   "    --wipe\t\t create a new database from scratch\n"
+			   "    --db=<TDB>\t\t registry database to open\n"));
 		return c->display_usage ? 0 : -1;
 	}
 
@@ -1274,7 +1274,6 @@ static int net_registry_check(struct net_context *c, int argc,
 	if (dbfile == NULL) {
 		return -1;
 	}
-	d_fprintf(stderr, _("check database: %s\n"), dbfile);
 
 	opts = (struct check_options) {
 		.lock = c->opt_lock || c->opt_long_list_entries,
diff --git a/source3/utils/net_registry_check.c b/source3/utils/net_registry_check.c
index bbc6e27..778dae7 100644
--- a/source3/utils/net_registry_check.c
+++ b/source3/utils/net_registry_check.c
@@ -411,22 +411,25 @@ static void check_ctx_transaction_stop(struct check_ctx *ctx, bool ok) {
 		return;
 	}
 	if (!ctx->opt.test && ok) {
+		d_printf("Commiting changes\n");
 		if (ctx->odb->transaction_commit(ctx->odb) != 0) {
 			DEBUG(0, ("transaction_commit failed\n"));
 		}
 	} else {
+		d_printf("Discarding changes\n");
 		ctx->odb->transaction_cancel(ctx->odb);
 	}
 }
 
-static void read_info(struct check_ctx *ctx, const char *key, TDB_DATA val)
+static bool read_info(struct check_ctx *ctx, const char *key, TDB_DATA val)
 {
-	if (val.dsize==sizeof(uint32_t)) {
+	if (val.dsize==sizeof(uint32_t) && strcmp(key, "version")==0) {
 		uint32_t v = IVAL(val.dptr, 0);
 		printf("INFO: %s = %d\n", key, v);
-	} else {
-		printf("INFO: %s = <invalid>\n", key);
+		return true;
 	}
+	printf("INFO: %s = <invalid>\n", key);
+	return false;
 }
 
 static bool is_all_upper(const char *str) {
@@ -725,7 +728,9 @@ static int check_tdb_action(struct db_record *rec, void *check_ctx)
 		if (srprs_str(&pos, REG_INFO_PREFIX, -1) &&
 		    srprs_char(&pos, '/'))
 		{
-			read_info(ctx, pos, val);
+			if ( !read_info(ctx, pos, val) ) {
+				invalid_path = true;
+			}
 		} else if (normalize_path(key, ctx->sep)) {
 			printf("Unnormal key: \"%.*s\"\n",
 			       (int)rec->key.dsize, rec->key.dptr);
@@ -751,6 +756,9 @@ static int check_tdb_action(struct db_record *rec, void *check_ctx)
 		{
 			read_sorted(ctx, path, val);
 			break;
+		} else if (srprs_str(&pos, "__DB_SEQUENCE_NUMBER__", -1)) {
+			printf("Skip key: \"%.*s\"\n",
+			       (int)rec->key.dsize, rec->key.dptr);
 		} else {
 			printf("Unrecognized key: \"%.*s\"\n",
 			       (int)rec->key.dsize, rec->key.dptr);
@@ -1081,11 +1089,22 @@ int net_registry_check_db(const char *name, const struct check_options *opt)
 	NTSTATUS status;
 	int ret = -1;
 	struct check_ctx *ctx = check_ctx_create(talloc_tos(), name, opt);
+	if (ctx==NULL) {
+		goto done;
+	}
+
+	d_printf("Check database: %s\n", name);
 
 	if (opt->automatic) {
 		printf("Sorry, automatic mode not yet implemented!\n");
 		goto done;
 	}
+
+	if (opt->force) {
+		printf("Nothing to force yet, flag ignored!\n");
+	}
+
+
 	/* 1. open output RW */
 	if (!check_ctx_open_output(ctx)) {
 		goto done;
diff --git a/source3/winbindd/winbindd_group.c b/source3/winbindd/winbindd_group.c
index a985fa2..9cc1d14 100644
--- a/source3/winbindd/winbindd_group.c
+++ b/source3/winbindd/winbindd_group.c
@@ -115,7 +115,7 @@ NTSTATUS winbindd_print_groupmembers(struct talloc_dict *members,
 	c.len = 0;
 
 	res = talloc_dict_traverse(members, getgr_calc_memberlen, &c);
-	if (res != 0) {
+	if (res == -1) {
 		DEBUG(5, ("talloc_dict_traverse failed\n"));
 		return NT_STATUS_INTERNAL_ERROR;
 	}
@@ -128,7 +128,7 @@ NTSTATUS winbindd_print_groupmembers(struct talloc_dict *members,
 	}
 
 	res = talloc_dict_traverse(members, getgr_unparse_members, &m);
-	if (res != 0) {
+	if (res == -1) {
 		DEBUG(5, ("talloc_dict_traverse failed\n"));
 		TALLOC_FREE(m.buf);
 		return NT_STATUS_INTERNAL_ERROR;


-- 
SAMBA-CTDB repository


More information about the samba-cvs mailing list