Author: metze Date: 2005-12-06 13:26:24 +0000 (Tue, 06 Dec 2005) New Revision: 12092
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12092 Log: - add dummy functions for the missing SMB2 opcodes - implement keepalive and logoff metze Modified: branches/SAMBA_4_0/source/smb_server/smb2/config.mk branches/SAMBA_4_0/source/smb_server/smb2/fileio.c branches/SAMBA_4_0/source/smb_server/smb2/negprot.c branches/SAMBA_4_0/source/smb_server/smb2/receive.c branches/SAMBA_4_0/source/smb_server/smb2/sesssetup.c Changeset: Modified: branches/SAMBA_4_0/source/smb_server/smb2/config.mk =================================================================== --- branches/SAMBA_4_0/source/smb_server/smb2/config.mk 2005-12-06 12:33:32 UTC (rev 12091) +++ branches/SAMBA_4_0/source/smb_server/smb2/config.mk 2005-12-06 13:26:24 UTC (rev 12092) @@ -7,7 +7,8 @@ negprot.o \ sesssetup.o \ tcon.o \ - fileio.o + fileio.o \ + keepalive.o REQUIRED_SUBSYSTEMS = \ NTVFS LIBPACKET LIBCLI_SMB2 # End SUBSYSTEM SMB2_PROTOCOL Modified: branches/SAMBA_4_0/source/smb_server/smb2/fileio.c =================================================================== --- branches/SAMBA_4_0/source/smb_server/smb2/fileio.c 2005-12-06 12:33:32 UTC (rev 12091) +++ branches/SAMBA_4_0/source/smb_server/smb2/fileio.c 2005-12-06 13:26:24 UTC (rev 12092) @@ -33,6 +33,11 @@ smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED); } +void smb2srv_flush_recv(struct smb2srv_request *req) +{ + smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED); +} + void smb2srv_read_recv(struct smb2srv_request *req) { smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED); @@ -43,6 +48,16 @@ smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED); } +void smb2srv_lock_recv(struct smb2srv_request *req) +{ + smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED); +} + +void smb2srv_ioctl_recv(struct smb2srv_request *req) +{ + smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED); +} + void smb2srv_cancel_recv(struct smb2srv_request *req) { smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED); Modified: branches/SAMBA_4_0/source/smb_server/smb2/negprot.c =================================================================== --- branches/SAMBA_4_0/source/smb_server/smb2/negprot.c 2005-12-06 12:33:32 UTC (rev 12091) +++ branches/SAMBA_4_0/source/smb_server/smb2/negprot.c 2005-12-06 13:26:24 UTC (rev 12092) @@ -123,8 +123,6 @@ return; } - SIVAL(req->out.hdr, SMB2_HDR_STATUS, NT_STATUS_V(req->status)); - SSVAL(req->out.body, 0x02, io->out._pad); SIVAL(req->out.body, 0x04, io->out.unknown2); memcpy(req->out.body+0x08, io->out.sessid, 16); Modified: branches/SAMBA_4_0/source/smb_server/smb2/receive.c =================================================================== --- branches/SAMBA_4_0/source/smb_server/smb2/receive.c 2005-12-06 12:33:32 UTC (rev 12091) +++ branches/SAMBA_4_0/source/smb_server/smb2/receive.c 2005-12-06 13:26:24 UTC (rev 12092) @@ -56,7 +56,7 @@ SIVAL(req->out.hdr, 0, SMB2_MAGIC); SSVAL(req->out.hdr, SMB2_HDR_LENGTH, SMB2_HDR_BODY); SSVAL(req->out.hdr, SMB2_HDR_PAD1, 0); - SIVAL(req->out.hdr, SMB2_HDR_STATUS, 0); + SIVAL(req->out.hdr, SMB2_HDR_STATUS, NT_STATUS_V(req->status)); SSVAL(req->out.hdr, SMB2_HDR_OPCODE, SVAL(req->in.hdr, SMB2_HDR_OPCODE)); SSVAL(req->out.hdr, SMB2_HDR_PAD2, 0); SIVAL(req->out.hdr, SMB2_HDR_FLAGS, 0x00000001); @@ -133,6 +133,9 @@ case SMB2_OP_SESSSETUP: smb2srv_sesssetup_recv(req); return NT_STATUS_OK; + case SMB2_OP_LOGOFF: + smb2srv_logoff_recv(req); + return NT_STATUS_OK; case SMB2_OP_TCON: smb2srv_tcon_recv(req); return NT_STATUS_OK; @@ -145,15 +148,27 @@ case SMB2_OP_CLOSE: smb2srv_close_recv(req); return NT_STATUS_OK; + case SMB2_OP_FLUSH: + smb2srv_flush_recv(req); + return NT_STATUS_OK; case SMB2_OP_READ: smb2srv_read_recv(req); return NT_STATUS_OK; case SMB2_OP_WRITE: smb2srv_write_recv(req); return NT_STATUS_OK; + case SMB2_OP_LOCK: + smb2srv_lock_recv(req); + return NT_STATUS_OK; + case SMB2_OP_IOCTL: + smb2srv_ioctl_recv(req); + return NT_STATUS_OK; case SMB2_OP_CANCEL: smb2srv_cancel_recv(req); return NT_STATUS_OK; + case SMB2_OP_KEEPALIVE: + smb2srv_keepalive_recv(req); + return NT_STATUS_OK; case SMB2_OP_FIND: smb2srv_find_recv(req); return NT_STATUS_OK; Modified: branches/SAMBA_4_0/source/smb_server/smb2/sesssetup.c =================================================================== --- branches/SAMBA_4_0/source/smb_server/smb2/sesssetup.c 2005-12-06 12:33:32 UTC (rev 12091) +++ branches/SAMBA_4_0/source/smb_server/smb2/sesssetup.c 2005-12-06 13:26:24 UTC (rev 12092) @@ -27,13 +27,6 @@ #include "smb_server/smb2/smb2_server.h" #include "smbd/service_stream.h" -struct smb2srv_session { - struct smb2srv_session *prev,*next; - uint64_t uid; - struct gensec_security *gensec_ctx; - struct auth_session_info *session_info; -}; - static NTSTATUS smb2srv_sesssetup_backend(struct smb2srv_request *req, struct smb2_session_setup *io) { NTSTATUS status = NT_STATUS_ACCESS_DENIED; @@ -134,7 +127,6 @@ return; } - SIVAL(req->out.hdr, SMB2_HDR_STATUS, NT_STATUS_V(req->status)); SBVAL(req->out.hdr, SMB2_HDR_UID, io->out.uid); SSVAL(req->out.body, 0x02, io->out._pad); @@ -183,3 +175,52 @@ } smb2srv_sesssetup_send(req, io); } + +static NTSTATUS smb2srv_logoff_backend(struct smb2srv_request *req) +{ + /* TODO: call ntvfs backends to close file of this session */ + talloc_free(req->session); + req->session = NULL; + return NT_STATUS_OK; +} + +static void smb2srv_logoff_send(struct smb2srv_request *req) +{ + NTSTATUS status; + + if (NT_STATUS_IS_ERR(req->status)) { + smb2srv_send_error(req, req->status); + return; + } + + status = smb2srv_setup_reply(req, 0x04, 0); + if (!NT_STATUS_IS_OK(status)) { + smbsrv_terminate_connection(req->smb_conn, nt_errstr(status)); + talloc_free(req); + return; + } + + SSVAL(req->out.body, 0x02, 0); + + smb2srv_send_reply(req); +} + +void smb2srv_logoff_recv(struct smb2srv_request *req) +{ + uint16_t _pad; + + if (req->in.body_size < 0x04) { + smb2srv_send_error(req, NT_STATUS_FOOBAR); + return; + } + + _pad = SVAL(req->in.body, 0x02); + + req->status = smb2srv_logoff_backend(req); + + if (req->control_flags & SMB2SRV_REQ_CTRL_FLAG_NOT_REPLY) { + talloc_free(req); + return; + } + smb2srv_logoff_send(req); +}
