summaryrefslogtreecommitdiff
path: root/source4/smbd
diff options
context:
space:
mode:
Diffstat (limited to 'source4/smbd')
-rw-r--r--source4/smbd/process_model.h2
-rw-r--r--source4/smbd/process_single.c2
-rw-r--r--source4/smbd/process_standard.c2
-rw-r--r--source4/smbd/process_thread.c2
-rw-r--r--source4/smbd/service.c6
-rw-r--r--source4/smbd/service.h15
6 files changed, 22 insertions, 7 deletions
diff --git a/source4/smbd/process_model.h b/source4/smbd/process_model.h
index 376b9a8ef8..79373d8a39 100644
--- a/source4/smbd/process_model.h
+++ b/source4/smbd/process_model.h
@@ -23,8 +23,6 @@
#ifndef SAMBA_PROCESS_MODEL_H
#define SAMBA_PROCESS_MODEL_H
-struct server_service_connection;
-
/* modules can use the following to determine if the interface has changed
* please increment the version number after each interface change
* with a comment and maybe update struct process_model_critical_sizes.
diff --git a/source4/smbd/process_single.c b/source4/smbd/process_single.c
index 12a265b62f..b96a1d0b2c 100644
--- a/source4/smbd/process_single.c
+++ b/source4/smbd/process_single.c
@@ -49,7 +49,7 @@ static void single_accept_connection(struct event_context *ev, struct fd_event *
return;
}
- conn = server_setup_connection(ev, server_socket, sock, t);
+ conn = server_setup_connection(ev, server_socket, sock, t, socket_get_fd(sock));
if (!conn) {
DEBUG(0,("server_setup_connection(ev, server_socket, sock, t) failed\n"));
return;
diff --git a/source4/smbd/process_standard.c b/source4/smbd/process_standard.c
index 122c6581b0..d70cfa676b 100644
--- a/source4/smbd/process_standard.c
+++ b/source4/smbd/process_standard.c
@@ -74,7 +74,7 @@ static void standard_accept_connection(struct event_context *ev, struct fd_event
set_need_random_reseed();
- conn = server_setup_connection(ev, server_socket, sock, t);
+ conn = server_setup_connection(ev, server_socket, sock, t, getpid());
if (!conn) {
DEBUG(0,("server_setup_connection(ev, server_socket, sock, t) failed\n"));
return;
diff --git a/source4/smbd/process_thread.c b/source4/smbd/process_thread.c
index 55688f85e8..85f30c9ddd 100644
--- a/source4/smbd/process_thread.c
+++ b/source4/smbd/process_thread.c
@@ -79,7 +79,7 @@ static void thread_accept_connection(struct event_context *ev, struct fd_event *
return;
}
- conn = server_setup_connection(ev, server_socket, sock, t);
+ conn = server_setup_connection(ev, server_socket, sock, t, pthread_self());
if (!conn) {
DEBUG(0,("server_setup_connection(ev, server_socket, sock, t) failed\n"));
event_context_destroy(ev);
diff --git a/source4/smbd/service.c b/source4/smbd/service.c
index 5aae84b2c9..9a7ac73559 100644
--- a/source4/smbd/service.c
+++ b/source4/smbd/service.c
@@ -198,7 +198,8 @@ static int server_destructor(void *ptr)
struct server_connection *server_setup_connection(struct event_context *ev,
struct server_socket *server_socket,
struct socket_context *sock,
- time_t t)
+ time_t t,
+ servid_t server_id)
{
struct fd_event fde;
struct timed_event idle;
@@ -206,7 +207,7 @@ struct server_connection *server_setup_connection(struct event_context *ev,
srv_conn = talloc_p(server_socket, struct server_connection);
if (!srv_conn) {
- DEBUG(0,("talloc_p(mem_ctx, struct server_service_connection) failed\n"));
+ DEBUG(0,("talloc_p(mem_ctx, struct server_connection) failed\n"));
return NULL;
}
@@ -229,6 +230,7 @@ struct server_connection *server_setup_connection(struct event_context *ev,
srv_conn->server_socket = server_socket;
srv_conn->service = server_socket->service;
srv_conn->socket = sock;
+ srv_conn->server_id = server_id;
/* create a smb server context and add it to out event
handling */
diff --git a/source4/smbd/service.h b/source4/smbd/service.h
index 88618964ce..e9ef0bff06 100644
--- a/source4/smbd/service.h
+++ b/source4/smbd/service.h
@@ -93,6 +93,19 @@ struct server_service {
struct server_context *srv_ctx;
};
+/* the concept of whether two operations are on the same server
+ connection or different connections is an important one in SMB, especially
+ for locking and share modes. We will use a servid_t to distinguish different
+ connections
+
+ this means that (for example) a unique open file is distinguished by the triple
+ of
+ servid_t server;
+ uint16 tid;
+ uint16 fnum;
+*/
+typedef uint32_t servid_t;
+
struct server_connection {
struct server_connection *next,*prev;
void *private_data;
@@ -104,6 +117,8 @@ struct server_connection {
time_t idle_time;
} event;
+ servid_t server_id;
+
struct socket_context *socket;
struct server_socket *server_socket;