s4:smbd: hold tsocket_addresses on the stream_connection
authorStefan Metzmacher <metze@samba.org>
Wed, 23 Dec 2009 10:48:06 +0000 (11:48 +0100)
committerStefan Metzmacher <metze@samba.org>
Thu, 24 Dec 2009 16:38:33 +0000 (17:38 +0100)
metze

source4/smbd/config.mk
source4/smbd/service_stream.c
source4/smbd/service_stream.h

index b85beb0bc0f1a28042e971d4e583855daaae3c34..a77a18602fe83d15616a08ce879d84ef3ea067a4 100644 (file)
@@ -4,7 +4,7 @@
 PRIVATE_DEPENDENCIES = \
                LIBTEVENT MESSAGING samba_socket \
                NDR_NAMED_PIPE_AUTH NAMED_PIPE_AUTH_TSTREAM \
-               HEIMDAL_GSSAPI CREDENTIALS
+               HEIMDAL_GSSAPI CREDENTIALS LIBTSOCKET
 
 service_OBJ_FILES = $(addprefix $(smbdsrcdir)/, \
                service.o \
index ab35eb04bf5b6e39e8339910c8d57843e7ff2d15..2d8b9559f4ea12b2febde1d071d808ac450543c4 100644 (file)
@@ -26,6 +26,7 @@
 #include "lib/messaging/irpc.h"
 #include "cluster/cluster.h"
 #include "param/param.h"
+#include "../lib/tsocket/tsocket.h"
 
 /* the range of ports to try for dcerpc over tcp endpoints */
 #define SERVER_TCP_LOW_PORT  1024
@@ -164,7 +165,6 @@ static void stream_new_connection(struct tevent_context *ev,
 {
        struct stream_socket *stream_socket = talloc_get_type(private_data, struct stream_socket);
        struct stream_connection *srv_conn;
-       struct socket_address *c, *s;
 
        srv_conn = talloc_zero(ev, struct stream_connection);
        if (!srv_conn) {
@@ -205,20 +205,34 @@ static void stream_new_connection(struct tevent_context *ev,
                return;
        }
 
-       c = socket_get_peer_addr(sock, ev);
-       s = socket_get_my_addr(sock, ev);
-       if (s && c) {
+       srv_conn->remote_address = socket_get_remote_addr(srv_conn->socket, srv_conn);
+       if (!srv_conn->remote_address) {
+               stream_terminate_connection(srv_conn, "socket_get_remote_addr() failed");
+               return;
+       }
+
+       srv_conn->local_address = socket_get_local_addr(srv_conn->socket, srv_conn);
+       if (!srv_conn->local_address) {
+               stream_terminate_connection(srv_conn, "socket_get_local_addr() failed");
+               return;
+       }
+
+       {
+               TALLOC_CTX *tmp_ctx;
                const char *title;
-               title = talloc_asprintf(s, "conn[%s] c[%s:%u] s[%s:%u] server_id[%s]",
+
+               tmp_ctx = talloc_new(srv_conn);
+
+               title = talloc_asprintf(tmp_ctx, "conn[%s] c[%s] s[%s] server_id[%s]",
                                        stream_socket->ops->name, 
-                                       c->addr, c->port, s->addr, s->port,
-                                       cluster_id_string(s, server_id));
+                                       tsocket_address_string(srv_conn->remote_address, tmp_ctx),
+                                       tsocket_address_string(srv_conn->local_address, tmp_ctx),
+                                       cluster_id_string(tmp_ctx, server_id));
                if (title) {
                        stream_connection_set_title(srv_conn, title);
                }
+               talloc_free(tmp_ctx);
        }
-       talloc_free(c);
-       talloc_free(s);
 
        /* we're now ready to start receiving events on this stream */
        TEVENT_FD_READABLE(srv_conn->event.fde);
index 5d577d4dd86cfafb7f4d688946eb79eef30b7007..685502a8bafe6c75f523c531171b7f81968e11a5 100644 (file)
@@ -50,6 +50,9 @@ struct stream_connection {
        struct messaging_context *msg_ctx;
        struct loadparm_context *lp_ctx;
 
+       struct tsocket_address *local_address;
+       struct tsocket_address *remote_address;
+
        /*
         * this transport layer session info, normally NULL
         * which means the same as an anonymous session info