svn commit: samba r16562 - in branches/tmp/vl-messaging/source: . include lib locking param

jmcd at samba.org jmcd at samba.org
Tue Jun 27 14:24:26 GMT 2006


Author: jmcd
Date: 2006-06-27 14:24:25 +0000 (Tue, 27 Jun 2006)
New Revision: 16562

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16562

Log:
Aleksey's changes to put in dbwrapper to later enable messaging.

Modified:
   branches/tmp/vl-messaging/source/Makefile.in
   branches/tmp/vl-messaging/source/include/smb.h
   branches/tmp/vl-messaging/source/lib/dbwrap_file.c
   branches/tmp/vl-messaging/source/lib/dbwrap_tdb.c
   branches/tmp/vl-messaging/source/locking/brlock.c
   branches/tmp/vl-messaging/source/locking/locking.c
   branches/tmp/vl-messaging/source/param/loadparm.c


Changeset:
Modified: branches/tmp/vl-messaging/source/Makefile.in
===================================================================
--- branches/tmp/vl-messaging/source/Makefile.in	2006-06-27 11:07:55 UTC (rev 16561)
+++ branches/tmp/vl-messaging/source/Makefile.in	2006-06-27 14:24:25 UTC (rev 16562)
@@ -182,7 +182,7 @@
 	tdb/lock.o tdb/open.o tdb/transaction.o tdb/traverse.o
 
 TDB_OBJ = $(TDBBASE_OBJ) tdb/tdbutil.o tdb/tdbback.o \
-	lib/dbwrap_tdb.o lib/dbwrap_file.o
+	lib/dbwrap.o lib/dbwrap_tdb.o lib/dbwrap_file.o lib/dbwrap_msg.o
 
 SMBLDAP_OBJ = @SMBLDAP@ @SMBLDAPUTIL@
 

Modified: branches/tmp/vl-messaging/source/include/smb.h
===================================================================
--- branches/tmp/vl-messaging/source/include/smb.h	2006-06-27 11:07:55 UTC (rev 16561)
+++ branches/tmp/vl-messaging/source/include/smb.h	2006-06-27 14:24:25 UTC (rev 16562)
@@ -713,6 +713,7 @@
 	BOOL initial_delete_on_close;
 	BOOL fresh;
 	BOOL modified;
+	struct db_record *record;
 };
 
 /*
@@ -862,6 +863,7 @@
 	BOOL modified;
 	struct lock_key key;
 	void *lock_data;
+	struct db_record *record;
 };
 
 #define BRLOCK_FN_CAST() \
@@ -1512,6 +1514,9 @@
 enum messaging_type {MESSAGING_TYPE_TDB, MESSAGING_TYPE_DGRAM,
 					 MESSAGING_TYPE_STREAM, MESSAGING_TYPE_DISPATCHER};
 
+/* locking types */
+enum locking_type {LOCKING_TYPE_TDB, LOCKING_TYPE_FILES, LOCKING_TYPE_MESSAGES};
+
 /*
  * Global value meaing that the smb_uid field should be
  * ingored (in share level security and protocol level == CORE)

Modified: branches/tmp/vl-messaging/source/lib/dbwrap_file.c
===================================================================
--- branches/tmp/vl-messaging/source/lib/dbwrap_file.c	2006-06-27 11:07:55 UTC (rev 16561)
+++ branches/tmp/vl-messaging/source/lib/dbwrap_file.c	2006-06-27 14:24:25 UTC (rev 16562)
@@ -123,7 +123,10 @@
 		return NULL;
 	}
 
+	become_root();
 	file->fd = open(file->path, O_RDWR|O_CREAT, 0644);
+	unbecome_root();
+
 	if (file->fd < 0) {
 		DEBUG(3, ("Could not open/create %s: %s\n",
 			  file->path, strerror(errno)));
@@ -221,11 +224,14 @@
 		talloc_get_type_abort(rec->private_data,
 				      struct db_locked_file);
 
+	become_root();
 	if (unlink(file->path) != 0) {
+		unbecome_root();
 		DEBUG(3, ("unlink(%s) failed: %s\n", file->path,
 			  strerror(errno)));
 		return -1;
 	}
+	unbecome_root();
 
 	return 0;
 }

Modified: branches/tmp/vl-messaging/source/lib/dbwrap_tdb.c
===================================================================
--- branches/tmp/vl-messaging/source/lib/dbwrap_tdb.c	2006-06-27 11:07:55 UTC (rev 16561)
+++ branches/tmp/vl-messaging/source/lib/dbwrap_tdb.c	2006-06-27 14:24:25 UTC (rev 16562)
@@ -165,7 +165,7 @@
 	return 0;
 }
 
-struct db_context *db_open(TALLOC_CTX *mem_ctx, const char *name,
+struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx, const char *name,
 			   int hash_size, int tdb_flags,
 			   int open_flags, mode_t mode)
 {

Modified: branches/tmp/vl-messaging/source/locking/brlock.c
===================================================================
--- branches/tmp/vl-messaging/source/locking/brlock.c	2006-06-27 11:07:55 UTC (rev 16561)
+++ branches/tmp/vl-messaging/source/locking/brlock.c	2006-06-27 14:24:25 UTC (rev 16562)
@@ -57,7 +57,7 @@
 
 /* The open brlock.tdb database. */
 
-static TDB_CONTEXT *tdb;
+static struct db_context *brlock_db;
 
 /****************************************************************************
  Debug info at level 10 for lock struct.
@@ -267,14 +267,14 @@
 
 void brl_init(int read_only)
 {
-	if (tdb) {
+	if (brlock_db) {
 		return;
 	}
-	tdb = tdb_open_log(lock_path("brlock.tdb"),
-			lp_open_files_db_hash_size(),
-			TDB_DEFAULT|(read_only?0x0:TDB_CLEAR_IF_FIRST),
-			read_only?O_RDONLY:(O_RDWR|O_CREAT), 0644 );
-	if (!tdb) {
+	brlock_db = db_open(NULL, lock_path("brlock.tdb"),
+						lp_open_files_db_hash_size(),
+						TDB_DEFAULT|(read_only?0x0:TDB_CLEAR_IF_FIRST),
+						read_only?O_RDONLY:(O_RDWR|O_CREAT), 0644 );
+	if (!brlock_db) {
 		DEBUG(0,("Failed to open byte range locking database %s\n",
 			lock_path("brlock.tdb")));
 		return;
@@ -287,10 +287,10 @@
 
 void brl_shutdown(int read_only)
 {
-	if (!tdb) {
+	if (!brlock_db) {
 		return;
 	}
-	tdb_close(tdb);
+	TALLOC_FREE(brlock_db);
 }
 
 #if ZERO_ZERO
@@ -1317,7 +1317,7 @@
  on each lock.
 ****************************************************************************/
 
-static int traverse_fn(TDB_CONTEXT *ttdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state)
+static int traverse_fn(TDB_DATA kbuf, TDB_DATA dbuf, void *state)
 {
 	struct lock_struct *locks;
 	struct lock_key *key;
@@ -1346,13 +1346,22 @@
 	}
 
 	if (orig_num_locks != num_locks) {
+		struct db_record *rec;
+
 		dbuf.dptr = (void *)locks;
 		dbuf.dsize = num_locks * sizeof(*locks);
 
-		if (dbuf.dsize) {
-			tdb_store(ttdb, kbuf, dbuf, TDB_REPLACE);
+		rec = brlock_db->fetch_locked(brlock_db, brlock_db, kbuf);
+
+		if(rec == NULL) {
+			DEBUG(0, ("Can't fetch db record\n"));
 		} else {
-			tdb_delete(ttdb, kbuf);
+			if (dbuf.dsize) {
+				rec->store(rec, dbuf, TDB_REPLACE);
+			} else {
+				rec->delete_rec(rec);
+			}
+			TALLOC_FREE(rec);
 		}
 	}
 
@@ -1376,10 +1385,10 @@
 
 int brl_forall(BRLOCK_FN(fn))
 {
-	if (!tdb) {
+	if (!brlock_db) {
 		return 0;
 	}
-	return tdb_traverse(tdb, traverse_fn, (void *)fn);
+	return brlock_db->traverse(brlock_db, traverse_fn, (void *)fn);
 }
 
 /*******************************************************************
@@ -1392,18 +1401,14 @@
 {
 	struct byte_range_lock *br_lck =
 		talloc_get_type_abort(p, struct byte_range_lock);
-	TDB_DATA key;
 
-	key.dptr = (char *)&br_lck->key;
-	key.dsize = sizeof(struct lock_key);
-
 	if (!br_lck->modified) {
 		goto done;
 	}
 
 	if (br_lck->num_locks == 0) {
 		/* No locks - delete this entry. */
-		if (tdb_delete(tdb, key) == -1) {
+		if (br_lck->record->delete_rec(br_lck->record) == -1) {
 			smb_panic("Could not delete byte range lock entry\n");
 		}
 	} else {
@@ -1411,15 +1416,15 @@
 		data.dptr = br_lck->lock_data;
 		data.dsize = br_lck->num_locks * sizeof(struct lock_struct);
 
-		if (tdb_store(tdb, key, data, TDB_REPLACE) == -1) {
+		if (br_lck->record->store(br_lck->record, data, TDB_REPLACE) == -1) {
 			smb_panic("Could not store byte range mode entry\n");
 		}
 	}
 
  done:
 
-	tdb_chainunlock(tdb, key);
 	SAFE_FREE(br_lck->lock_data);
+	TALLOC_FREE(br_lck->record);
 	return 0;
 }
 
@@ -1433,7 +1438,6 @@
 					files_struct *fsp)
 {
 	TDB_DATA key;
-	TDB_DATA data;
 	struct byte_range_lock *br_lck = TALLOC_P(mem_ctx, struct byte_range_lock);
 
 	if (br_lck == NULL) {
@@ -1450,7 +1454,9 @@
 	key.dptr = (char *)&br_lck->key;
 	key.dsize = sizeof(struct lock_key);
 
-	if (tdb_chainlock(tdb, key) != 0) {
+	br_lck->record = brlock_db->fetch_locked(brlock_db, brlock_db, key);
+
+	if (br_lck->record == NULL) {
 		DEBUG(3, ("Could not lock byte range lock entry\n"));
 		TALLOC_FREE(br_lck);
 		return NULL;
@@ -1458,10 +1464,11 @@
 
 	talloc_set_destructor(br_lck, byte_range_lock_destructor);
 
-	data = tdb_fetch(tdb, key);
-	br_lck->lock_data = (void *)data.dptr;
-	br_lck->num_locks = data.dsize / sizeof(struct lock_struct);
-
+	br_lck->num_locks = br_lck->record->value.dsize / sizeof(struct lock_struct);
+	br_lck->lock_data = SMB_MALLOC_ARRAY(struct lock_struct, br_lck->num_locks);
+	memcpy(br_lck->lock_data, br_lck->record->value.dptr,
+		   br_lck->record->value.dsize);
+	
 	if (!fsp->lockdb_clean) {
 
 		/* This is the first time we've accessed this. */
@@ -1469,7 +1476,6 @@
 		/* Makes the lockdb self cleaning at low cost. */
 
 		if (!validate_lock_entries(&br_lck->num_locks, (struct lock_struct **)&br_lck->lock_data)) {
-			tdb_chainunlock(tdb, key);
 			SAFE_FREE(br_lck->lock_data);
 			TALLOC_FREE(br_lck);
 			return NULL;

Modified: branches/tmp/vl-messaging/source/locking/locking.c
===================================================================
--- branches/tmp/vl-messaging/source/locking/locking.c	2006-06-27 11:07:55 UTC (rev 16561)
+++ branches/tmp/vl-messaging/source/locking/locking.c	2006-06-27 14:24:25 UTC (rev 16562)
@@ -43,7 +43,7 @@
 #define DBGC_CLASS DBGC_LOCKING
 
 /* the locking database handle */
-static TDB_CONTEXT *tdb;
+static struct db_context *lock_db;
 
 /****************************************************************************
  Debugging aids :-).
@@ -366,16 +366,16 @@
 {
 	brl_init(read_only);
 
-	if (tdb)
+	if (lock_db)
 		return True;
 
-	tdb = tdb_open_log(lock_path("locking.tdb"), 
-			lp_open_files_db_hash_size(),
-			TDB_DEFAULT|(read_only?0x0:TDB_CLEAR_IF_FIRST), 
-			read_only?O_RDONLY:O_RDWR|O_CREAT,
-			0644);
+	lock_db = db_open(NULL, lock_path("locking.tdb"),
+					  lp_open_files_db_hash_size(),
+					  TDB_DEFAULT|(read_only?0x0:TDB_CLEAR_IF_FIRST),
+					  read_only?O_RDONLY:O_RDWR|O_CREAT,
+					  0644);
 
-	if (!tdb) {
+	if (!lock_db) {
 		DEBUG(0,("ERROR: Failed to initialise locking database\n"));
 		return False;
 	}
@@ -394,15 +394,11 @@
 
 BOOL locking_end(void)
 {
-	BOOL ret = True;
-
 	brl_shutdown(open_read_only);
-	if (tdb) {
-		if (tdb_close(tdb) != 0)
-			ret = False;
+	if (lock_db) {
+		TALLOC_FREE(lock_db);
 	}
-
-	return ret;
+	return True;
 }
 
 /*******************************************************************
@@ -691,7 +687,6 @@
 {
 	struct share_mode_lock *lck =
 		talloc_get_type_abort(p, struct share_mode_lock);
-	TDB_DATA key = locking_key(lck->dev, lck->ino);
 	TDB_DATA data;
 
 	if (!lck->modified) {
@@ -703,20 +698,19 @@
 	if (data.dptr == NULL) {
 		if (!lck->fresh) {
 			/* There has been an entry before, delete it */
-			if (tdb_delete(tdb, key) == -1) {
+			if (lck->record->delete_rec(lck->record) == -1) {
 				smb_panic("Could not delete share entry\n");
 			}
 		}
 		goto done;
 	}
 
-	if (tdb_store(tdb, key, data, TDB_REPLACE) == -1) {
+	if (lck->record->store(lck->record, data, TDB_REPLACE) == -1) {
 		smb_panic("Could not store share mode entry\n");
 	}
 
  done:
-	tdb_chainunlock(tdb, key);
-
+	TALLOC_FREE(lck->record);
 	return 0;
 }
 
@@ -727,7 +721,6 @@
 {
 	struct share_mode_lock *lck;
 	TDB_DATA key = locking_key(dev, ino);
-	TDB_DATA data;
 
 	lck = TALLOC_P(mem_ctx, struct share_mode_lock);
 	if (lck == NULL) {
@@ -750,7 +743,8 @@
 	lck->fresh = False;
 	lck->modified = False;
 
-	if (tdb_chainlock(tdb, key) != 0) {
+	lck->record = lock_db->fetch_locked(lock_db, lock_db, key);
+	if (lck->record == NULL) {
 		DEBUG(3, ("Could not lock share entry\n"));
 		TALLOC_FREE(lck);
 		return NULL;
@@ -762,8 +756,7 @@
 
 	talloc_set_destructor(lck, share_mode_lock_destructor);
 
-	data = tdb_fetch(tdb, key);
-	lck->fresh = (data.dptr == NULL);
+	lck->fresh = (lck->record->value.dptr == NULL);
 
 	if (lck->fresh) {
 
@@ -779,16 +772,13 @@
 			return NULL;
 		}
 	} else {
-		if (!parse_share_modes(data, lck)) {
+		if (!parse_share_modes(lck->record->value, lck)) {
 			DEBUG(0, ("Could not parse share modes\n"));
 			TALLOC_FREE(lck);
-			SAFE_FREE(data.dptr);
 			return NULL;
 		}
 	}
 
-	SAFE_FREE(data.dptr);
-
 	return lck;
 }
 
@@ -1266,8 +1256,7 @@
 	return True;
 }
 
-static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, 
-                       void *state)
+static int traverse_fn(TDB_DATA kbuf, TDB_DATA dbuf, void *state)
 {
 	struct locking_data *data;
 	struct share_mode_entry *shares;
@@ -1303,7 +1292,7 @@
 
 int share_mode_forall(void (*fn)(const struct share_mode_entry *, const char *, const char *))
 {
-	if (tdb == NULL)
+	if (lock_db == NULL)
 		return 0;
-	return tdb_traverse(tdb, traverse_fn, fn);
+	return lock_db->traverse(lock_db, traverse_fn, fn);
 }

Modified: branches/tmp/vl-messaging/source/param/loadparm.c
===================================================================
--- branches/tmp/vl-messaging/source/param/loadparm.c	2006-06-27 11:07:55 UTC (rev 16561)
+++ branches/tmp/vl-messaging/source/param/loadparm.c	2006-06-27 14:24:25 UTC (rev 16562)
@@ -240,6 +240,8 @@
 	char *szMsgAddress;
 	char *szMsgNetwork;
 	int iMsgPort;
+	int iLockType;
+	char *szLockAddress;
 	char *szCupsServer;
 	char *szIPrintServer;
 	int ldap_passwd_sync; 
@@ -791,6 +793,14 @@
     { -1, NULL}
 };
 
+/* locking type options. */
+static const struct enum_list enum_locking_type_vals[] = {
+    { LOCKING_TYPE_TDB, "tdb" },
+    { LOCKING_TYPE_FILES, "files" },
+    { LOCKING_TYPE_MESSAGES, "messages" },
+    { -1, NULL}
+};
+
 /* 
    Do you want session setups at user level security with a invalid
    password to be rejected or allowed in as guest? WinNT rejects them
@@ -986,6 +996,8 @@
 	{"messaging address", P_STRING, P_GLOBAL, &Globals.szMsgAddress, NULL, NULL, FLAG_ADVANCED}, 
 	{"messaging network", P_STRING, P_GLOBAL, &Globals.szMsgNetwork, NULL, NULL, FLAG_ADVANCED}, 
 	{"messaging port", P_INTEGER, P_GLOBAL, &Globals.iMsgPort, NULL, NULL, FLAG_ADVANCED}, 
+	{"locking type", P_ENUM, P_GLOBAL, &Globals.iLockType, NULL,  enum_locking_type_vals, FLAG_ADVANCED | FLAG_GLOBAL}, 
+	{"locking address", P_STRING, P_GLOBAL, &Globals.szLockAddress, NULL, NULL, FLAG_ADVANCED}, 
 	{"defer sharing violations", P_BOOL, P_GLOBAL, &Globals.bDeferSharingViolations, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
 	{"ea support", P_BOOL, P_LOCAL, &sDefault.bEASupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
 	{"nt acl support", P_BOOL, P_LOCAL, &sDefault.bNTAclSupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
@@ -1633,6 +1645,8 @@
 	string_set(&Globals.szMsgAddress, "127.0.0.1");
 	string_set(&Globals.szMsgNetwork, "127.0.0.0/8");
 	Globals.iMsgPort = DEFAULT_MESSAGING_PORT;
+	Globals.iLockType = LOCKING_TYPE_TDB;
+	string_set(&Globals.szLockAddress, "127.0.0.1");
 	string_set(&Globals.szCupsServer, "");
 	string_set(&Globals.szIPrintServer, "");
 
@@ -1850,6 +1864,8 @@
 FN_GLOBAL_STRING(lp_messaging_address, &Globals.szMsgAddress)
 FN_GLOBAL_STRING(lp_messaging_network, &Globals.szMsgNetwork)
 FN_GLOBAL_INTEGER(lp_messaging_port, &Globals.iMsgPort)
+FN_GLOBAL_INTEGER(lp_locking_type, &Globals.iLockType)
+FN_GLOBAL_STRING(lp_locking_address, &Globals.szLockAddress)
 FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
 FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
 FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)



More information about the samba-cvs mailing list