Deal with removing a share mode on last close.
****************************************************************************/
-static int close_remove_share_mode(files_struct *fsp, enum file_close_type close_type)
+static NTSTATUS close_remove_share_mode(files_struct *fsp,
+ enum file_close_type close_type)
{
connection_struct *conn = fsp->conn;
BOOL delete_file = False;
struct share_mode_lock *lck;
SMB_STRUCT_STAT sbuf;
+ NTSTATUS status = NT_STATUS_OK;
/*
* Lock the share entries, and determine if we should delete
if (lck == NULL) {
DEBUG(0, ("close_remove_share_mode: Could not get share mode "
"lock for file %s\n", fsp->fsp_name));
- return EINVAL;
+ return NT_STATUS_INVALID_PARAMETER;
}
if (!del_share_mode(lck, fsp)) {
|| !delete_file
|| (lck->delete_token == NULL)) {
TALLOC_FREE(lck);
- return 0;
+ return NT_STATUS_OK;
}
/*
DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
"was set and stat failed with error %s\n",
fsp->fsp_name, strerror(errno) ));
+ /*
+ * Don't save the errno here, we ignore this error
+ */
goto done;
}
fsp->fsp_name,
(unsigned int)fsp->dev, (double)fsp->inode,
(unsigned int)sbuf.st_dev, (double)sbuf.st_ino ));
+ /*
+ * Don't save the errno here, we ignore this error
+ */
goto done;
}
DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
"was set and unlink failed with error %s\n",
fsp->fsp_name, strerror(errno) ));
+
+ status = map_nt_error_from_unix(errno);
goto done;
}
+ status = NT_STATUS_FILE_DELETED;
+
done:
/* unbecome user. */
pop_sec_ctx();
process_pending_change_notify_queue((time_t)0);
TALLOC_FREE(lck);
- return 0;
+ return status;
}
/****************************************************************************