/**************************************************************************** Open a file using TRANSACT2_OPEN - async recv ****************************************************************************/ static NTSTATUS smb_raw_t2open_recv(struct smbcli_request *req, TALLOC_CTX *mem_ctx, union smb_open *parms) { struct smbcli_transport *transport = req->transport; struct smb_trans2 t2; NTSTATUS status; status = smb_raw_trans2_recv(req, mem_ctx, &t2); if (!NT_STATUS_IS_OK(status)) return status; if (t2.out.params.length < 30) { return NT_STATUS_INFO_LENGTH_MISMATCH; } parms->t2open.out.file.fnum = SVAL(t2.out.params.data, VWV(0)); parms->t2open.out.attrib = SVAL(t2.out.params.data, VWV(1)); parms->t2open.out.write_time = raw_pull_dos_date3(transport, t2.out.params.data + VWV(2)); parms->t2open.out.size = IVAL(t2.out.params.data, VWV(4)); parms->t2open.out.access = SVAL(t2.out.params.data, VWV(6)); parms->t2open.out.ftype = SVAL(t2.out.params.data, VWV(7)); parms->t2open.out.devstate = SVAL(t2.out.params.data, VWV(8)); parms->t2open.out.action = SVAL(t2.out.params.data, VWV(9)); parms->t2open.out.file_id = SVAL(t2.out.params.data, VWV(10)); return NT_STATUS_OK; }
/* a handler for async trans2 replies */ static void async_trans2(struct smbcli_request *c_req) { struct async_info *async = c_req->async.private_data; struct ntvfs_request *req = async->req; req->async_states->status = smb_raw_trans2_recv(c_req, req, async->parms); talloc_free(async); req->async_states->send_fn(req); }
/**************************************************************************** RAW_QFS_ trans2 interface via blobs (async recv) ****************************************************************************/ static NTSTATUS smb_raw_qfsinfo_blob_recv(struct smbcli_request *req, TALLOC_CTX *mem_ctx, DATA_BLOB *blob) { struct smb_trans2 tp; NTSTATUS status; status = smb_raw_trans2_recv(req, mem_ctx, &tp); if (NT_STATUS_IS_OK(status)) { (*blob) = tp.out.data; } return status; }