summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
Diffstat (limited to 'source4')
-rw-r--r--source4/ntvfs/posix/pvfs_open.c349
1 files changed, 0 insertions, 349 deletions
diff --git a/source4/ntvfs/posix/pvfs_open.c b/source4/ntvfs/posix/pvfs_open.c
index a8c0bba97f..e24887ca96 100644
--- a/source4/ntvfs/posix/pvfs_open.c
+++ b/source4/ntvfs/posix/pvfs_open.c
@@ -183,354 +183,6 @@ static NTSTATUS pvfs_locking_key(struct pvfs_filename *name,
/*
- create a new directory
-*/
-static NTSTATUS pvfs_create_directory(struct pvfs_state *pvfs,
- struct smbsrv_request *req,
- struct pvfs_filename *name,
- union smb_open *io)
-{
- struct pvfs_file *f;
- NTSTATUS status;
- int fnum, ret;
- struct odb_lock *lck;
- uint32_t create_options = io->generic.in.create_options;
- uint32_t share_access = io->generic.in.share_access;
- uint32_t access_mask = io->generic.in.access_mask;
- mode_t mode;
- uint32_t attrib;
- BOOL del_on_close;
-
- if ((io->ntcreatex.in.file_attr & FILE_ATTRIBUTE_READONLY) &&
- (create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE)) {
- return NT_STATUS_CANNOT_DELETE;
- }
-
- status = pvfs_access_check_create(pvfs, req, name, &access_mask);
- if (!NT_STATUS_IS_OK(status)) {
- return status;
- }
-
- f = talloc(req, struct pvfs_file);
- if (f == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
-
- f->handle = talloc(f, struct pvfs_file_handle);
- if (f->handle == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
-
- fnum = idr_get_new_above(pvfs->idtree_fnum, f, PVFS_MIN_NEW_FNUM, UINT16_MAX);
- if (fnum == -1) {
- return NT_STATUS_TOO_MANY_OPENED_FILES;
- }
-
- attrib = io->ntcreatex.in.file_attr | FILE_ATTRIBUTE_DIRECTORY;
- mode = pvfs_fileperms(pvfs, attrib);
-
- /* create the directory */
- ret = mkdir(name->full_name, mode);
- if (ret == -1) {
- idr_remove(pvfs->idtree_fnum, fnum);
- return pvfs_map_errno(pvfs, errno);
- }
-
- pvfs_xattr_unlink_hook(pvfs, name->full_name);
-
- /* re-resolve the new directory */
- status = pvfs_resolve_name_fd(pvfs, -1, name);
- if (!NT_STATUS_IS_OK(status)) {
- idr_remove(pvfs->idtree_fnum, fnum);
- rmdir(name->full_name);
- return status;
- }
-
- name->dos.attrib = attrib;
-
- status = pvfs_open_setup_eas_acl(pvfs, req, name, -1, fnum, io);
- if (!NT_STATUS_IS_OK(status)) {
- goto cleanup_delete;
- }
-
- /* form the lock context used for opendb locking */
- status = pvfs_locking_key(name, f->handle, &f->handle->odb_locking_key);
- if (!NT_STATUS_IS_OK(status)) {
- goto cleanup_delete;
- }
-
- /* grab a lock on the open file record */
- lck = odb_lock(req, pvfs->odb_context, &f->handle->odb_locking_key);
- if (lck == NULL) {
- DEBUG(0,("pvfs_open: failed to lock file '%s' in opendb\n",
- name->full_name));
- /* we were supposed to do a blocking lock, so something
- is badly wrong! */
- status = NT_STATUS_INTERNAL_DB_CORRUPTION;
- goto cleanup_delete;
- }
-
- if (create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) {
- del_on_close = True;
- } else {
- del_on_close = False;
- }
-
- status = odb_open_file(lck, f->handle, name->stream_id,
- share_access, access_mask, del_on_close, name->full_name);
- talloc_free(lck);
- if (!NT_STATUS_IS_OK(status)) {
- /* bad news, we must have hit a race */
- idr_remove(pvfs->idtree_fnum, fnum);
- return status;
- }
-
- f->fnum = fnum;
- f->session = req->session;
- f->smbpid = req->smbpid;
- f->pvfs = pvfs;
- f->pending_list = NULL;
- f->lock_count = 0;
- f->share_access = io->generic.in.share_access;
- f->access_mask = access_mask;
- f->impersonation = io->generic.in.impersonation;
-
- f->handle->pvfs = pvfs;
- f->handle->name = talloc_steal(f->handle, name);
- f->handle->fd = -1;
- f->handle->create_options = io->generic.in.create_options;
- f->handle->seek_offset = 0;
- f->handle->position = 0;
- f->handle->mode = 0;
- f->handle->have_opendb_entry = True;
- f->handle->sticky_write_time = False;
-
- DLIST_ADD(pvfs->open_files, f);
-
- /* setup a destructor to avoid file descriptor leaks on
- abnormal termination */
- talloc_set_destructor(f, pvfs_dir_fnum_destructor);
- talloc_set_destructor(f->handle, pvfs_dir_handle_destructor);
-
- io->generic.out.oplock_level = OPLOCK_NONE;
- io->generic.out.fnum = f->fnum;
- io->generic.out.create_action = NTCREATEX_ACTION_CREATED;
- io->generic.out.create_time = name->dos.create_time;
- io->generic.out.access_time = name->dos.access_time;
- io->generic.out.write_time = name->dos.write_time;
- io->generic.out.change_time = name->dos.change_time;
- io->generic.out.attrib = name->dos.attrib;
- io->generic.out.alloc_size = name->dos.alloc_size;
- io->generic.out.size = name->st.st_size;
- io->generic.out.file_type = FILE_TYPE_DISK;
- io->generic.out.ipc_state = 0;
- io->generic.out.is_directory = 0;
-
- /* success - keep the file handle */
- talloc_steal(pvfs, f);
-
- return NT_STATUS_OK;
-
-cleanup_delete:
- idr_remove(pvfs->idtree_fnum, fnum);
- rmdir(name->full_name);
- return status;
-}
-
-#if 0
-/*
- open a directory
-*/
-static NTSTATUS pvfs_open_directory(struct pvfs_state *pvfs,
- struct smbsrv_request *req,
- struct pvfs_filename *name,
- union smb_open *io)
-{
- struct pvfs_file *f;
- NTSTATUS status;
- int fnum;
- struct odb_lock *lck;
- uint32_t create_options;
- uint32_t share_access;
- uint32_t access_mask;
- BOOL del_on_close;
-
- create_options = io->generic.in.create_options;
- share_access = io->generic.in.share_access;
- access_mask = io->generic.in.access_mask;
-
- /* certain create options are not allowed */
- if ((create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) &&
- !(access_mask & SEC_STD_DELETE)) {
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- switch (io->generic.in.open_disposition) {
- case NTCREATEX_DISP_SUPERSEDE:
- case NTCREATEX_DISP_OVERWRITE_IF:
- case NTCREATEX_DISP_OPEN_IF:
- break;
-
- case NTCREATEX_DISP_OPEN:
- case NTCREATEX_DISP_OVERWRITE:
- if (!name->exists) {
- return NT_STATUS_OBJECT_NAME_NOT_FOUND;
- }
- break;
-
- case NTCREATEX_DISP_CREATE:
- if (name->exists) {
- return NT_STATUS_OBJECT_NAME_COLLISION;
- }
- break;
-
- default:
- return NT_STATUS_INVALID_PARAMETER;
- }
-
- /* handle creating a new directory separately */
- if (!name->exists) {
- status = pvfs_create_directory(pvfs, req, name, io);
- if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
- return status;
- }
-
- /* we've hit a race - the directory was created during this call */
- if (io->generic.in.open_disposition == NTCREATEX_DISP_CREATE) {
- return status;
- }
-
- /* try re-resolving the name */
- status = pvfs_resolve_name(pvfs, req, io->ntcreatex.in.fname, 0, &name);
- if (!NT_STATUS_IS_OK(status)) {
- return status;
- }
- /* fall through to a normal open */
- }
-
- if ((name->dos.attrib & FILE_ATTRIBUTE_READONLY) &&
- (create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE)) {
- return NT_STATUS_CANNOT_DELETE;
- }
-
- /* check the security descriptor */
- status = pvfs_access_check(pvfs, req, name, &access_mask);
- if (!NT_STATUS_IS_OK(status)) {
- return status;
- }
-
- f = talloc(req, struct pvfs_file);
- if (f == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
-
- f->handle = talloc(f, struct pvfs_file_handle);
- if (f->handle == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
-
- /* allocate a fnum */
- fnum = idr_get_new_above(pvfs->idtree_fnum, f, PVFS_MIN_DIR_FNUM, UINT16_MAX);
- if (fnum == -1) {
- return NT_STATUS_TOO_MANY_OPENED_FILES;
- }
-
- f->fnum = fnum;
- f->session = req->session;
- f->smbpid = req->smbpid;
- f->pvfs = pvfs;
- f->pending_list = NULL;
- f->lock_count = 0;
- f->share_access = io->generic.in.share_access;
- f->access_mask = access_mask;
- f->impersonation = io->generic.in.impersonation;
-
- f->handle->pvfs = pvfs;
- f->handle->fd = -1;
- f->handle->name = talloc_steal(f->handle, name);
- f->handle->create_options = io->generic.in.create_options;
- f->handle->seek_offset = 0;
- f->handle->position = 0;
- f->handle->mode = 0;
- f->handle->have_opendb_entry = False;
- f->handle->sticky_write_time = False;
-
- /* form the lock context used for opendb locking */
- status = pvfs_locking_key(name, f->handle, &f->handle->odb_locking_key);
- if (!NT_STATUS_IS_OK(status)) {
- idr_remove(pvfs->idtree_fnum, f->fnum);
- return status;
- }
-
- /* get a lock on this file before the actual open */
- lck = odb_lock(req, pvfs->odb_context, &f->handle->odb_locking_key);
- if (lck == NULL) {
- DEBUG(0,("pvfs_open: failed to lock file '%s' in opendb\n",
- name->full_name));
- /* we were supposed to do a blocking lock, so something
- is badly wrong! */
- idr_remove(pvfs->idtree_fnum, fnum);
- return NT_STATUS_INTERNAL_DB_CORRUPTION;
- }
-
- DLIST_ADD(pvfs->open_files, f);
-
- /* setup a destructor to avoid file descriptor leaks on
- abnormal termination */
- talloc_set_destructor(f, pvfs_dir_fnum_destructor);
- talloc_set_destructor(f->handle, pvfs_dir_handle_destructor);
-
- if ((create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) &&
- pvfs_directory_empty(pvfs, f->handle->name)) {
- del_on_close = True;
- } else {
- del_on_close = False;
- }
-
- /* see if we are allowed to open at the same time as existing opens */
- status = odb_open_file(lck, f->handle, f->handle->name->stream_id,
- share_access, access_mask, del_on_close, name->full_name);
-
-#if 0
- /* we don't do async open retries on directories yet */
- if (NT_STATUS_EQUAL(status, NT_STATUS_SHARING_VIOLATION) &&
- (req->async_states->state & NTVFS_ASYNC_STATE_MAY_ASYNC)) {
- return pvfs_open_setup_retry(ntvfs, req, io, f, lck);
- }
-#endif
-
- if (!NT_STATUS_IS_OK(status)) {
- talloc_free(lck);
- return status;
- }
-
- f->handle->have_opendb_entry = True;
-
- talloc_free(lck);
-
- io->generic.out.oplock_level = OPLOCK_NONE;
- io->generic.out.fnum = f->fnum;
- io->generic.out.create_action = NTCREATEX_ACTION_EXISTED;
- io->generic.out.create_time = name->dos.create_time;
- io->generic.out.access_time = name->dos.access_time;
- io->generic.out.write_time = name->dos.write_time;
- io->generic.out.change_time = name->dos.change_time;
- io->generic.out.attrib = name->dos.attrib;
- io->generic.out.alloc_size = name->dos.alloc_size;
- io->generic.out.size = name->st.st_size;
- io->generic.out.file_type = FILE_TYPE_DISK;
- io->generic.out.ipc_state = 0;
- io->generic.out.is_directory = 0;
-
- /* success - keep the file handle */
- talloc_steal(f->pvfs, f);
-
- return NT_STATUS_OK;
-}
-#endif
-
-#if 1
-/*
open a directory
*/
static NTSTATUS pvfs_open_directory(struct pvfs_state *pvfs,
@@ -758,7 +410,6 @@ cleanup_delete:
rmdir(name->full_name);
return status;
}
-#endif
/*
destroy a struct pvfs_file_handle