/* trans2 open implementation send */ static NTSTATUS trans2_open_send(struct trans_op *op) { struct smbsrv_request *req = op->req; struct smb_trans2 *trans = op->trans; union smb_open *io; TRANS2_CHECK_ASYNC_STATUS(io, union smb_open); TRANS2_CHECK(trans2_setup_reply(trans, 30, 0, 0)); smbsrv_push_fnum(trans->out.params.data, VWV(0), io->t2open.out.file.ntvfs); SSVAL(trans->out.params.data, VWV(1), io->t2open.out.attrib); srv_push_dos_date3(req->smb_conn, trans->out.params.data, VWV(2), io->t2open.out.write_time); SIVAL(trans->out.params.data, VWV(4), io->t2open.out.size); SSVAL(trans->out.params.data, VWV(6), io->t2open.out.access); SSVAL(trans->out.params.data, VWV(7), io->t2open.out.ftype); SSVAL(trans->out.params.data, VWV(8), io->t2open.out.devstate); SSVAL(trans->out.params.data, VWV(9), io->t2open.out.action); SIVAL(trans->out.params.data, VWV(10), 0); /* reserved */ SSVAL(trans->out.params.data, VWV(12), 0); /* EaErrorOffset */ SIVAL(trans->out.params.data, VWV(13), 0); /* EaLength */ return NT_STATUS_OK; }
/* send an oplock break request to a client */ NTSTATUS smbsrv_send_oplock_break(void *p, struct ntvfs_handle *ntvfs, uint8_t level) { struct smbsrv_tcon *tcon = talloc_get_type(p, struct smbsrv_tcon); struct smbsrv_request *req; req = smbsrv_init_request(tcon->smb_conn); NT_STATUS_HAVE_NO_MEMORY(req); smbsrv_setup_reply(req, 8, 0); SCVAL(req->out.hdr,HDR_COM,SMBlockingX); SSVAL(req->out.hdr,HDR_TID,tcon->tid); SSVAL(req->out.hdr,HDR_PID,0xFFFF); SSVAL(req->out.hdr,HDR_UID,0); SSVAL(req->out.hdr,HDR_MID,0xFFFF); SCVAL(req->out.hdr,HDR_FLG,0); SSVAL(req->out.hdr,HDR_FLG2,0); SSVAL(req->out.vwv, VWV(0), SMB_CHAIN_NONE); SSVAL(req->out.vwv, VWV(1), 0); smbsrv_push_fnum(req->out.vwv, VWV(2), ntvfs); SCVAL(req->out.vwv, VWV(3), LOCKING_ANDX_OPLOCK_RELEASE); SCVAL(req->out.vwv, VWV(3)+1, level); SIVAL(req->out.vwv, VWV(4), 0); SSVAL(req->out.vwv, VWV(6), 0); SSVAL(req->out.vwv, VWV(7), 0); smbsrv_send_reply(req); return NT_STATUS_OK; }
/* send a nttrans create reply */ static NTSTATUS nttrans_create_send(struct nttrans_op *op) { union smb_open *io = talloc_get_type(op->op_info, union smb_open); uint8_t *params; NTSTATUS status; status = nttrans_setup_reply(op, op->trans, 69, 0, 0); NT_STATUS_NOT_OK_RETURN(status); params = op->trans->out.params.data; SSVAL(params, 0, io->ntcreatex.out.oplock_level); smbsrv_push_fnum(params, 2, io->ntcreatex.out.file.ntvfs); SIVAL(params, 4, io->ntcreatex.out.create_action); SIVAL(params, 8, 0); /* ea error offset */ push_nttime(params, 12, io->ntcreatex.out.create_time); push_nttime(params, 20, io->ntcreatex.out.access_time); push_nttime(params, 28, io->ntcreatex.out.write_time); push_nttime(params, 36, io->ntcreatex.out.change_time); SIVAL(params, 44, io->ntcreatex.out.attrib); SBVAL(params, 48, io->ntcreatex.out.alloc_size); SBVAL(params, 56, io->ntcreatex.out.size); SSVAL(params, 64, io->ntcreatex.out.file_type); SSVAL(params, 66, io->ntcreatex.out.ipc_state); SCVAL(params, 68, io->ntcreatex.out.is_directory); return NT_STATUS_OK; }
DATA_BLOB smbsrv_handle_get_wire_key(void *private_data, struct ntvfs_handle *handle, TALLOC_CTX *mem_ctx) { uint8_t key[2]; smbsrv_push_fnum(key, 0, handle); return data_blob_talloc(mem_ctx, key, sizeof(key)); }