[SCM] Samba Shared Repository - branch master updated - bee2b6c3a3890949bd87e1e4b8c6de010c808f4d

Volker Lendecke vlendec at samba.org
Mon Sep 22 02:40:49 GMT 2008


The branch, master has been updated
       via  bee2b6c3a3890949bd87e1e4b8c6de010c808f4d (commit)
      from  b7e2c74cef708dfaf7a22de8d68382b9a5f2cf57 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit bee2b6c3a3890949bd87e1e4b8c6de010c808f4d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Sep 22 03:57:31 2008 +0200

    process incoming connections and fork a samba3 in inetd mode

-----------------------------------------------------------------------

Summary of changes:
 source4/smb_server/config.mk    |    8 ++
 source4/smb_server/smb_samba3.c |  174 +++++++++++++++++++++++++++++++++++++++
 source4/smbd/server.c           |    1 +
 3 files changed, 183 insertions(+), 0 deletions(-)
 create mode 100644 source4/smb_server/smb_samba3.c


Changeset truncated at 500 lines:

diff --git a/source4/smb_server/config.mk b/source4/smb_server/config.mk
index e11968a..d1ec6d4 100644
--- a/source4/smb_server/config.mk
+++ b/source4/smb_server/config.mk
@@ -9,6 +9,14 @@ SERVICE_SMB_OBJ_FILES = $(smb_serversrcdir)/smb_server.o
 
 $(eval $(call proto_header_template,$(smb_serversrcdir)/service_smb_proto.h,$(SERVICE_SMB_OBJ_FILES:.o=.c)))
 
+# samba3 SMB server subsystem
+#
+[MODULE::SERVICE_SAMBA3_SMB]
+INIT_FUNCTION = server_service_samba3_smb_init
+SUBSYSTEM = smbd
+
+SERVICE_SAMBA3_SMB_OBJ_FILES = $(smb_serversrcdir)/smb_samba3.o
+
 #######################
 # Start SUBSYSTEM SMB
 [SUBSYSTEM::SMB_SERVER]
diff --git a/source4/smb_server/smb_samba3.c b/source4/smb_server/smb_samba3.c
new file mode 100644
index 0000000..7b32298
--- /dev/null
+++ b/source4/smb_server/smb_samba3.c
@@ -0,0 +1,174 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   process incoming connections and fork a samba3 in inetd mode
+
+   Copyright (C) Stefan Metzmacher	2008
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "smbd/service_task.h"
+#include "smbd/service_stream.h"
+#include "smbd/service.h"
+#include "lib/messaging/irpc.h"
+#include "lib/stream/packet.h"
+#include "lib/socket/socket.h"
+#include "libcli/smb2/smb2.h"
+#include "smb_server/smb2/smb2_server.h"
+#include "system/network.h"
+#include "lib/socket/netif.h"
+#include "param/share.h"
+#include "dsdb/samdb/samdb.h"
+#include "param/param.h"
+#include "dynconfig/dynconfig.h"
+#include "smbd/process_model.h"
+
+/*
+  initialise a server_context from a open socket and register a event handler
+  for reading from that socket
+*/
+static void samba3_smb_accept(struct stream_connection *conn)
+{
+	int i;
+	int fd = socket_get_fd(conn->socket);
+	const char *prog;
+	char *argv[2];
+	char *reason;
+
+	close(0);
+	close(1);
+	dup2(fd, 0);
+	dup2(fd, 1);
+	for (i=2;i<256;i++) {
+		close(i);
+	}
+
+	prog = lp_parm_string(conn->lp_ctx, NULL, "samba3", "smbd");
+
+	if (prog == NULL) {
+		argv[0] = talloc_asprintf(conn, "%s/%s", dyn_BINDIR, "smbd3");
+	}
+	else {
+		argv[0] = talloc_strdup(conn, prog);
+	}
+
+	if (argv[0] == NULL) {
+		stream_terminate_connection(conn, "out of memory");
+		return;
+	}
+	argv[1] = NULL;
+
+	execve(argv[0], argv, environ);
+
+	/*
+	 * Should never get here
+	 */
+	reason = talloc_asprintf(conn, "Could not execute %s", argv[0]);
+	if (reason == NULL) {
+		stream_terminate_connection(conn, "out of memory");
+		return;
+	}
+	stream_terminate_connection(conn, reason);
+	talloc_free(reason);
+}
+
+static const struct stream_server_ops samba3_smb_stream_ops = {
+	.name			= "samba3",
+	.accept_connection	= samba3_smb_accept,
+};
+
+/*
+  setup a listening socket on all the SMB ports for a particular address
+*/
+static NTSTATUS samba3_add_socket(struct event_context *event_context,
+				  struct loadparm_context *lp_ctx,
+				  const struct model_ops *model_ops,
+				  const char *address)
+{
+	const char **ports = lp_smb_ports(lp_ctx);
+	int i;
+	NTSTATUS status;
+
+	for (i=0;ports[i];i++) {
+		uint16_t port = atoi(ports[i]);
+		if (port == 0) continue;
+		status = stream_setup_socket(event_context, lp_ctx,
+					     model_ops, &samba3_smb_stream_ops,
+					     "ip", address, &port,
+					     lp_socket_options(lp_ctx),
+					     NULL);
+		NT_STATUS_NOT_OK_RETURN(status);
+	}
+
+	return NT_STATUS_OK;
+}
+
+
+/*
+  open the smb server sockets
+*/
+static void samba3_smb_task_init(struct task_server *task)
+{
+	NTSTATUS status;
+	const struct model_ops *model_ops;
+
+	model_ops = process_model_startup(task->event_ctx, "standard");
+
+	if (model_ops == NULL) {
+		goto failed;
+	}
+
+	task_server_set_title(task, "task[samba3_smb]");
+
+	if (lp_interfaces(task->lp_ctx)
+	    && lp_bind_interfaces_only(task->lp_ctx)) {
+		int num_interfaces;
+		int i;
+		struct interface *ifaces;
+
+		load_interfaces(task, lp_interfaces(task->lp_ctx), &ifaces);
+
+		num_interfaces = iface_count(ifaces);
+
+		/* We have been given an interfaces line, and been
+		   told to only bind to those interfaces. Create a
+		   socket per interface and bind to only these.
+		*/
+		for(i = 0; i < num_interfaces; i++) {
+			const char *address = iface_n_ip(ifaces, i);
+			status = samba3_add_socket(task->event_ctx,
+						   task->lp_ctx,
+						   model_ops, address);
+			if (!NT_STATUS_IS_OK(status)) goto failed;
+		}
+	} else {
+		/* Just bind to lp_socket_address() (usually 0.0.0.0) */
+		status = samba3_add_socket(task->event_ctx, task->lp_ctx,
+					   model_ops,
+					   lp_socket_address(task->lp_ctx));
+		if (!NT_STATUS_IS_OK(status)) goto failed;
+	}
+
+	return;
+failed:
+	task_server_terminate(task, "Failed to startup samba3 smb task");
+}
+
+/* called at smbd startup - register ourselves as a server service */
+NTSTATUS server_service_samba3_smb_init(void)
+{
+	return register_server_service("samba3_smb", samba3_smb_task_init);
+}
diff --git a/source4/smbd/server.c b/source4/smbd/server.c
index 5bd5568..cf25693 100644
--- a/source4/smbd/server.c
+++ b/source4/smbd/server.c
@@ -199,6 +199,7 @@ static int binary_smbd_main(const char *binary_name, int argc, const char *argv[
 	extern NTSTATUS server_service_drepl_init(void);
 	extern NTSTATUS server_service_rpc_init(void);
 	extern NTSTATUS server_service_ntp_signd_init(void);
+	extern NTSTATUS server_service_samba3_smb_init(void);
 	init_module_fn static_init[] = { STATIC_smbd_MODULES };
 	init_module_fn *shared_init;
 	struct event_context *event_ctx;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list