From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 21 Mar 2007 20:12:59 -0000 Subject: [Cluster-devel] conga luci/conga_ssl/conga_ssl_lib.cpp ricci/c ... Message-ID: <20070321201259.7763.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: conga Changes by: rmccabe at sourceware.org 2007-03-21 20:12:58 Modified files: luci/conga_ssl : conga_ssl_lib.cpp ricci/common : ClientSocket.cpp Socket.cpp Time.cpp ricci/include : Socket.h ricci/ricci : Ricci.cpp Log message: - Make the socket connection in the python SSL bindings non-blocking - This fixes a bug that could hang the luci server for around 5 minutes at a time - Use gethostbyname_r instead of gethostbyname Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/conga_ssl_lib.cpp.diff?cvsroot=cluster&r1=1.2&r2=1.3 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/ClientSocket.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Socket.cpp.diff?cvsroot=cluster&r1=1.3&r2=1.4 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Time.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/include/Socket.h.diff?cvsroot=cluster&r1=1.3&r2=1.4 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/ricci/Ricci.cpp.diff?cvsroot=cluster&r1=1.22&r2=1.23 --- conga/luci/conga_ssl/conga_ssl_lib.cpp 2006/12/21 21:32:00 1.2 +++ conga/luci/conga_ssl/conga_ssl_lib.cpp 2007/03/21 20:12:57 1.3 @@ -133,7 +133,7 @@ counting_auto_ptr ss; { PythonThreadsAllower all; - ClientSocket sock(hostname, port); + ClientSocket sock(hostname, port, timeout * 1000); ss = counting_auto_ptr(new SSLClient(sock)); ss->connect(timeout * 1000); } --- conga/ricci/common/ClientSocket.cpp 2006/08/10 22:53:07 1.4 +++ conga/ricci/common/ClientSocket.cpp 2007/03/21 20:12:58 1.5 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2005 + Copyright Red Hat, Inc. 2005-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 @@ -66,6 +66,47 @@ // log(msg, LogSocket); } +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): socket() failed"); + + nonblocking(true); + + char hostbuf[2048]; + 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"); + + 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) + throw String("ClientSocket(hostname, port): connect() failed"); + bool can_read, can_write; + poll(can_read, can_write, timeout_ms); + if (can_write && !can_read) { + _addr = addr_in.sin_addr.s_addr; + return; + } + } + throw String("ClientSocket(hostname, port): connect() failed"); +} + ClientSocket::ClientSocket(const String& hostname, unsigned short port) : Socket(-1) { @@ -73,7 +114,16 @@ if (_sock == -1) throw String("ClientSocket(hostname, port): socket() failed"); - struct hostent* ent = gethostbyname2(hostname.c_str(), AF_INET); + char hostbuf[2048]; + 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)) + throw String("ClientSocket(hostname, port): gethostbyname() failed"); + if (!ent) throw String("ClientSocket(hostname, port): gethostbyname() failed"); @@ -118,7 +168,16 @@ bool ClientSocket::connected_to(const String& hostname) { - struct hostent* ent = gethostbyname2(hostname.c_str(), AF_INET); + char hostbuf[2048]; + 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)) + return false; + if (!ent) return false; --- conga/ricci/common/Socket.cpp 2006/08/10 22:53:07 1.3 +++ conga/ricci/common/Socket.cpp 2007/03/21 20:12:58 1.4 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2005 + Copyright Red Hat, Inc. 2005-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 @@ -189,7 +189,16 @@ { char buff[INET_ADDRSTRLEN+1]; std::vector addrs; - struct hostent* ent = gethostbyname2(hostname.c_str(), AF_INET); + char hostbuf[2048]; + struct hostent hostent_result; + struct hostent *ent; + int ret; + + if (gethostbyname2_r(hostname.c_str(), AF_INET, &hostent_result, + hostbuf, sizeof(hostbuf), + &ent, &ret)) + return addrs; + if (!ent) return addrs; char** addrs_b = ent->h_addr_list; --- conga/ricci/common/Time.cpp 2006/08/10 22:53:07 1.4 +++ conga/ricci/common/Time.cpp 2007/03/21 20:12:58 1.5 @@ -1,5 +1,5 @@ /* - Copyright Red Hat, Inc. 2005 + Copyright Red Hat, Inc. 2005-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 @@ -31,8 +31,7 @@ time_sec() { struct timeval t; - struct timezone z; - gettimeofday(&t, &z); + gettimeofday(&t, NULL); return t.tv_sec; } @@ -40,8 +39,7 @@ time_mil() { struct timeval t; - struct timezone z; - gettimeofday(&t, &z); + gettimeofday(&t, NULL); return t.tv_sec*1000 + t.tv_usec/1000; } --- conga/ricci/include/Socket.h 2006/08/10 22:53:07 1.3 +++ conga/ricci/include/Socket.h 2007/03/21 20:12:58 1.4 @@ -74,6 +74,7 @@ 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 ClientSocket&); ClientSocket& operator= (const ClientSocket&); virtual ~ClientSocket(); --- conga/ricci/ricci/Ricci.cpp 2007/01/04 00:19:49 1.22 +++ conga/ricci/ricci/Ricci.cpp 2007/03/21 20:12:58 1.23 @@ -466,11 +466,18 @@ char name[1024]; if (gethostname(name, sizeof(name))) return ""; - struct hostent *ent = gethostbyname(name); - if (ent) - return String(ent->h_name); - else + + char hostbuf[2048]; + 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