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)