[PVFS2-CVS] commit by robl in pvfs2-1/src/io/bmi/bmi_tcp: bmi-tcp-addressing.h bmi-tcp.c

CVS commit program cvs at parl.clemson.edu
Thu Sep 29 17:15:43 EDT 2005


Update of /projects/cvsroot/pvfs2-1/src/io/bmi/bmi_tcp
In directory parlweb:/tmp/cvs-serv9546/src/io/bmi/bmi_tcp

Modified Files:
	bmi-tcp-addressing.h bmi-tcp.c 
Log Message:
[pcarns]: reverse name lookup patch.  --enable-rev-hostname if you want
hostnames instead of ip addresses 


Index: bmi-tcp-addressing.h
===================================================================
RCS file: /projects/cvsroot/pvfs2-1/src/io/bmi/bmi_tcp/bmi-tcp-addressing.h,v
diff -u -w -p -u -r1.12 -r1.13
--- bmi-tcp-addressing.h	28 Jul 2004 14:32:40 -0000	1.12
+++ bmi-tcp-addressing.h	29 Sep 2005 20:15:43 -0000	1.13
@@ -23,6 +23,10 @@
 */
 #define BMI_TCP_ZERO_READ_LIMIT  10
 
+/* peer name types */
+#define BMI_TCP_PEER_IP 1
+#define BMI_TCP_PEER_HOSTNAME 2
+
 /* this contains TCP/IP addressing information- it is filled in as
  * connections are made */
 struct tcp_addr
@@ -47,6 +51,8 @@ struct tcp_addr
     int zero_read_limit;
     /* flag used to determine if we can reconnect this address after failure */
     int dont_reconnect;
+    char* peer;
+    int peer_type;
 };
 
 /*****************************************************************

Index: bmi-tcp.c
===================================================================
RCS file: /projects/cvsroot/pvfs2-1/src/io/bmi/bmi_tcp/bmi-tcp.c,v
diff -u -w -p -u -r1.94 -r1.95
--- bmi-tcp.c	2 Aug 2005 19:54:11 -0000	1.94
+++ bmi-tcp.c	29 Sep 2005 20:15:43 -0000	1.95
@@ -15,6 +15,9 @@
 #include <assert.h>
 #include <sys/uio.h>
 #include <time.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
 
 #include "pvfs2-config.h"
 #ifdef HAVE_NETDB_H
@@ -240,7 +243,7 @@ static int work_on_recv_op(method_op_p m
 			   int *stall_flag);
 static int work_on_send_op(method_op_p my_method_op,
 			   int *blocked_flag, int* stall_flag);
-static int tcp_accept_init(int *socket);
+static int tcp_accept_init(int *socket, char** peer);
 static method_op_p alloc_tcp_method_op(void);
 static void dealloc_tcp_method_op(method_op_p old_op);
 static int handle_new_connection(method_addr_p map);
@@ -1376,31 +1379,56 @@ int BMI_tcp_cancel(bmi_op_id_t id, bmi_c
 const char* BMI_tcp_addr_rev_lookup_unexpected(method_addr_p map)
 {
     struct tcp_addr *tcp_addr_data = map->method_data;
+
+#if !defined(__PVFS2_BMI_REV_LOOKUP_HOSTNAME__) || !defined(HAVE_GETHOSTBYADDR)
+    return(tcp_addr_data->peer);
+
+#else 
     socklen_t peerlen = sizeof(struct sockaddr_in);
     struct sockaddr_in peer;
     int ret;
     struct hostent *peerent;
+    char* tmp_peer;
 
+    if(tcp_addr_data->peer_type == BMI_TCP_PEER_HOSTNAME)
+    {
+        /* full hostname already cached; return now */
+        return(tcp_addr_data->peer);
+    }
 
+    /* if we hit this point, we need to resolve hostname */
     ret = getpeername(tcp_addr_data->socket, (struct sockaddr*)&(peer), &peerlen);
     if(ret < 0)
     {
-        return("UNKNOWN");
+        /* default to use IP address */
+        return(tcp_addr_data->peer);
     }
 
-#ifdef HAVE_GETHOSTBYADDR
-    
     peerent = gethostbyaddr((void*)&peer.sin_addr.s_addr, 
         sizeof(struct in_addr), AF_INET);
     if(peerent == NULL)
     {
-        return("UNKNOWN");
+        /* default to use IP address */
+        return(tcp_addr_data->peer);
     }
  
-    return(peerent->h_name);
-#else
-    return ("UNKNOWN");
+    tmp_peer = (char*)malloc(strlen(peerent->h_name) + 1);
+    if(!tmp_peer)
+    {
+        /* default to use IP address */
+        return(tcp_addr_data->peer);
+    }
+    strcpy(tmp_peer, peerent->h_name);
+    if(tcp_addr_data->peer)
+    {
+        free(tcp_addr_data->peer);
+    }
+    tcp_addr_data->peer = tmp_peer;
+    tcp_addr_data->peer_type = BMI_TCP_PEER_HOSTNAME;
+    return(tcp_addr_data->peer);
+
 #endif
+
 }
 
 /* tcp_forget_addr()
@@ -1471,6 +1499,8 @@ static void dealloc_tcp_method_addr(meth
 
     if (tcp_addr_data->hostname)
 	free(tcp_addr_data->hostname);
+    if (tcp_addr_data->peer)
+        free(tcp_addr_data->peer);
 
     dealloc_method_addr(map);
 
@@ -2355,8 +2385,9 @@ static int handle_new_connection(method_
     int accepted_socket = -1;
     method_addr_p new_addr = NULL;
     int ret = -1;
+    char* tmp_peer;
 
-    ret = tcp_accept_init(&accepted_socket);
+    ret = tcp_accept_init(&accepted_socket, &tmp_peer);
     if (ret < 0)
     {
 	return (ret);
@@ -2381,6 +2412,9 @@ static int handle_new_connection(method_
 		  accepted_socket);
     tcp_addr_data = new_addr->method_data;
     tcp_addr_data->socket = accepted_socket;
+    tcp_addr_data->peer = tmp_peer;
+    tcp_addr_data->peer_type = BMI_TCP_PEER_IP;
+
     /* set a flag to make sure that we never try to reconnect this address
      * in the future
      */
@@ -2898,12 +2932,15 @@ static int tcp_do_work_error(method_addr
  *
  * returns 0 on success, -errno on failure.
  */
-static int tcp_accept_init(int *socket)
+static int tcp_accept_init(int *socket, char** peer)
 {
 
     int ret = -1;
     int tmp_errno = 0;
     struct tcp_addr *tcp_addr_data = tcp_method_params.listen_addr->method_data;
+    struct sockaddr_in peer_sockaddr;
+    int peer_sockaddr_size = sizeof(struct sockaddr_in);
+    char* tmp_peer;
 
     /* do we have a socket on this end yet? */
     if (tcp_addr_data->socket < 0)
@@ -2915,7 +2952,8 @@ static int tcp_accept_init(int *socket)
 	}
     }
 
-    *socket = accept(tcp_addr_data->socket, NULL, 0);
+    *socket = accept(tcp_addr_data->socket, (struct sockaddr*)&peer_sockaddr,
+              &peer_sockaddr_size);
 
     if (*socket < 0)
     {
@@ -2947,6 +2985,17 @@ static int tcp_accept_init(int *socket)
 	close(*socket);
 	return (bmi_tcp_errno_to_pvfs(-tmp_errno));
     }
+
+    /* allocate ip address string */
+    tmp_peer = inet_ntoa(peer_sockaddr.sin_addr);
+    *peer = (char*)malloc(strlen(tmp_peer)+1);
+    if(!(*peer))
+    {
+        close(*socket);
+        return(-BMI_ENOMEM);
+    }
+    strcpy(*peer, tmp_peer);
+
     return (0);
 }
 



More information about the PVFS2-CVS mailing list