summaryrefslogtreecommitdiff
path: root/source4/smbd/process_single.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/smbd/process_single.c')
-rw-r--r--source4/smbd/process_single.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/source4/smbd/process_single.c b/source4/smbd/process_single.c
index 5d3c36adb9..a7a27ef9e0 100644
--- a/source4/smbd/process_single.c
+++ b/source4/smbd/process_single.c
@@ -38,7 +38,7 @@ static void single_model_init(struct event_context *ev)
*/
static void single_accept_connection(struct event_context *ev,
struct loadparm_context *lp_ctx,
- struct socket_context *sock,
+ struct socket_context *listen_socket,
void (*new_conn)(struct event_context *,
struct loadparm_context *,
struct socket_context *,
@@ -46,25 +46,33 @@ static void single_accept_connection(struct event_context *ev,
void *private)
{
NTSTATUS status;
- struct socket_context *sock2;
+ struct socket_context *connected_socket;
/* accept an incoming connection. */
- status = socket_accept(sock, &sock2);
+ status = socket_accept(listen_socket, &connected_socket);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("single_accept_connection: 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 */
+ /* this looks strange, but is correct.
+
+ We can only be here if woken up from select, due to
+ an incomming connection.
+
+ 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;
}
- talloc_steal(private, sock);
+ talloc_steal(private, connected_socket);
- new_conn(ev, lp_ctx, sock2, cluster_id(socket_get_fd(sock2)), private);
+ /* The cluster_id(0, fd) cannot collide with the incrementing
+ * task below, as the first component is 0, not 1 */
+ new_conn(ev, lp_ctx, connected_socket,
+ cluster_id(0, socket_get_fd(connected_socket)), private);
}
/*
@@ -72,11 +80,17 @@ static void single_accept_connection(struct event_context *ev,
*/
static void single_new_task(struct event_context *ev,
struct loadparm_context *lp_ctx,
+ const char *service_name,
void (*new_task)(struct event_context *, struct loadparm_context *, struct server_id, void *),
void *private)
{
- static uint32_t taskid = 0x10000000;
- new_task(ev, lp_ctx, cluster_id(taskid++), private);
+ static uint32_t taskid = 0;
+
+ /* We use 1 so we cannot collide in with cluster ids generated
+ * in the accept connection above, and unlikly to collide with
+ * PIDs from process modal standard (don't run samba as
+ * init) */
+ new_task(ev, lp_ctx, cluster_id(1, taskid++), private);
}