}
}
+/*
+ * TODO: needs to be moved - copied from source3/smbd/files.c
+ */
+static unsigned long get_gen_count(struct smbd_server_connection *sconn)
+{
+ sconn->file_gen_counter += 1;
+ if (sconn->file_gen_counter == 0) {
+ sconn->file_gen_counter += 1;
+ }
+
+ return sconn->file_gen_counter;
+}
+
static NTSTATUS new_durable_reconnect_fsp(struct smbXsrv_open *op,
+ struct connection_struct *conn,
+ struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx,
- files_sruct **_fsp)
+ files_struct **_fsp)
{
NTSTATUS status = NT_STATUS_NO_MEMORY;
files_struct *fsp = NULL;
goto fail;
}
- status = fsp_set_smb_fname(fsp, /*TODO*/ smb_fname);
+ status = fsp_set_smb_fname(fsp, smb_fname);
if (!NT_STATUS_IS_OK(status)) {
goto fail;
}
}
static NTSTATUS smb2_create_durable_reconnect(struct smbXsrv_open *op,
- struct smb_request *smb1req,
-
+ /* struct smb_request *smb1req, */
+ struct connection_struct *conn,
+ struct smb_filename *smb_fname,
TALLOC_CTX *mem_ctx,
- files_struct **fsp)
+ files_struct **_fsp)
{
struct share_mode_lock *sharemode_lock;
files_struct *fsp = NULL;
+ NTSTATUS status;
/* 1. check entry in locking.tdb */
/*
* Q: fetch with lock right away?
*/
+/*
sharemode_lock = fetch_share_mode_unlocked(mem_ctx,
op->global->backend_file_id);
+*/
+ sharemode_lock = get_share_mode_lock(mem_ctx,
+ op->global->backend_file_id);
if (sharemode_lock == NULL) {
/* TODO: use/create other fetch func with better error code */
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
/* 2. proceed with opening file */
/*
- * refetch with lock and update the pid
+ * refetch with lock and update the pid // fetch with lock right away above
*/
+/*
talloc_free(sharemode_lock);
sharemode_lock = get_share_mode_lock(mem_ctx,
op->global->backend_file_id);
if (sharemode_lock == NULL) {
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}
+*/
sharemode_lock->data->share_modes[0].pid =
messaging_server_id(op->connection->sconn->msg_ctx);
/*
* circumstances seems ok, do the open
*/
- status = new_durable_reconnect_fsp( &fsp);
+ status = new_durable_reconnect_fsp(op, conn, smb_fname, mem_ctx, &fsp);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
- /* TODO */
- fsp->fh->fd = SMB_VFS_OPEN(smb1req->conn,
+ fsp->fh->fd = SMB_VFS_OPEN(conn,
smb_fname,
fsp,
sharemode_lock->data->share_modes[0].flags,
- mode);
+ 0 /* mode */);
if (fsp->fh->fd == -1) {
/* ... */
- return ...;
+ return NT_STATUS_UNSUCCESSFUL; // TODO ERROR CODE?
}
/* - release the sharemode lock: this writes the changes */
talloc_free(sharemode_lock);
- /* - update fsp pointer in smbXsrv_open */
- op->;
+ /* Q: do this in fsp creation? */
+ op->fsp = fsp;
+ *_fsp = fsp;
/*
* - return
*
* ... think about seek()
*/
- return NT_STATUS_NOT_IMPLEMENTED;
+ return NT_STATUS_OK;
}
struct smbd_smb2_create_state {
struct smb2_create_blobs out_context_blobs;
int requested_oplock_level;
bool do_durable_reconnect = false;
+ struct smbXsrv_open *op = NULL;
ZERO_STRUCT(out_context_blobs);
if (dhnc) {
uint64_t persistent_id;
- struct smbXsrv_open *op = NULL;
if (dhnc->data.length != 16) {
tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
*/
if (do_durable_reconnect) {
status = smb2_create_durable_reconnect(op,
- smb1req,
+ smb1req->conn,
smb_fname,
mem_ctx,
&result);