diff options
author | Andrew Tridgell <tridge@samba.org> | 2004-10-25 01:29:31 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:04:36 -0500 |
commit | c1c696460b74fa3dd381f3903ec0281f6f1865a9 (patch) | |
tree | bdd730f1c2641cdd67376b988e0038569a143442 | |
parent | def9a12bccd7113658220086fb32d388b47faaf7 (diff) | |
download | samba-c1c696460b74fa3dd381f3903ec0281f6f1865a9.tar.gz samba-c1c696460b74fa3dd381f3903ec0281f6f1865a9.tar.bz2 samba-c1c696460b74fa3dd381f3903ec0281f6f1865a9.zip |
r3174: added pvfs_is_open() to allow us to check for open files on unlink. We
now pass BASE-UNLINK.
(This used to be commit f23a2f8538bda8f6790e86c93ee22436388b2975)
-rw-r--r-- | source4/ntvfs/common/opendb.c | 20 | ||||
-rw-r--r-- | source4/ntvfs/posix/pvfs_open.c | 17 | ||||
-rw-r--r-- | source4/ntvfs/posix/pvfs_unlink.c | 4 |
3 files changed, 41 insertions, 0 deletions
diff --git a/source4/ntvfs/common/opendb.c b/source4/ntvfs/common/opendb.c index 3def23f190..5c962fbad0 100644 --- a/source4/ntvfs/common/opendb.c +++ b/source4/ntvfs/common/opendb.c @@ -335,3 +335,23 @@ NTSTATUS odb_set_create_options(struct odb_lock *lck, return status; } + + +/* + determine if a file is open +*/ +BOOL odb_is_open(struct odb_context *odb, DATA_BLOB *key) +{ + TDB_DATA dbuf; + TDB_DATA kbuf; + + kbuf.dptr = key->data; + kbuf.dsize = key->length; + + dbuf = tdb_fetch(odb->w->tdb, kbuf); + if (dbuf.dptr == NULL) { + return False; + } + free(dbuf.dptr); + return True; +} diff --git a/source4/ntvfs/posix/pvfs_open.c b/source4/ntvfs/posix/pvfs_open.c index e587ebbf95..7f06626706 100644 --- a/source4/ntvfs/posix/pvfs_open.c +++ b/source4/ntvfs/posix/pvfs_open.c @@ -703,3 +703,20 @@ NTSTATUS pvfs_change_create_options(struct pvfs_state *pvfs, return status; } + + +/* + determine if a file is open - used to prevent some operations on open files +*/ +BOOL pvfs_is_open(struct pvfs_state *pvfs, struct pvfs_filename *name) +{ + NTSTATUS status; + DATA_BLOB key; + + status = pvfs_locking_key(name, name, &key); + if (!NT_STATUS_IS_OK(status)) { + return False; + } + + return odb_is_open(pvfs->odb_context, &key); +} diff --git a/source4/ntvfs/posix/pvfs_unlink.c b/source4/ntvfs/posix/pvfs_unlink.c index 0f4ff8b148..d5e25b5622 100644 --- a/source4/ntvfs/posix/pvfs_unlink.c +++ b/source4/ntvfs/posix/pvfs_unlink.c @@ -80,6 +80,10 @@ NTSTATUS pvfs_unlink(struct ntvfs_module_context *ntvfs, return NT_STATUS_OBJECT_NAME_NOT_FOUND; } + if (pvfs_is_open(pvfs, name)) { + return NT_STATUS_SHARING_VIOLATION; + } + dir = talloc_p(req, struct pvfs_dir); if (dir == NULL) { return NT_STATUS_NO_MEMORY; |