mirror of
https://github.com/samba-team/samba.git
synced 2025-11-09 20:23:51 +03:00
r13745: remove some code I was experimenting with and forgot was there when I
committed that will teach me to run svn diff before committing ....
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
ec833b409c
commit
ef6e30c72c
@@ -182,354 +182,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
|
||||
*/
|
||||
@@ -758,7 +410,6 @@ cleanup_delete:
|
||||
rmdir(name->full_name);
|
||||
return status;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
destroy a struct pvfs_file_handle
|
||||
|
||||
Reference in New Issue
Block a user