r1104: get_called_name is used in the printing subsystem. In case of multi-homed
authorVolker Lendecke <vlendec@samba.org>
Thu, 10 Jun 2004 17:09:00 +0000 (17:09 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:51:55 +0000 (10:51 -0500)
servers we need to make sure that the clients are given back the IP address
they connected to.

Volker

source/lib/util_sock.c
source/param/loadparm.c

index b6bfdca5cf9fd5d574a7ba6d9a02a8d38ffba485..4b9881a4499bf478e9b4bd0122844afa2dae6f81 100644 (file)
@@ -52,6 +52,23 @@ static char *get_socket_addr(int fd)
        return addr_buf;
 }
 
+static int get_socket_port(int fd)
+{
+       struct sockaddr sa;
+       struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
+       socklen_t length = sizeof(sa);
+
+       if (fd == -1)
+               return -1;
+       
+       if (getsockname(fd, &sa, &length) < 0) {
+               DEBUG(0,("getpeername failed. Error was %s\n", strerror(errno) ));
+               return -1;
+       }
+       
+       return ntohs(sockin->sin_port);
+}
+
 /****************************************************************************
  Determine if a file descriptor is in fact a socket.
 ****************************************************************************/
@@ -837,6 +854,11 @@ char *client_socket_addr(void)
        return get_socket_addr(client_fd);
 }
 
+int client_socket_port(void)
+{
+       return get_socket_port(client_fd);
+}
+
 struct in_addr *client_inaddr(struct sockaddr *sa)
 {
        struct sockaddr_in *sockin = (struct sockaddr_in *) (sa);
index 2c65ac67d9686095e6d017397edd928c66f922a4..03b86a9c1831400756ffdec2ea1e00174c215844 100644 (file)
@@ -4262,7 +4262,10 @@ const char *get_called_name(void)
        extern fstring local_machine;
        static fstring called_name;
 
-       if (!*local_machine) {
+       if ( (!*local_machine) ||
+            (client_socket_port() == 445) ) {
+               /* Everybody coming in on 445 should be able to live with the
+                * IP address */
                fstrcpy(called_name, client_socket_addr());
                DEBUG(8,("get_called_name: assuming that client used IP address [%s] as called name.\n",
                         called_name));