r12608: Remove some unused #include lines.
[abartlet/samba.git/.git] / source4 / smbd / process_single.c
index 6a00ad237fd5bcb4c278e4bf6e25d2cef78b5d96..94fd7259469d13a3116282b38ae4861591cd192d 100644 (file)
@@ -1,6 +1,8 @@
 /* 
    Unix SMB/CIFS implementation.
+
    process model: process (1 process handles all client connections)
+
    Copyright (C) Andrew Tridgell 2003
    Copyright (C) James J Myers 2003 <myersjj@samba.org>
    Copyright (C) Stefan (metze) Metzmacher 2004
 */
 
 #include "includes.h"
-#include "events.h"
-#include "dlinklist.h"
 #include "smb_server/smb_server.h"
-#include "process_model.h"
+
+/* For sepecifiying event context to GSSAPI below */
+#include "heimdal/lib/gssapi/gssapi_locl.h"
 
 
 /*
   called when the process model is selected
 */
-static void single_model_init(struct server_context *server)
-{
-}
-
-static void single_model_exit(struct server_context *server, const char *reason)
+static void single_model_init(struct event_context *ev)
 {
-       DEBUG(1,("single_exit_server: reason[%s]\n",reason));
-       talloc_free(server);
-       exit(0);
+       /* Hack to ensure that GSSAPI uses the right event context */
+       gssapi_krb5_init_ev(ev);
 }
 
 /*
-  called when a listening socket becomes readable
+  called when a listening socket becomes readable
 */
-static void single_accept_connection(struct event_context *ev, struct fd_event *srv_fde, 
-                                    struct timeval t, uint16_t flags)
+static void single_accept_connection(struct event_context *ev, 
+                                    struct socket_context *sock,
+                                    void (*new_conn)(struct event_context *, struct socket_context *, 
+                                                     uint32_t , void *), 
+                                    void *private)
 {
        NTSTATUS status;
-       struct socket_context *sock;
-       struct server_stream_socket *stream_socket = srv_fde->private;
-       struct server_connection *conn;
+       struct socket_context *sock2;
 
        /* accept an incoming connection. */
-       status = socket_accept(stream_socket->socket, &sock);
+       status = socket_accept(sock, &sock2);
        if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0,("accept_connection_single: accept: %s\n",
-                        nt_errstr(status)));
+               DEBUG(0,("accept_connection_single: accept: %s\n", nt_errstr(status)));
+               /* this looks strange, but is correct. We need to
+                  throttle things until the system clears enough
+                  resources to handle this new socket. If we don't
+                  then we will spin filling the log and causing more
+                  problems. We don't panic as this is probably a
+                  temporary resource constraint */
+               sleep(1);
                return;
        }
 
-       conn = server_setup_connection(ev, stream_socket, sock, t, socket_get_fd(sock));
-       if (!conn) {
-               DEBUG(10,("server_setup_connection failed\n"));
-               return;
-       }
+       talloc_steal(private, sock);
 
-       talloc_steal(conn, sock);
-
-       /* return to event handling */
-       return;
-}
-
-
-
-/* called when a SMB connection goes down */
-static void single_terminate_connection(struct server_connection *conn, const char *reason) 
-{
-       DEBUG(2,("single_terminate_connection: reason[%s]\n",reason));
-
-       if (conn) {
-               talloc_free(conn);
-       }
+       new_conn(ev, sock2, socket_get_fd(sock2), private);
 }
 
 /*
-  called to create a new event context for a new task
+  called to startup a new task
 */
-static void single_create_task(struct server_task *task)
+static void single_new_task(struct event_context *ev, 
+                           void (*new_task)(struct event_context *, uint32_t, void *), 
+                           void *private)
 {
-       task->task.id   = (uint32_t)task;
-       task->event.ctx = task->service->server->event.ctx;
-
-       /* setup to receive internal messages on this connection */
-       task->messaging.ctx = messaging_init(task, task->task.id, task->event.ctx);
-       if (!task->messaging.ctx) {
-               server_terminate_task(task, "messaging_init() failed");
-               return;
-       }
-
-       task->task.ops->task_init(task);
-       return;
+       static uint32_t taskid = 0x10000000;
+       new_task(ev, taskid++, private);
 }
 
-/*
-  called to exit from a server_task
-*/
-static void single_terminate_task(struct server_task *task, const char *reason)
+
+/* called when a task goes down */
+static void single_terminate(struct event_context *ev, const char *reason) 
 {
-       DEBUG(1,("single_exit_server: reason[%s]\n",reason));
-       talloc_free(task);
-       return;
+       DEBUG(2,("single_terminate: reason[%s]\n",reason));
 }
 
 static const struct model_ops single_ops = {
        .name                   = "single",
-
        .model_init             = single_model_init,
-       .model_exit             = single_model_exit,
-
+       .new_task               = single_new_task,
        .accept_connection      = single_accept_connection,
-       .terminate_connection   = single_terminate_connection,
-
-       .create_task            = single_create_task,
-       .terminate_task         = single_terminate_task
+       .terminate              = single_terminate,
 };
 
 /*
-  initialise the single process model, registering ourselves with the process model subsystem
+  initialise the single process model, registering ourselves with the
+  process model subsystem
  */
 NTSTATUS process_model_single_init(void)
 {
-       NTSTATUS ret;
-
-       /* register ourselves with the PROCESS_MODEL subsystem. */
-       ret = register_process_model(&single_ops);
-       if (!NT_STATUS_IS_OK(ret)) {
-               DEBUG(0,("Failed to register process_model 'single'!\n"));
-               return ret;
-       }
-
-       return ret;
+       return register_process_model(&single_ops);
 }