/**************************************************************************** RAW_QFS_ trans2 interface via blobs (async send) ****************************************************************************/ static struct smbcli_request *smb_raw_qfsinfo_send(struct smbcli_tree *tree, TALLOC_CTX *mem_ctx, uint16_t info_level) { struct smb_trans2 tp; uint16_t setup = TRANSACT2_QFSINFO; tp.in.max_setup = 0; tp.in.flags = 0; tp.in.timeout = 0; tp.in.setup_count = 1; tp.in.max_param = 0; tp.in.max_data = 0xFFFF; tp.in.setup = &setup; tp.in.data = data_blob(NULL, 0); tp.in.timeout = 0; tp.in.params = data_blob_talloc(mem_ctx, NULL, 2); if (!tp.in.params.data) { return NULL; } SSVAL(tp.in.params.data, 0, info_level); return smb_raw_trans2_send(tree, &tp); }
/**************************************************************************** Open a file using TRANSACT2_OPEN - async send ****************************************************************************/ static struct smbcli_request *smb_raw_t2open_send(struct smbcli_tree *tree, union smb_open *parms) { struct smb_trans2 t2; uint16_t setup = TRANSACT2_OPEN; TALLOC_CTX *mem_ctx = talloc_init("smb_raw_t2open"); struct smbcli_request *req; uint16_t list_size; list_size = ea_list_size(parms->t2open.in.num_eas, parms->t2open.in.eas); t2.in.max_param = 30; t2.in.max_data = 0; t2.in.max_setup = 0; t2.in.flags = 0; t2.in.timeout = 0; t2.in.setup_count = 1; t2.in.setup = &setup; t2.in.params = data_blob_talloc(mem_ctx, NULL, 28); t2.in.data = data_blob_talloc(mem_ctx, NULL, list_size); SSVAL(t2.in.params.data, VWV(0), parms->t2open.in.flags); SSVAL(t2.in.params.data, VWV(1), parms->t2open.in.open_mode); SSVAL(t2.in.params.data, VWV(2), parms->t2open.in.search_attrs); SSVAL(t2.in.params.data, VWV(3), parms->t2open.in.file_attrs); raw_push_dos_date(tree->session->transport, t2.in.params.data, VWV(4), parms->t2open.in.write_time); SSVAL(t2.in.params.data, VWV(6), parms->t2open.in.open_func); SIVAL(t2.in.params.data, VWV(7), parms->t2open.in.size); SIVAL(t2.in.params.data, VWV(9), parms->t2open.in.timeout); SIVAL(t2.in.params.data, VWV(11), 0); SSVAL(t2.in.params.data, VWV(13), 0); smbcli_blob_append_string(tree->session, mem_ctx, &t2.in.params, parms->t2open.in.fname, STR_TERMINATE); ea_put_list(t2.in.data.data, parms->t2open.in.num_eas, parms->t2open.in.eas); req = smb_raw_trans2_send(tree, &t2); talloc_free(mem_ctx); return req; }
/* raw trans2 */ static NTSTATUS cvfs_trans2(struct ntvfs_module_context *ntvfs, struct ntvfs_request *req, struct smb_trans2 *trans2) { struct cvfs_private *p = ntvfs->private_data; struct smbcli_request *c_req; if (p->map_trans2) { return NT_STATUS_NOT_IMPLEMENTED; } SETUP_PID; if (!(req->async_states->state & NTVFS_ASYNC_STATE_MAY_ASYNC)) { return smb_raw_trans2(p->tree, req, trans2); } c_req = smb_raw_trans2_send(p->tree, trans2); ASYNC_RECV_TAIL(trans2, async_trans2); }
/**************************************************************************** create a directory using TRANSACT2_MKDIR - async interface ****************************************************************************/ static struct smbcli_request *smb_raw_t2mkdir_send(struct smbcli_tree *tree, union smb_mkdir *parms) { struct smb_trans2 t2; uint16_t setup = TRANSACT2_MKDIR; TALLOC_CTX *mem_ctx; struct smbcli_request *req; uint16_t data_total; mem_ctx = talloc_init("t2mkdir"); data_total = ea_list_size(parms->t2mkdir.in.num_eas, parms->t2mkdir.in.eas); t2.in.max_param = 2; t2.in.max_data = 0; t2.in.max_setup = 0; t2.in.flags = 0; t2.in.timeout = 0; t2.in.setup_count = 1; t2.in.setup = &setup; t2.in.params = data_blob_talloc(mem_ctx, NULL, 4); t2.in.data = data_blob_talloc(mem_ctx, NULL, data_total); SIVAL(t2.in.params.data, VWV(0), 0); /* reserved */ smbcli_blob_append_string(tree->session, mem_ctx, &t2.in.params, parms->t2mkdir.in.path, STR_TERMINATE); ea_put_list(t2.in.data.data, parms->t2mkdir.in.num_eas, parms->t2mkdir.in.eas); req = smb_raw_trans2_send(tree, &t2); talloc_free(mem_ctx); return req; }