[SCM] Samba Shared Repository - branch master updated

Michael Adam obnox at samba.org
Wed Jun 27 02:08:02 MDT 2012


The branch, master has been updated
       via  dba03a6 s3:registry: change reg_import.c according to coding guidelines.
       via  7bc1172 s3:registry: use TALLOC_CTX * instead of const void * in reg_import_adapter()
       via  c4be17f s3: add a tool "cclean" to cleanup orphaned entries from connections.tdb
       via  088e505 s3:conn_tdb: add a function connections_fetch_entry_ext() that also takes the cnum
       via  c71062f s3:lib:dbwrap: fix return value of db_ctdb_traverse[_read] for non-persistent dbs
      from  082b906 s3-printing: fix broken print_job_get_name() return

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit dba03a644d9e9211d4876597a51a83656fc5b625
Author: Michael Adam <obnox at samba.org>
Date:   Wed Jun 27 08:20:59 2012 +0200

    s3:registry: change reg_import.c according to coding guidelines.
    
    Autobuild-User(master): Michael Adam <obnox at samba.org>
    Autobuild-Date(master): Wed Jun 27 10:07:54 CEST 2012 on sn-devel-104

commit 7bc1172c5f36619fad2acd5a863054b472a036e8
Author: Michael Adam <obnox at samba.org>
Date:   Wed Jun 27 08:20:31 2012 +0200

    s3:registry: use TALLOC_CTX * instead of const void * in reg_import_adapter()

commit c4be17f804a857630b4c5f9d0aad70b508e56e2e
Author: Gregor Beck <gbeck at sernet.de>
Date:   Thu Jun 7 13:34:35 2012 +0200

    s3: add a tool "cclean" to cleanup orphaned entries from connections.tdb
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 088e505e84c18709a30301aa410792f5a434c27d
Author: Gregor Beck <gbeck at sernet.de>
Date:   Thu Jun 7 13:25:17 2012 +0200

    s3:conn_tdb: add a function connections_fetch_entry_ext() that also takes the cnum
    
    and have connections_fetch_entry() call connections_fetch_entry_ext().
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit c71062fcf4ca192e94ecd32268f79e2bef19428a
Author: Gregor Beck <gbeck at sernet.de>
Date:   Tue Jun 12 10:10:36 2012 +0200

    s3:lib:dbwrap: fix return value of db_ctdb_traverse[_read] for non-persistent dbs
    
    to return the number of traversed records upon successful traverse.
    
    Signed-off-by: Michael Adam <obnox at samba.org>

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

Summary of changes:
 source3/Makefile.in              |   13 ++-
 source3/lib/conn_tdb.c           |   20 ++-
 source3/lib/conn_tdb.h           |    4 +
 source3/lib/dbwrap/dbwrap_ctdb.c |   23 ++-
 source3/registry/reg_import.c    |  102 ++++++-------
 source3/registry/reg_import.h    |    2 +-
 source3/utils/cclean.c           |  300 ++++++++++++++++++++++++++++++++++++++
 source3/wscript_build            |   12 ++
 8 files changed, 409 insertions(+), 67 deletions(-)
 create mode 100644 source3/utils/cclean.c


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index 148de92..41f6683 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -212,7 +212,7 @@ SBIN_PROGS = bin/smbd bin/nmbd @SWAT_SBIN_TARGETS@ @EXTRA_SBIN_PROGS@
 
 BIN_PROGS1 = bin/smbclient bin/net bin/smbspool \
 	bin/testparm bin/smbstatus bin/smbget \
-	bin/smbta-util
+	bin/smbta-util bin/cclean
 BIN_PROGS2 = bin/smbcontrol bin/smbtree $(TDBBACKUP) \
 	bin/nmblookup bin/pdbedit $(TDBDUMP) \
 	$(TDBRESTORE) $(TDBTOOL) bin/dbwrap_tool
@@ -1049,6 +1049,12 @@ STATUS_OBJ = utils/status.o utils/status_profile.o \
              $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
 	     $(LIBSMB_ERR_OBJ) $(FNAME_UTIL_OBJ)
 
+CCLEAN_OBJ = utils/cclean.o utils/interact.o \
+	$(LOCKING_OBJ) $(PARAM_OBJ) \
+        $(PROFILE_OBJ) $(LIB_NONSMBD_OBJ) $(POPT_LIB_OBJ) \
+        $(LIBSMB_ERR_OBJ) $(FNAME_UTIL_OBJ)
+
+
 SMBCONTROL_OBJ = utils/smbcontrol.o $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \
 	$(LIBSMB_ERR_OBJ) $(POPT_LIB_OBJ) $(PRINTBASE_OBJ)
 
@@ -1965,6 +1971,11 @@ bin/smbstatus: $(BINARY_PREREQS) $(STATUS_OBJ) @BUILD_POPT@ $(LIBTALLOC) $(LIBTD
 	@$(CC) -o $@ $(STATUS_OBJ) $(LDFLAGS) $(DYNEXP) $(LIBS) \
 		$(LDAP_LIBS) $(POPT_LIBS) $(LIBTALLOC_LIBS) $(LIBTDB_LIBS)
 
+bin/cclean: $(BINARY_PREREQS) $(CCLEAN_OBJ) @BUILD_POPT@ $(LIBTALLOC) $(LIBTDB)
+	@echo Linking $@
+	@$(CC) -o $@ $(CCLEAN_OBJ) $(LDFLAGS) $(DYNEXP) $(LIBS) \
+		$(LDAP_LIBS) $(POPT_LIBS) $(LIBTALLOC_LIBS) $(LIBTDB_LIBS)
+
 bin/smbcontrol: $(BINARY_PREREQS) $(SMBCONTROL_OBJ) @BUILD_POPT@ $(LIBTALLOC) $(LIBTDB)
 	@echo Linking $@
 	@$(CC) -DUSING_SMBCONTROL -o $@ \
diff --git a/source3/lib/conn_tdb.c b/source3/lib/conn_tdb.c
index 776f53c..fb605e1 100644
--- a/source3/lib/conn_tdb.c
+++ b/source3/lib/conn_tdb.c
@@ -54,16 +54,17 @@ static struct db_record *connections_fetch_record(TALLOC_CTX *mem_ctx,
 	return dbwrap_fetch_locked(ctx, mem_ctx, key);
 }
 
-struct db_record *connections_fetch_entry(TALLOC_CTX *mem_ctx,
-					  connection_struct *conn,
-					  const char *name)
+struct db_record *connections_fetch_entry_ext(TALLOC_CTX *mem_ctx,
+					      struct server_id id,
+					      int cnum,
+					      const char *name)
 {
 	struct connections_key ckey;
 	TDB_DATA key;
 
 	ZERO_STRUCT(ckey);
-	ckey.pid = messaging_server_id(conn->sconn->msg_ctx);
-	ckey.cnum = conn->cnum;
+	ckey.pid = id;
+	ckey.cnum = cnum;
 	strlcpy(ckey.name, name, sizeof(ckey.name));
 
 	key.dsize = sizeof(ckey);
@@ -72,6 +73,15 @@ struct db_record *connections_fetch_entry(TALLOC_CTX *mem_ctx,
 	return connections_fetch_record(mem_ctx, key);
 }
 
+struct db_record *connections_fetch_entry(TALLOC_CTX *mem_ctx,
+					  connection_struct *conn,
+					  const char *name)
+{
+	struct server_id id = messaging_server_id(conn->sconn->msg_ctx);
+	return connections_fetch_entry_ext(mem_ctx, id, conn->cnum, name);
+}
+
+
 struct conn_traverse_state {
 	int (*fn)(struct db_record *rec,
 		  const struct connections_key *key,
diff --git a/source3/lib/conn_tdb.h b/source3/lib/conn_tdb.h
index ee4befe..9b63364 100644
--- a/source3/lib/conn_tdb.h
+++ b/source3/lib/conn_tdb.h
@@ -47,6 +47,10 @@ struct connections_data {
 struct db_record *connections_fetch_entry(TALLOC_CTX *mem_ctx,
 					  connection_struct *conn,
 					  const char *name);
+struct db_record *connections_fetch_entry_ext(TALLOC_CTX *mem_ctx,
+					      struct server_id id,
+					      int cnum,
+					      const char *name);
 int connections_traverse(int (*fn)(struct db_record *rec,
 				   void *private_data),
 			 void *private_data);
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c
index 7df025f..7bb206b 100644
--- a/source3/lib/dbwrap/dbwrap_ctdb.c
+++ b/source3/lib/dbwrap/dbwrap_ctdb.c
@@ -1283,6 +1283,7 @@ struct traverse_state {
 	struct db_context *db;
 	int (*fn)(struct db_record *rec, void *private_data);
 	void *private_data;
+	int count;
 };
 
 static void traverse_callback(TDB_DATA key, TDB_DATA data, void *private_data)
@@ -1339,6 +1340,7 @@ static int db_ctdb_traverse(struct db_context *db,
 				      void *private_data),
 			    void *private_data)
 {
+	NTSTATUS status;
         struct db_ctdb_ctx *ctx = talloc_get_type_abort(db->private_data,
                                                         struct db_ctdb_ctx);
 	struct traverse_state state;
@@ -1346,6 +1348,7 @@ static int db_ctdb_traverse(struct db_context *db,
 	state.db = db;
 	state.fn = fn;
 	state.private_data = private_data;
+	state.count = 0;
 
 	if (db->persistent) {
 		struct tdb_context *ltdb = ctx->wtdb->tdb;
@@ -1365,7 +1368,6 @@ static int db_ctdb_traverse(struct db_context *db,
 			struct db_context *newkeys = db_open_rbt(talloc_tos());
 			struct ctdb_marshall_buffer *mbuf = ctx->transaction->m_write;
 			struct ctdb_rec_data *rec=NULL;
-			NTSTATUS status;
 			int i;
 			int count = 0;
 
@@ -1397,9 +1399,11 @@ static int db_ctdb_traverse(struct db_context *db,
 		return ret;
 	}
 
-
-	ctdbd_traverse(ctx->db_id, traverse_callback, &state);
-	return 0;
+	status = ctdbd_traverse(ctx->db_id, traverse_callback, &state);
+	if (!NT_STATUS_IS_OK(status)) {
+		return -1;
+	}
+	return state.count;
 }
 
 static NTSTATUS db_ctdb_store_deny(struct db_record *rec, TDB_DATA data, int flag)
@@ -1422,6 +1426,7 @@ static void traverse_read_callback(TDB_DATA key, TDB_DATA data, void *private_da
 	rec.delete_rec = db_ctdb_delete_deny;
 	rec.private_data = state->db;
 	state->fn(&rec, state->private_data);
+	state->count++;
 }
 
 static int traverse_persistent_callback_read(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf,
@@ -1453,6 +1458,7 @@ static int traverse_persistent_callback_read(TDB_CONTEXT *tdb, TDB_DATA kbuf, TD
 	rec.value.dsize -= sizeof(struct ctdb_ltdb_header);
 	rec.value.dptr += sizeof(struct ctdb_ltdb_header);
 
+	state->count++;
 	return state->fn(&rec, state->private_data);
 }
 
@@ -1461,6 +1467,7 @@ static int db_ctdb_traverse_read(struct db_context *db,
 					   void *private_data),
 				 void *private_data)
 {
+	NTSTATUS status;
         struct db_ctdb_ctx *ctx = talloc_get_type_abort(db->private_data,
                                                         struct db_ctdb_ctx);
 	struct traverse_state state;
@@ -1468,6 +1475,7 @@ static int db_ctdb_traverse_read(struct db_context *db,
 	state.db = db;
 	state.fn = fn;
 	state.private_data = private_data;
+	state.count = 0;
 
 	if (db->persistent) {
 		/* for persistent databases we don't need to do a ctdb traverse,
@@ -1475,8 +1483,11 @@ static int db_ctdb_traverse_read(struct db_context *db,
 		return tdb_traverse_read(ctx->wtdb->tdb, traverse_persistent_callback_read, &state);
 	}
 
-	ctdbd_traverse(ctx->db_id, traverse_read_callback, &state);
-	return 0;
+	status = ctdbd_traverse(ctx->db_id, traverse_read_callback, &state);
+	if (!NT_STATUS_IS_OK(status)) {
+		return -1;
+	}
+	return state.count;
 }
 
 static int db_ctdb_get_seqnum(struct db_context *db)
diff --git a/source3/registry/reg_import.c b/source3/registry/reg_import.c
index 5f99b07..8bcce68 100644
--- a/source3/registry/reg_import.c
+++ b/source3/registry/reg_import.c
@@ -28,52 +28,47 @@
 /* Debuglevel for tracing */
 static const int TL = 2;
 
-struct reg_import
-{
+struct reg_import {
 	struct reg_parse_callback reg_parse_callback;
 	struct reg_import_callback call;
-	void* open_key;
+	void *open_key;
 };
 
-static int
-reg_parse_callback_key(struct reg_import* cb_private,
-		       const char* key[], size_t n,
-		       bool del);
+static int reg_parse_callback_key(struct reg_import *cb_private,
+				  const char *key[], size_t n, bool del);
 
-static int
-reg_parse_callback_val(struct reg_import* cb_private,
-		       const char* name, uint32_t type,
-		       const uint8_t* data, uint32_t len);
+static int reg_parse_callback_val(struct reg_import *cb_private,
+				  const char *name, uint32_t type,
+				  const uint8_t *data, uint32_t len);
 
-static int
-reg_parse_callback_val_registry_value(struct reg_import* cb_private,
-				      const char* name, uint32_t type,
-				      const uint8_t* data, uint32_t len);
+static int reg_parse_callback_val_registry_value(struct reg_import *cb_private,
+						 const char *name,
+						 uint32_t type,
+						 const uint8_t *data,
+						 uint32_t len);
 
-static int
-reg_parse_callback_val_regval_blob(struct reg_import* cb_private,
-				   const char* name, uint32_t type,
-				   const uint8_t* data, uint32_t len);
+static int reg_parse_callback_val_regval_blob(struct reg_import *cb_private,
+					      const char *name, uint32_t type,
+					      const uint8_t *data,
+					      uint32_t len);
 
-static int
-reg_parse_callback_val_del(struct reg_import* cb_private,
-			   const char* name);
+static int reg_parse_callback_val_del(struct reg_import *cb_private,
+				      const char *name);
 
-static int
-reg_parse_callback_comment(struct reg_import* cb_private,
-			   const char* txt);
+static int reg_parse_callback_comment(struct reg_import *cb_private,
+				      const char *txt);
 
 
 /*******************************************************************************/
 
-int reg_parse_callback_key(struct reg_import* p,
-			   const char* key[], size_t n, bool del)
+int reg_parse_callback_key(struct reg_import *p,
+			   const char *key[], size_t n, bool del)
 {
 	WERROR werr = WERR_OK;
 
 	DEBUG(TL, ("%s: %s\n", __FUNCTION__, key[0]));
 
-	if (p->open_key != NULL ) {
+	if (p->open_key != NULL) {
 		werr = p->call.closekey(p->call.data, p->open_key);
 		p->open_key = NULL;
 		if (!W_ERROR_IS_OK(werr)) {
@@ -91,8 +86,7 @@ int reg_parse_callback_key(struct reg_import* p,
 			DEBUG(0, ("deletekey %s failed: %s\n",
 				  key[0], win_errstr(werr)));
 		}
-	}
-	else {
+	} else {
 		bool existing;
 		werr = p->call.createkey(p->call.data, NULL, key[0],
 					 &p->open_key, &existing);
@@ -122,9 +116,9 @@ int reg_parse_callback_key(struct reg_import* p,
 	} while(0)
 
 /*----------------------------------------------------------------------------*/
-int reg_parse_callback_val(struct reg_import* p,
-			   const char* name, uint32_t type,
-			   const uint8_t* data, uint32_t len)
+int reg_parse_callback_val(struct reg_import *p,
+			   const char *name, uint32_t type,
+			   const uint8_t *data, uint32_t len)
 {
 	WERROR werr = WERR_OK;
 
@@ -142,9 +136,9 @@ int reg_parse_callback_val(struct reg_import* p,
 }
 
 /*----------------------------------------------------------------------------*/
-int reg_parse_callback_val_registry_value(struct reg_import* p,
-					  const char* name, uint32_t type,
-					  const uint8_t* data, uint32_t len)
+int reg_parse_callback_val_registry_value(struct reg_import *p,
+					  const char *name, uint32_t type,
+					  const uint8_t *data, uint32_t len)
 {
 	WERROR werr = WERR_OK;
 	struct registry_value val = {
@@ -167,13 +161,13 @@ int reg_parse_callback_val_registry_value(struct reg_import* p,
 }
 
 /*----------------------------------------------------------------------------*/
-int reg_parse_callback_val_regval_blob(struct reg_import* p,
-				       const char* name, uint32_t type,
-				       const uint8_t* data, uint32_t len)
+int reg_parse_callback_val_regval_blob(struct reg_import *p,
+				       const char *name, uint32_t type,
+				       const uint8_t *data, uint32_t len)
 {
 	WERROR werr = WERR_OK;
 	void* mem_ctx = talloc_new(p);
-	struct regval_blob* v = NULL;
+	struct regval_blob *v = NULL;
 
 	DEBUG(TL, ("%s(%x): >%s< = [%x]\n", __FUNCTION__, type, name, len));
 	DEBUG_ADD_HEX(TL, data, len);
@@ -200,8 +194,8 @@ done:
 
 /*----------------------------------------------------------------------------*/
 
-int reg_parse_callback_val_del(struct reg_import* p,
-			       const char* name)
+int reg_parse_callback_val_del(struct reg_import *p,
+			       const char *name)
 {
 	WERROR werr = WERR_OK;
 
@@ -217,41 +211,41 @@ int reg_parse_callback_val_del(struct reg_import* p,
 }
 
 
-int reg_parse_callback_comment(struct reg_import* cb_private,
-			       const char* txt)
+int reg_parse_callback_comment(struct reg_import *cb_private,
+			       const char *txt)
 {
 	DEBUG(TL, ("%s: %s\n", __FUNCTION__, txt));
 	return 0;
 }
 
 /******************************************************************************/
-static int nop(void* data)
+static int nop(void *data)
 {
 	return 0;
 }
 
 
-struct reg_parse_callback* reg_import_adapter(const void* talloc_ctx,
+struct reg_parse_callback *reg_import_adapter(TALLOC_CTX *talloc_ctx,
 					      struct reg_import_callback cb)
 {
-	struct reg_parse_callback* ret;
-	struct reg_import* p = talloc_zero(talloc_ctx, struct reg_import);
+	struct reg_parse_callback *ret;
+	struct reg_import *p = talloc_zero(talloc_ctx, struct reg_import);
 	if (p == NULL) {
 		goto fail;
 	}
-	if (cb.openkey == NULL ) {
+	if (cb.openkey == NULL) {
 		cb.openkey = (reg_import_callback_openkey_t)&nop;
 	}
-	if (cb.closekey == NULL ) {
+	if (cb.closekey == NULL) {
 		cb.closekey = (reg_import_callback_closekey_t)&nop;
 	}
-	if (cb.createkey == NULL ) {
+	if (cb.createkey == NULL) {
 		cb.createkey = (reg_import_callback_createkey_t)&nop;
 	}
-	if (cb.deletekey == NULL ) {
+	if (cb.deletekey == NULL) {
 		cb.deletekey = (reg_import_callback_deletekey_t)&nop;
 	}
-	if (cb.deleteval == NULL ) {
+	if (cb.deleteval == NULL) {
 		cb.deleteval = (reg_import_callback_deleteval_t)&nop;
 	}
 
@@ -283,7 +277,7 @@ struct reg_parse_callback* reg_import_adapter(const void* talloc_ctx,
 		assert(false);
 	}
 
-	assert((struct reg_parse_callback*)p == ret);
+	assert((struct reg_parse_callback *)p == ret);
 	return ret;
 fail:
 	talloc_free(p);
diff --git a/source3/registry/reg_import.h b/source3/registry/reg_import.h
index 5922f9d..70db4ac 100644
--- a/source3/registry/reg_import.h
+++ b/source3/registry/reg_import.h
@@ -194,6 +194,6 @@ struct reg_import_callback {
  *
  * @return a talloc'ed reg_import object, NULL on error
  */
-struct reg_parse_callback* reg_import_adapter(const void* talloc_ctx,
+struct reg_parse_callback* reg_import_adapter(TALLOC_CTX *talloc_ctx,
 					      struct reg_import_callback cb);
 #endif
diff --git a/source3/utils/cclean.c b/source3/utils/cclean.c
new file mode 100644
index 0000000..b035d33
--- /dev/null
+++ b/source3/utils/cclean.c
@@ -0,0 +1,300 @@
+/*
+   Unix SMB/CIFS implementation.
+   cleanup connections tdb
+   Copyright (C) Gregor Beck 2012
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "serverid.h"
+#include "popt_common.h"
+#include "dbwrap/dbwrap.h"
+#include "util_tdb.h"
+#include "messages.h"
+#include "system/filesys.h"
+#include "interact.h"
+#include "lib/conn_tdb.h"
+
+static bool verbose = false;
+static bool dry_run = false;
+static bool automatic = false;
+
+struct cclean_ctx {
+	struct server_id *ids;
+	int *cnums;
+	const char **names;
+	unsigned num;
+
+	bool *exists;
+	unsigned num_orphans;
+};
+
+
+static char *serverid_str(const struct server_id id)
+{
+	return talloc_asprintf(talloc_tos(), "pid %u, vnn %u, uid %lu",
+			       (unsigned)id.pid, (unsigned)id.vnn, id.unique_id);
+}
+
+static void print_record(const char *msg,
+			 const struct connections_key *k,
+			 const struct connections_data *d)
+{
+	char *idstr = serverid_str(k->pid);
+	d_printf("%s: connection %d (%s) to \"%s\" from %u:%u@%s[%s] %s\n", msg,
+		 k->cnum, idstr, d->servicename, (unsigned)d->uid,
+		 (unsigned)d->gid, d->machine, d->addr, time_to_asc(d->start));
+	talloc_free(idstr);
+}
+
+static int read_connections_fn(const struct connections_key *key,
+			       const struct connections_data *data,
+			       void *cclean_ctx)
+{
+	struct cclean_ctx *ctx = (struct cclean_ctx *)cclean_ctx;
+	unsigned length = talloc_array_length(ctx->cnums);
+	if (length <= ctx->num) {
+		int n = 2*length;
+		void *tmp;
+
+		tmp = talloc_realloc(ctx, ctx->ids, struct server_id, n);
+		if (tmp == NULL) {
+			goto talloc_failed;
+		}
+		ctx->ids = (struct server_id *)tmp;
+
+		tmp = talloc_realloc(ctx, ctx->cnums, int, n);
+		if (tmp == NULL) {
+			goto talloc_failed;
+		}
+		ctx->cnums = (int *)tmp;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list