[Cluster-devel] conga luci/conga_ssl/setup.py ricci/common/Cli ...

kupcevic at sourceware.org kupcevic at sourceware.org
Fri Mar 23 17:25:15 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	kupcevic at sourceware.org	2007-03-23 17:25:13

Modified files:
	luci/conga_ssl : setup.py 
	ricci/common   : ClientSocket.cpp Makefile Socket.cpp 
	ricci/include  : Socket.h 
	ricci/modules/cluster/clumon/src/daemon: Monitor.cpp Monitor.h 
	ricci/ricci    : Ricci.cpp 
Added files:
	ricci/common   : Network.cpp 
	ricci/include  : Network.h 

Log message:
	Reorganize socket-handling code

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/setup.py.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Network.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/ClientSocket.cpp.diff?cvsroot=cluster&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Makefile.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Socket.cpp.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/include/Network.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/include/Socket.h.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp.diff?cvsroot=cluster&r1=1.13&r2=1.14
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/daemon/Monitor.h.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/ricci/Ricci.cpp.diff?cvsroot=cluster&r1=1.24&r2=1.25

--- conga/luci/conga_ssl/setup.py	2006/12/06 22:34:09	1.1
+++ conga/luci/conga_ssl/setup.py	2007/03/23 17:25:12	1.2
@@ -13,6 +13,7 @@
                                'SSLClient.cpp', 
                                '../../ricci/common/ClientSocket.cpp', 
                                '../../ricci/common/Socket.cpp', 
+                               '../../ricci/common/Network.cpp', 
                                '../../ricci/common/Logger.cpp', 
                                '../../ricci/common/Time.cpp', 
                                '../../ricci/common/File.cpp', 
/cvs/cluster/conga/ricci/common/Network.cpp,v  -->  standard output
revision 1.1
--- conga/ricci/common/Network.cpp
+++ -	2007-03-23 17:25:14.652053000 +0000
@@ -0,0 +1,84 @@
+/*
+  Copyright Red Hat, Inc. 2007
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by the
+  Free Software Foundation; either version 2, or (at your option) any
+  later version.
+
+  This program is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; see the file COPYING.  If not, write to the
+  Free Software Foundation, Inc.,  675 Mass Ave, Cambridge, 
+  MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#include "Network.h"
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
+
+
+counting_auto_ptr<Network::Hostent> 
+Network::getHostByName(const String& hostname)
+{
+  counting_auto_ptr<Hostent> ent_d(new Hostent());
+  struct hostent *ent = 0;
+  int error;
+  gethostbyname2_r(hostname.c_str(), AF_INET, 
+		   &(ent_d->ent), 
+		   ent_d->data, sizeof(ent_d->data), 
+		   &ent, 
+		   &error);
+  if (ent == &(ent_d->ent))
+    return ent_d;
+  throw String("unable to resolve ") + hostname;
+}
+
+
+std::vector<String>
+Network::name2IP(const String& hostname)
+{
+  std::vector<String> addrs;
+  try {
+    char buff[INET_ADDRSTRLEN+1];
+    counting_auto_ptr<Hostent> hent = getHostByName(hostname);
+    char** addrs_b = (*hent)->h_addr_list;
+    for (int i=0; addrs_b[i]; i++) {
+      struct in_addr addr;
+      addr.s_addr = *((u_int32_t*) addrs_b[i]);
+      if (inet_ntop(AF_INET, &addr, buff, sizeof(buff)))
+	addrs.push_back(buff);
+    }
+  } catch ( ... ) {}
+  return addrs;
+}
+
+
+String
+Network::localhost()
+{
+  // get hostname
+  char name[1024];
+  if (gethostname(name, sizeof(name)-1))
+    return "";
+  name[sizeof(name)-1] = '\0';
+  
+  try {
+    // get fqdn
+    counting_auto_ptr<Hostent> ent = getHostByName(name);
+    return String((*ent)->h_name);
+  } catch ( ... ) {
+    return name;
+  }
+}
--- conga/ricci/common/ClientSocket.cpp	2007/03/21 22:51:20	1.6
+++ conga/ricci/common/ClientSocket.cpp	2007/03/23 17:25:12	1.7
@@ -23,7 +23,7 @@
 
 #include "Socket.h"
 #include "Logger.h"
-#include "Time.h"
+#include "Network.h"
 
 #include <unistd.h>
 #include <errno.h>
@@ -39,7 +39,7 @@
   Socket(-1)
 {}
 
-ClientSocket::ClientSocket(int sock, unsigned int addr) :
+ClientSocket::ClientSocket(int sock, u_int32_t addr) :
   Socket(sock),
   _addr(addr)
 {}
@@ -67,95 +67,57 @@
   //  log(msg, LogSocket);
 }
 
-ClientSocket::ClientSocket(const String& hostname,
-                           unsigned short port,
-                           unsigned int timeout_ms) :
+ClientSocket::ClientSocket(const String& hostname, 
+			   unsigned short port, 
+			   unsigned int timeout_ms) :
   Socket(-1)
 {
   _sock = socket(PF_INET, SOCK_STREAM, 0);
   if (_sock == -1)
     throw String("ClientSocket(hostname, port, timeout): socket() failed");
   
-  nonblocking(true);
-
-  char hostbuf[4096];
-  struct hostent hostent_result;
-  struct hostent *ent = NULL;
-  int ret = 0;
-
-  if (gethostbyname2_r(hostname.c_str(), AF_INET, &hostent_result,
-                       hostbuf, sizeof(hostbuf),
-                       &ent, &ret) || !ent)
-    throw String("ClientSocket(hostname, port, timeout): gethostbyname() failed");
+  if (timeout_ms)
+    nonblocking(true);
   
-  char** addrs = ent->h_addr_list;
-  for (int i=0; addrs[i]; i++) {
-    struct sockaddr_in addr_in;
-    addr_in.sin_family = AF_INET;
-    addr_in.sin_port = htons(port);
-    addr_in.sin_addr.s_addr = *((u_int32_t*) addrs[i]);
-
-    ret = connect(_sock, (struct sockaddr*) &addr_in, sizeof(addr_in));
-    if (ret != -1 || errno != EINPROGRESS)
-      continue;
-
-    unsigned int end = time_mil() + timeout_ms;
-    do {
-      bool can_read = false;
-      bool can_write = true;
-      poll(can_read, can_write, timeout_ms);
-      if (can_write && can_read) {
-        /* an error occurred */
-        throw String("ClientSocket(hostname, port, timeout): connect() failed");
-      }
-
-      if (can_write && !can_read) {
-        _addr = addr_in.sin_addr.s_addr;
-        return;
-      }
-
-    } while (time_mil() < end);
-
-    throw String("ClientSocket(hostname, port, timeout): connect() timed out");
-  }
-
-  throw String("ClientSocket(hostname, port, timeout): connect() failed");
-}
-
-ClientSocket::ClientSocket(const String& hostname, unsigned short port) :
-  Socket(-1)
-{
-  _sock = socket(PF_INET, SOCK_STREAM, 0);
-  if (_sock == -1)
-    throw String("ClientSocket(hostname, port): socket() failed");
-  
-  char hostbuf[4096];
-  struct hostent hostent_result;
-  struct hostent *ent = NULL;
-  int ret = 0;
-
-  if (gethostbyname2_r(hostname.c_str(), AF_INET, &hostent_result,
-                       hostbuf, sizeof(hostbuf),
-                       &ent, &ret) || !ent)
-    throw String("ClientSocket(hostname, port): gethostbyname() failed");
+  counting_auto_ptr<Network::Hostent> ent = Network::getHostByName(hostname);
   
-  char** addrs = ent->h_addr_list;
+  char** addrs = (*ent)->h_addr_list;
   for (int i=0; addrs[i]; i++) {
     struct sockaddr_in addr_in;
     addr_in.sin_family = AF_INET;
     addr_in.sin_port = htons(port);
     addr_in.sin_addr.s_addr = *((u_int32_t*) addrs[i]);
-    if (connect(_sock, (struct sockaddr*) &addr_in, sizeof(addr_in)))
-      continue;
-    else {
-      //      String msg = String("created client socket ") + _sock;
-      //      msg += ", and connected to " + hostname + ", port " + port;
-      //      log(msg, LogSocket);
+    
+    if (connect(_sock, (struct sockaddr*) &addr_in, sizeof(addr_in)) == 0) {
+      // connected
+      nonblocking(false);
       _addr = addr_in.sin_addr.s_addr;
       return;
     }
+    
+    // connect() error
+    if (errno != EINPROGRESS)
+      continue;
+    bool can_read=false, can_write=true;
+    poll(can_read, can_write, timeout_ms);
+    if (can_write == false) {
+      // connect() not completed
+      throw String("ClientSocket(hostname, port, timeout): connect() timed out");
+    }
+    // connect() completed, check successfulness
+    int err = 1;
+    socklen_t err_size = sizeof(err);
+    getsockopt(_sock, SOL_SOCKET, SO_ERROR,
+	       &err, &err_size);
+    if (err)
+      continue;
+    
+    // connected
+    nonblocking(false);
+    _addr = addr_in.sin_addr.s_addr;
+    return;
   }
-  throw String("ClientSocket(hostname, port): connect() failed");
+  throw String("ClientSocket(hostname, port, timeout): connect() failed");
 }
 
 ClientSocket::ClientSocket(const ClientSocket& s) :
@@ -180,20 +142,13 @@
 bool 
 ClientSocket::connected_to(const String& hostname)
 {
-  char hostbuf[4096];
-  struct hostent hostent_result;
-  struct hostent *ent = NULL;
-  int ret = 0;
-
-  if (gethostbyname2_r(hostname.c_str(), AF_INET, &hostent_result,
-                       hostbuf, sizeof(hostbuf),
-                       &ent, &ret) || !ent)
-    return false;
-  
-  char** addrs = ent->h_addr_list;
-  for (int i=0; addrs[i]; i++)
-    if (*((u_int32_t*) addrs[i]) == _addr)
-      return true;
+  try {
+    counting_auto_ptr<Network::Hostent> ent = Network::getHostByName(hostname);
+    char** addrs = (*ent)->h_addr_list;
+    for (int i=0; addrs[i]; i++)
+      if (*((u_int32_t*) addrs[i]) == _addr)
+        return true;
+  } catch ( ... ) {}
   return false;
 }
 
@@ -221,10 +176,23 @@
     
     //    log(String("received ") + ret + " bytes from socket " + _sock, 
     //	LogLevel(LogSocket|LogTransfer));
-    return String(buffer, ret);
+    String data(buffer, ret);
+    shred(buffer, ret);
+    return data;
   }
 }
 
+String
+ClientSocket::recv(int timeout)
+{
+  bool in=true, out=false;
+  poll(in, out, timeout);
+  if (in)
+    return recv();
+  else
+    return "";
+}
+
 String 
 ClientSocket::send(const String& msg)
 {
@@ -239,7 +207,7 @@
       else if (errno == EAGAIN ||
 	       errno == EWOULDBLOCK)
 	return msg;
-      throw String("ClientSocket::recv(): socket error");
+      throw String("ClientSocket::send(): socket error");
     }
     
     //    log(String("sent ") + ret + " bytes thru socket " + _sock, 
@@ -248,6 +216,17 @@
   }
 }
 
+String
+ClientSocket::send(const String& msg, int timeout)
+{
+  bool in=false, out=true;
+  poll(in, out, timeout);
+  if (out)
+    return send(msg);
+  else
+    return msg;
+}
+
 void 
 ClientSocket::ready(bool& recv, bool& send, int timeout)
 {
--- conga/ricci/common/Makefile	2006/10/23 18:43:35	1.7
+++ conga/ricci/common/Makefile	2007/03/23 17:25:12	1.8
@@ -24,10 +24,11 @@
 	utils.o \
 	File.o \
 	XML.o \
+	Network.o \
 	Socket.o \
 	ServerSocket.o \
-	Logger.o \
 	ClientSocket.o \
+	Logger.o \
 	Variable.o \
 	Random.o \
 	daemon_init.o \
--- conga/ricci/common/Socket.cpp	2007/03/21 22:51:20	1.5
+++ conga/ricci/common/Socket.cpp	2007/03/23 17:25:12	1.6
@@ -181,30 +181,3 @@
     }
   }
 }
-
-
-
-std::vector<String>
-name2IP(const String& hostname)
-{
-  char buff[INET_ADDRSTRLEN+1];
-  std::vector<String> addrs;
-  char hostbuf[4096];
-  struct hostent hostent_result;
-  struct hostent *ent;
-  int ret;
-
-  if (gethostbyname2_r(hostname.c_str(), AF_INET, &hostent_result,
-                       hostbuf, sizeof(hostbuf),
-                       &ent, &ret) || !ent)
-    return addrs;
-
-  char** addrs_b = ent->h_addr_list;
-  for (int i=0; addrs_b[i]; i++) {
-    struct in_addr addr;
-    addr.s_addr = *((u_int32_t*) addrs_b[i]);
-    if (inet_ntop(AF_INET, &addr, buff, sizeof(buff)))
-      addrs.push_back(buff);
-  }
-  return addrs;
-}
/cvs/cluster/conga/ricci/include/Network.h,v  -->  standard output
revision 1.1
--- conga/ricci/include/Network.h
+++ -	2007-03-23 17:25:15.061289000 +0000
@@ -0,0 +1,54 @@
+/*
+  Copyright Red Hat, Inc. 2007
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by the
+  Free Software Foundation; either version 2, or (at your option) any
+  later version.
+
+  This program is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; see the file COPYING.  If not, write to the
+  Free Software Foundation, Inc.,  675 Mass Ave, Cambridge, 
+  MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#ifndef Conga_Network_h
+#define Conga_Network_h
+
+#include "counting_auto_ptr.h"
+#include "String.h"
+#include <vector>
+
+#include <netdb.h>
+
+
+class Network
+{
+ public:
+  static std::vector<String> name2IP(const String& hostname);
+  static String localhost();
+  
+  
+  class Hostent
+  {
+   public:
+    struct hostent ent;
+    char data[4*1024 - sizeof(struct hostent)];
+    struct hostent* operator->() { return &ent; }
+    struct hostent& operator*() { return ent; }
+  };
+  static counting_auto_ptr<Hostent> getHostByName(const String& hostname);
+  
+};
+
+
+#endif  // Conga_Network_h
--- conga/ricci/include/Socket.h	2007/03/21 20:12:58	1.4
+++ conga/ricci/include/Socket.h	2007/03/23 17:25:13	1.5
@@ -34,14 +34,11 @@
 // provide external locking
 
 
-std::vector<String> name2IP(const String& hostname);
-
-
 class Socket
 {
  public:
   Socket(const Socket&);
-  Socket& operator= (const Socket&);
+  virtual Socket& operator= (const Socket&);
   virtual ~Socket();
   
   virtual bool operator== (const Socket&);
@@ -73,25 +70,29 @@
  public:
   ClientSocket();
   ClientSocket(const String& sock_path);  // UNIX socket
-  ClientSocket(const String& hostname, unsigned short port);  // TCP socket
-  ClientSocket(const String& hostname, unsigned short port, unsigned int to_ms);
+  ClientSocket(const String& hostname, unsigned short port,
+	       unsigned int timeout_ms=0  /*  0 - standard blocking behavior
+					     >0 - timeout
+					  */ );  // TCP socket
   ClientSocket(const ClientSocket&);
-  ClientSocket& operator= (const ClientSocket&);
+  virtual ClientSocket& operator= (const ClientSocket&);
   virtual ~ClientSocket();
   
-  String recv();
-  String send(const String& msg);  // return what is left to send
+  virtual String recv();
+  virtual String recv(int timeout);
+  virtual String send(const String& msg);  // return what is left to send
+  virtual String send(const String& msg, int timeout);
   
-  void ready(bool& recv, bool& send, int timeout);
+  virtual void ready(bool& recv, bool& send, int timeout);
   
   virtual bool server() { return false; }
   
   virtual bool connected_to(const String& hostname);
   
  protected:
-  unsigned int _addr;
+  u_int32_t _addr;  // address in network byte order 
   
-  ClientSocket(int sock, unsigned int addr=0);  // takes ownership of sock
+  ClientSocket(int sock, u_int32_t addr=0);  // takes ownership of sock
   friend class ServerSocket;
 };  // ClientSocket
 
@@ -102,12 +103,12 @@
   ServerSocket(const String& sock_path); // UNIX socket
   ServerSocket(unsigned short port); // TCP socket
   ServerSocket(const ServerSocket&);
-  ServerSocket& operator= (const ServerSocket&);
+  virtual ServerSocket& operator= (const ServerSocket&);
   virtual ~ServerSocket();
   
   ClientSocket accept();
   
-  bool ready(int timeout);
+  virtual bool ready(int timeout);
   
   virtual bool server() { return true; }
   
--- conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp	2006/12/13 19:14:54	1.13
+++ conga/ricci/modules/cluster/clumon/src/daemon/Monitor.cpp	2007/03/23 17:25:13	1.14
@@ -26,6 +26,7 @@
 #include "Logger.h"
 #include "Time.h"
 #include "utils.h"
+#include "Network.h"
 
 #include <sys/poll.h>
 #include <sys/sysinfo.h>
@@ -584,7 +585,7 @@
        iter != nodenames.end();
        iter++) {
     const String& nodename = *iter;
-    vector<String> ips = name2IP(nodename);
+    vector<String> ips = Network::name2IP(nodename);
     for (vector<String>::iterator iter_ip = ips.begin();
 	 iter_ip != ips.end();
 	 iter_ip++) {
--- conga/ricci/modules/cluster/clumon/src/daemon/Monitor.h	2006/10/13 09:36:16	1.5
+++ conga/ricci/modules/cluster/clumon/src/daemon/Monitor.h	2007/03/23 17:25:13	1.6
@@ -49,7 +49,7 @@
 			   const String& msg);
   
  protected:
-  void run();
+  virtual void run();
  private:
   
   Mutex _mutex; // _cluster and _cache
--- conga/ricci/ricci/Ricci.cpp	2007/03/21 22:51:21	1.24
+++ conga/ricci/ricci/Ricci.cpp	2007/03/23 17:25:13	1.25
@@ -31,13 +31,13 @@
 #include "Time.h"
 #include "XML_tags.h"
 #include "File.h"
+#include "Network.h"
 
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <errno.h>
 #include <dirent.h>
-#include <netdb.h>
 
 
 #include <fstream>
@@ -45,7 +45,6 @@
 
 
 static bool dom0();
-static String hostname();
 static pair<String, String> clusterinfo();
 static String os_release();
 
@@ -71,7 +70,7 @@
     header.set_attr("authenticated", "false");
   
   if (full) {
-    String name = hostname();
+    String name = Network::localhost();
     if (name.size())
       header.set_attr("hostname", name);
     
@@ -459,27 +458,6 @@
 
 
 
-
-String 
-hostname()
-{
-  char name[1024];
-  if (gethostname(name, sizeof(name)))
-    return "";
-
-  char hostbuf[4096];
-  struct hostent hostent_result;
-  struct hostent *ent = NULL;
-  int ret = 0;
-
-  if (gethostbyname_r(name, &hostent_result,
-                      hostbuf, sizeof(hostbuf),
-                      &ent, &ret) || !ent)
-    return name;
-
-  return String(ent->h_name);
-}
-
 pair<String, String> 
 clusterinfo()
 {




More information about the Cluster-devel mailing list