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)

Reply via email to