Add chainlock_read functions to get a read lock. Used in *massively*
[kai/samba.git] / source3 / tdb / tdb.c
index 2a6dca16a8e0ff1a5c5ebfed7cc0623116a1a460..e539376ac7947b6cbbcf191aab811d6ebbef40ef 100644 (file)
@@ -186,7 +186,7 @@ static int tdb_brlock(TDB_CONTEXT *tdb, tdb_off offset,
 
        if (tdb->flags & TDB_NOLOCK)
                return 0;
-       if (tdb->read_only) {
+       if ((rw_type == F_WRLCK) && (tdb->read_only)) {
                errno = EACCES;
                return -1;
        }
@@ -1802,6 +1802,16 @@ int tdb_chainunlock(TDB_CONTEXT *tdb, TDB_DATA key)
        return tdb_unlock(tdb, BUCKET(tdb_hash(&key)), F_WRLCK);
 }
 
+int tdb_chainlock_read(TDB_CONTEXT *tdb, TDB_DATA key)
+{
+       return tdb_lock(tdb, BUCKET(tdb_hash(&key)), F_RDLCK);
+}
+
+int tdb_chainunlock_read(TDB_CONTEXT *tdb, TDB_DATA key)
+{
+       return tdb_unlock(tdb, BUCKET(tdb_hash(&key)), F_RDLCK);
+}
+
 
 /* register a loging function */
 void tdb_logging_function(TDB_CONTEXT *tdb, void (*fn)(TDB_CONTEXT *, int , const char *, ...))