svn commit: samba r12094 - in branches/SAMBA_4_0/source/smb_server/smb2: .

metze at samba.org metze at samba.org
Tue Dec 6 14:14:44 GMT 2005


Author: metze
Date: 2005-12-06 14:14:43 +0000 (Tue, 06 Dec 2005)
New Revision: 12094

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12094

Log:
- implement dummy smb2srv_tcon()
- implement smb2srv_tdis()

metze
Modified:
   branches/SAMBA_4_0/source/smb_server/smb2/tcon.c


Changeset:
Modified: branches/SAMBA_4_0/source/smb_server/smb2/tcon.c
===================================================================
--- branches/SAMBA_4_0/source/smb_server/smb2/tcon.c	2005-12-06 14:11:55 UTC (rev 12093)
+++ branches/SAMBA_4_0/source/smb_server/smb2/tcon.c	2005-12-06 14:14:43 UTC (rev 12094)
@@ -21,14 +21,134 @@
 #include "includes.h"
 #include "libcli/smb2/smb2.h"
 #include "libcli/smb2/smb2_calls.h"
+#include "smb_server/smb_server.h"
 #include "smb_server/smb2/smb2_server.h"
 
+static NTSTATUS smb2srv_tcon_backend(struct smb2srv_request *req, struct smb2_tree_connect *io)
+{
+	struct smbsrv_tcon *tcon;
+
+	tcon = smbsrv_tcon_new(req->smb_conn);
+	NT_STATUS_HAVE_NO_MEMORY(tcon);
+
+	/* TODO: do real tree connect */
+
+	io->out.unknown1	= 0;
+	io->out.unknown2	= 0;
+	io->out.unknown3	= 0;
+	io->out.access_mask	= 0;
+
+	io->out.tid		= tcon->tid;
+
+	req->tcon = tcon;
+	return NT_STATUS_OK;
+}
+
+static void smb2srv_tcon_send(struct smb2srv_request *req, struct smb2_tree_connect *io)
+{
+	NTSTATUS status;
+
+	if (NT_STATUS_IS_ERR(req->status)) {
+		smb2srv_send_error(req, req->status);
+		return;
+	}
+
+	status = smb2srv_setup_reply(req, 0x10, 0);
+	if (!NT_STATUS_IS_OK(status)) {
+		smbsrv_terminate_connection(req->smb_conn, nt_errstr(status));
+		talloc_free(req);
+		return;
+	}
+
+	SBVAL(req->out.hdr, SMB2_HDR_TID,    io->out.tid);
+
+	SSVAL(req->out.body, 0x02, io->out.unknown1);
+	SIVAL(req->out.body, 0x04, io->out.unknown2);
+	SIVAL(req->out.body, 0x08, io->out.unknown3);
+	SIVAL(req->out.body, 0x0C, io->out.access_mask);
+
+	smb2srv_send_reply(req);
+}
+
 void smb2srv_tcon_recv(struct smb2srv_request *req)
 {
-	smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
+	struct smb2_tree_connect *io;
+	NTSTATUS status;
+
+	if (req->in.body_size < 0x08) {
+		smb2srv_send_error(req,  NT_STATUS_FOOBAR);
+		return;
+	}
+
+	io = talloc(req, struct smb2_tree_connect);
+	if (!io) {
+		smbsrv_terminate_connection(req->smb_conn, nt_errstr(NT_STATUS_NO_MEMORY));
+		talloc_free(req);
+		return;
+	}
+
+	io->in.unknown1 = SVAL(req->in.body, 0x02);
+	status = smb2_pull_o16s16_string(&req->in, io, req->in.body+0x04, &io->in.path);
+	if (!NT_STATUS_IS_OK(status)) {
+		smbsrv_terminate_connection(req->smb_conn, nt_errstr(status));
+		talloc_free(req);
+		return;
+	}
+
+	req->status = smb2srv_tcon_backend(req, io);
+
+	if (req->control_flags & SMB2SRV_REQ_CTRL_FLAG_NOT_REPLY) {
+		talloc_free(req);
+		return;
+	}
+	smb2srv_tcon_send(req, io);
 }
 
+static NTSTATUS smb2srv_tdis_backend(struct smb2srv_request *req)
+{
+	/* TODO: call ntvfs backends to close file of this tcon */
+	talloc_free(req->tcon);
+	req->tcon = NULL;
+	return NT_STATUS_OK;
+}
+
+static void smb2srv_tdis_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_tdis_recv(struct smb2srv_request *req)
 {
-	smb2srv_send_error(req, NT_STATUS_NOT_IMPLEMENTED);
+	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_tdis_backend(req);
+
+	if (req->control_flags & SMB2SRV_REQ_CTRL_FLAG_NOT_REPLY) {
+		talloc_free(req);
+		return;
+	}
+	smb2srv_tdis_send(req);
 }



More information about the samba-cvs mailing list