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);
+}

Reply via email to