From 7d06a06584e5163b69f712e38dc46afc2668389c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 20 Sep 2004 12:31:07 +0000 Subject: r2447: let the server code use the new lib/socket/ stuff metze (This used to be commit 2fd577d2417e117a7e8c1a56feb147eae805df34) --- source4/smbd/process_single.c | 15 +++-- source4/smbd/process_standard.c | 21 ++++--- source4/smbd/process_thread.c | 29 +++++---- source4/smbd/service.c | 126 +++++++++++++++++++++------------------- 4 files changed, 100 insertions(+), 91 deletions(-) (limited to 'source4/smbd') diff --git a/source4/smbd/process_single.c b/source4/smbd/process_single.c index 8bd00c53b9..f3b69eae28 100644 --- a/source4/smbd/process_single.c +++ b/source4/smbd/process_single.c @@ -36,23 +36,22 @@ static void single_start_server(void) */ static void single_accept_connection(struct event_context *ev, struct fd_event *srv_fde, time_t t, uint16_t flags) { - int accepted_fd; - struct sockaddr addr; - socklen_t in_addrlen = sizeof(addr); + NTSTATUS status; + struct socket_context *sock; struct server_socket *server_socket = srv_fde->private; struct server_connection *conn; /* accept an incoming connection. */ - accepted_fd = accept(srv_fde->fd,&addr,&in_addrlen); - if (accepted_fd == -1) { + status = socket_accept(server_socket->socket, &sock, 0); + if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("accept_connection_single: accept: %s\n", - strerror(errno))); + nt_errstr(status))); return; } - conn = server_setup_connection(ev, server_socket, accepted_fd, t); + conn = server_setup_connection(ev, server_socket, sock, t); if (!conn) { - DEBUG(0,("server_setup_connection(ev, server_socket, accepted_fd) failed\n")); + 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 c12a1f4305..9dfda41db3 100644 --- a/source4/smbd/process_standard.c +++ b/source4/smbd/process_standard.c @@ -36,18 +36,17 @@ static void standard_model_startup(void) */ static void standard_accept_connection(struct event_context *ev, struct fd_event *srv_fde, time_t t, uint16_t flags) { - int accepted_fd; - struct sockaddr addr; - socklen_t in_addrlen = sizeof(addr); - pid_t pid; + NTSTATUS status; + struct socket_context *sock; struct server_socket *server_socket = srv_fde->private; struct server_connection *conn; + pid_t pid; /* accept an incoming connection. */ - accepted_fd = accept(srv_fde->fd,&addr,&in_addrlen); - if (accepted_fd == -1) { - DEBUG(0,("standard_accept_connection: accept: %s\n", - strerror(errno))); + status = socket_accept(server_socket->socket, &sock, 0); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("accept_connection_single: accept: %s\n", + nt_errstr(status))); return; } @@ -56,7 +55,7 @@ static void standard_accept_connection(struct event_context *ev, struct fd_event if (pid != 0) { /* parent or error code ... */ - close(accepted_fd); + socket_destroy(sock); /* go back to the event loop */ return; } @@ -75,9 +74,9 @@ static void standard_accept_connection(struct event_context *ev, struct fd_event set_need_random_reseed(); - conn = server_setup_connection(ev, server_socket, accepted_fd, t); + conn = server_setup_connection(ev, server_socket, sock, t); if (!conn) { - DEBUG(0,("server_setup_connection(ev, server_socket, accepted_fd) failed\n")); + 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 ced07d5d76..ef4d53e188 100644 --- a/source4/smbd/process_thread.c +++ b/source4/smbd/process_thread.c @@ -49,19 +49,19 @@ static int thread_get_id(struct smbsrv_request *req) static void thread_accept_connection(struct event_context *ev, struct fd_event *srv_fde, time_t t, uint16_t flags) { - int accepted_fd, rc; - struct sockaddr addr; - socklen_t in_addrlen = sizeof(addr); + NTSTATUS status; + struct socket_context *sock; + int rc; pthread_t thread_id; pthread_attr_t thread_attr; struct server_socket *server_socket = srv_fde->private; struct server_connection *conn; /* accept an incoming connection. */ - accepted_fd = accept(srv_fde->fd,&addr,&in_addrlen); - if (accepted_fd == -1) { - DEBUG(0,("standard_accept_connection: accept: %s\n", - strerror(errno))); + status = socket_accept(server_socket->socket, &sock, 0); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("accept_connection_single: accept: %s\n", + nt_errstr(status))); return; } @@ -72,16 +72,18 @@ static void thread_accept_connection(struct event_context *ev, struct fd_event * main event_context is continued. */ - ev = event_context_init(); if (!ev) { DEBUG(0,("thread_accept_connection: failed to create event_context!\n")); + socket_destroy(sock); return; } - conn = server_setup_connection(ev, server_socket, accepted_fd, t); + conn = server_setup_connection(ev, server_socket, sock, t); if (!conn) { - DEBUG(0,("server_setup_connection(ev, server_socket, accepted_fd) failed\n")); + DEBUG(0,("server_setup_connection(ev, server_socket, sock, t) failed\n")); + event_context_destroy(ev); + socket_destroy(sock); return; } @@ -98,9 +100,12 @@ static void thread_accept_connection(struct event_context *ev, struct fd_event * pthread_attr_destroy(&thread_attr); if (rc == 0) { DEBUG(4,("accept_connection_thread: created thread_id=%lu for fd=%d\n", - (unsigned long int)thread_id, accepted_fd)); + (unsigned long int)thread_id, socket_get_fd(sock))); } else { - DEBUG(0,("accept_connection_thread: thread create failed for fd=%d, rc=%d\n", accepted_fd, rc)); + DEBUG(0,("accept_connection_thread: thread create failed for fd=%d, rc=%d\n", socket_get_fd(sock), rc)); + event_context_destroy(ev); + socket_destroy(sock); + return; } } diff --git a/source4/smbd/service.c b/source4/smbd/service.c index bcdb953e56..22d8f23765 100644 --- a/source4/smbd/service.c +++ b/source4/smbd/service.c @@ -97,103 +97,111 @@ struct server_context *server_service_startup(const char *model) } /* - setup a single listener of any type - if you pass *port == 0, then a port < 1024 is used + setup a listen stream socket + if you pass *port == 0, then a port > 1024 is used */ struct server_socket *service_setup_socket(struct server_service *service, - const struct model_ops *model_ops, - struct socket_context *socket_ctx, - struct in_addr *ifip, uint16_t *port) + const struct model_ops *model_ops, + const char *sock_addr, + uint16_t *port) { - TALLOC_CTX *mem_ctx; - struct server_socket *sock; + NTSTATUS status; + struct server_socket *srv_sock; + struct socket_context *socket_ctx; struct fd_event fde; int i; - mem_ctx = talloc_init("struct server_socket"); - - sock = talloc_p(mem_ctx, struct server_socket); - if (!sock) { - DEBUG(0,("talloc_p(mem_ctx, struct server_socket) failed\n")); - return NULL; - } - if (*port == 0) { - fde.fd = -1; for (i=SERVER_TCP_LOW_PORT;i<= SERVER_TCP_HIGH_PORT;i++) { - fde.fd = open_socket_in(SOCK_STREAM, i, 0, ifip->s_addr, True); - if (fde.fd != -1) break; - } - if (fde.fd != -1) { - *port = i; + status = socket_create("ipv4", SOCKET_TYPE_STREAM, &socket_ctx, 0); + if (NT_STATUS_IS_OK(status)) { + *port = i; + break; + } } } else { - fde.fd = open_socket_in(SOCK_STREAM, *port, 0, ifip->s_addr, True); + status = socket_create("ipv4", SOCKET_TYPE_STREAM, &socket_ctx, 0); } - if (fde.fd == -1) { + if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to open socket on %s:%u - %s\n", - inet_ntoa(*ifip), *port, strerror(errno))); + sock_addr, *port, nt_errstr(status))); return NULL; } /* ready to listen */ - set_socket_options(fde.fd, "SO_KEEPALIVE"); - set_socket_options(fde.fd, lp_socket_options()); - - if (listen(fde.fd, SERVER_LISTEN_BACKLOG) == -1) { + status = socket_set_option(socket_ctx, "SO_KEEPALIVE", NULL); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("socket_set_option(socket_ctx, SO_KEEPALIVE, NULL): %s\n", + nt_errstr(status))); + socket_destroy(socket_ctx); + return NULL; + } + status = socket_set_option(socket_ctx, lp_socket_options(), NULL); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("socket_set_option(socket_ctx, lp_socket_options(), NULL): %s\n", + nt_errstr(status))); + socket_destroy(socket_ctx); + return NULL; + } + + /* TODO: set socket ACL's here when they're implemented */ + + status = socket_listen(socket_ctx, sock_addr, *port, SERVER_LISTEN_BACKLOG, 0); + if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to listen on %s:%u - %s\n", - inet_ntoa(*ifip), *port, strerror(errno))); - close(fde.fd); + sock_addr, *port, nt_errstr(status))); + socket_destroy(socket_ctx); + return NULL; + } + + srv_sock = talloc_p(NULL, struct server_socket); + if (!srv_sock) { + DEBUG(0,("talloc_p(mem_ctx, struct server_socket) failed\n")); + socket_destroy(socket_ctx); return NULL; } /* we are only interested in read events on the listen socket */ - fde.flags = EVENT_FD_READ; - fde.private = sock; - fde.handler = model_ops->accept_connection; - - ZERO_STRUCTP(sock); - sock->mem_ctx = mem_ctx; - sock->service = service; - sock->socket = socket_ctx; - sock->event.ctx = service->srv_ctx->events; - sock->event.fde = event_add_fd(sock->event.ctx, &fde); - if (!sock->event.fde) { - DEBUG(0,("event_add_fd(sock->event.ctx, &fde) failed\n")); + fde.fd = socket_get_fd(socket_ctx); + fde.flags = EVENT_FD_READ; + fde.private = srv_sock; + fde.handler = model_ops->accept_connection; + + ZERO_STRUCTP(srv_sock); + srv_sock->mem_ctx = srv_sock; + srv_sock->service = service; + srv_sock->socket = socket_ctx; + srv_sock->event.ctx = service->srv_ctx->events; + srv_sock->event.fde = event_add_fd(srv_sock->event.ctx, &fde); + if (!srv_sock->event.fde) { + DEBUG(0,("event_add_fd(srv_sock->event.ctx, &fde) failed\n")); + socket_destroy(socket_ctx); return NULL; } - DLIST_ADD(service->socket_list, sock); + DLIST_ADD(service->socket_list, srv_sock); - return sock; + return srv_sock; } -struct server_connection *server_setup_connection(struct event_context *ev, struct server_socket *server_socket, int accepted_fd, time_t t) +struct server_connection *server_setup_connection(struct event_context *ev, struct server_socket *server_socket, struct socket_context *sock, time_t t) { struct fd_event fde; struct timed_event idle; struct server_connection *srv_conn; - TALLOC_CTX *mem_ctx; - mem_ctx = talloc_init("server_service_connection"); - if (!mem_ctx) { - DEBUG(0,("talloc_init(server_service_connection) failed\n")); - return NULL; - } - - srv_conn = talloc_p(mem_ctx, struct server_connection); + srv_conn = talloc_p(NULL, struct server_connection); if (!srv_conn) { DEBUG(0,("talloc_p(mem_ctx, struct server_service_connection) failed\n")); - talloc_destroy(mem_ctx); return NULL; } ZERO_STRUCTP(srv_conn); - srv_conn->mem_ctx = mem_ctx; + srv_conn->mem_ctx = srv_conn; fde.private = srv_conn; - fde.fd = accepted_fd; + fde.fd = socket_get_fd(sock); fde.flags = EVENT_FD_READ; fde.handler = server_io_handler; @@ -208,9 +216,7 @@ struct server_connection *server_setup_connection(struct event_context *ev, stru srv_conn->server_socket = server_socket; srv_conn->service = server_socket->service; - - /* TODO: we need a generic socket subsystem */ - srv_conn->socket = NULL; + srv_conn->socket = sock; /* create a smb server context and add it to out event handling */ @@ -234,7 +240,7 @@ void server_terminate_connection(struct server_connection *srv_conn, const char void server_destroy_connection(struct server_connection *srv_conn) { - close(srv_conn->event.fde->fd); + socket_destroy(srv_conn->socket); event_remove_fd(srv_conn->event.ctx, srv_conn->event.fde); srv_conn->event.fde = NULL; -- cgit