[Cluster-devel] conga/ricci common/ClientSocket.cpp common/Log ...

rmccabe at sourceware.org rmccabe at sourceware.org
Tue Sep 11 00:26:54 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe at sourceware.org	2007-09-11 00:26:52

Modified files:
	ricci/common   : ClientSocket.cpp Logger.cpp Module.cpp 
	                 sys_util.c 
	ricci/include  : Logger.h 
	ricci/modules/cluster: Virt.cpp 
	ricci/modules/cluster/clumon/src/common: ClusterMonitor.cpp 
	ricci/ricci    : Makefile Ricci.cpp RicciWorker.cpp 
	                 SSLInstance.cpp 

Log message:
	Cleanup and refactor some of the network and file io

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/ClientSocket.cpp.diff?cvsroot=cluster&r1=1.9&r2=1.10
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Logger.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/Module.cpp.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/common/sys_util.c.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/include/Logger.h.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/Virt.cpp.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/common/ClusterMonitor.cpp.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/ricci/Makefile.diff?cvsroot=cluster&r1=1.22&r2=1.23
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/ricci/Ricci.cpp.diff?cvsroot=cluster&r1=1.27&r2=1.28
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/ricci/RicciWorker.cpp.diff?cvsroot=cluster&r1=1.13&r2=1.14
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/ricci/SSLInstance.cpp.diff?cvsroot=cluster&r1=1.10&r2=1.11

--- conga/ricci/common/ClientSocket.cpp	2007/08/30 22:50:13	1.9
+++ conga/ricci/common/ClientSocket.cpp	2007/09/11 00:26:52	1.10
@@ -34,6 +34,9 @@
 #include <String.h>
 #include <netdb.h>
 
+extern "C" {
+	#include "sys_util.h"
+}
 
 ClientSocket::ClientSocket() :
 	Socket(-1)
@@ -169,29 +172,27 @@
 	if (_sock == -1)
 		throw String("ClientSocket::recv(): socket already closed");
 
-	while (true) {
-		char buffer[4096];
-		int ret = ::recv(_sock, buffer, sizeof(buffer), 0);
-		if (ret == -1) {
-			if (errno == EINTR)
-				continue;
-			else if (errno == EAGAIN)
-				return "";
-			throw String("ClientSocket::recv(): recv error: ")
-					+ String(strerror(errno));
-		}
-
-		if (ret == 0) {
-			close();
-			throw String("ClientSocket::recv(): socket has been shutdown");
-		}
+	char buffer[4096];
+	int ret;
 
-		//log(String("received ") + ret + " bytes from socket " + _sock,
-		//LogLevel(LogSocket|LogTransfer));
-		String data(buffer, ret);
-		shred(buffer, ret);
-		return data;
-	}
+	ret = read_restart(_sock, buffer, sizeof(buffer));
+	if (ret < 0) {
+		if (ret == -EAGAIN)
+			return "";
+		throw String("ClientSocket::recv(): recv error: ")
+				+ String(strerror(-ret));
+	}
+
+	if (ret == 0) {
+		close();
+		throw String("ClientSocket::recv(): socket has been shutdown");
+	}
+
+	//log(String("received ") + ret + " bytes from socket " + _sock,
+	//LogLevel(LogSocket|LogTransfer));
+	String data(buffer, ret);
+	memset(buffer, 0, ret);
+	return data;
 }
 
 String
@@ -212,21 +213,17 @@
 	if (_sock == -1)
 		throw String("ClientSocket::send(): socket already closed");
 
-	while (true) {
-		int ret = ::send(_sock, msg.c_str(), msg.size(), 0);
-		if (ret == -1) {
-			if (errno == EINTR)
-				continue;
-			else if (errno == EAGAIN || errno == EWOULDBLOCK)
-				return msg;
-			throw String("ClientSocket::send(): socket error: ")
-					+ String(strerror(errno));
-		}
-
-		//log(String("sent ") + ret + " bytes thru socket " + _sock,
-		//LogLevel(LogSocket|LogTransfer));
-		return msg.substr(ret);
+	int ret = write_restart(_sock, msg.c_str(), msg.size());
+	if (ret < 0) {
+		if (ret == -EAGAIN || ret == -EWOULDBLOCK)
+			return msg;
+		throw String("ClientSocket::send(): socket error: ")
+				+ String(strerror(-ret));
 	}
+
+	//log(String("sent ") + ret + " bytes thru socket " + _sock,
+	//LogLevel(LogSocket|LogTransfer));
+	return msg.substr(ret);
 }
 
 String
--- conga/ricci/common/Logger.cpp	2007/09/07 19:07:21	1.4
+++ conga/ricci/common/Logger.cpp	2007/09/11 00:26:52	1.5
@@ -22,16 +22,20 @@
 
 
 #include "Logger.h"
-#include "Time.h"
 
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
 #include <unistd.h>
-#include <errno.h>
 #include <stdlib.h>
-#include "String.h"
+#include <time.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 
+extern "C" { 
+	#include "sys_util.h"
+}
+
+#include "String.h"
 
 using namespace std;
 
@@ -98,49 +102,48 @@
 	free(_domain_c);
 }
 
-void
+ssize_t
 Logger::log(const String& msg, LogLevel level)
 {
-	log_sigsafe(msg.c_str(), level);
+	return log_sigsafe(msg.c_str(), level);
 }
 
-void
+ssize_t
 Logger::log_sigsafe(const char *msg, LogLevel level)
 {
 	if (_fd > 0 && (_level & level)) {
-		char time[64];
-		time_t t = time_sec();
+		char cur_time[64];
+		time_t t = time(NULL);
+		char buf[4096];
 		char *p;
 		int ret;
+		size_t buflen;
 
-		ctime_r(&t, time);
-		time[sizeof(time) - 1] = '\0';
+		ctime_r(&t, cur_time);
+		cur_time[sizeof(cur_time) - 1] = '\0';
 
-		p = strchr(time, '\n');
+		p = strchr(cur_time, '\n');
 		if (p != NULL)
 			*p = '\0';		
 
-		char m[4096] = { 0, };
-		if (_fd > 2 && _domain_c != NULL)
-			ret = snprintf(m, sizeof(m), "%s %s: %s\n", time, _domain_c, msg);
-		else
-			ret = snprintf(m, sizeof(m), "%s: %s\n", time, msg);
-
-		if (ret < 0 || (size_t) ret >= sizeof(m)) {
-			m[sizeof(m) - 1] = '\0';
-			ret = strlen(m);
-		}
-
-		while (ret > 0) {
-			ssize_t w = write(_fd, m, ret);
-			if (w < 0) {
-				if (errno == EINTR)
-					continue;
-				break;
-			}
-			ret -= w;
+		if (_fd > 2 && _domain_c != NULL) {
+			ret = snprintf(buf, sizeof(buf), "%s %s: %s\n",
+					cur_time, _domain_c, msg);
+		} else
+			ret = snprintf(buf, sizeof(buf), "%s: %s\n", cur_time, msg);
+
+		if (ret < 0)
+			return -ENOMEM;
+		buflen = (size_t) ret;
+
+		if (buflen >= sizeof(buf)) {
+			buf[sizeof(buf) - 1] = '\0';
+			buflen = strlen(buf);
 		}
+		return write_restart(_fd, buf, buflen);
 	}
+
+	return 0;
 }
 
 
@@ -162,16 +165,16 @@
 	return String(buff) + s;
 }
 
-void
+ssize_t
 log(const String& msg, LogLevel level)
 {
-	logger->log(msg, level);
+	return logger->log(msg, level);
 }
 
-void
+ssize_t
 log_sigsafe(const char *msg, LogLevel level)
 {
-	logger->log_sigsafe(msg, level);
+	return logger->log_sigsafe(msg, level);
 }
 
 void
--- conga/ricci/common/Module.cpp	2007/08/31 04:57:37	1.7
+++ conga/ricci/common/Module.cpp	2007/09/11 00:26:52	1.8
@@ -31,6 +31,11 @@
 #include <sys/poll.h>
 #include <errno.h>
 #include <unistd.h>
+
+extern "C" {
+	#include "sys_util.h"
+}
+
 typedef struct pollfd poll_fd;
 
 #include <iostream>
@@ -223,7 +228,7 @@
 		}
 	}
 
-	int old_err;
+	int old_err = -1;
 	if (!display_err) {
 		// redirect stderr to /dev/null
 		old_err = dup(2);
@@ -290,16 +295,13 @@
 			char buff[4096];
 			int ret;
 
-			ret = read(poll_data.fd, buff, sizeof(buff));
-			if (ret == -1) {
-				if (errno == EINTR)
-					continue;
-				throw String("error reading stdin: ") + String(strerror(errno));
-			}
+			ret = read_restart(poll_data.fd, buff, sizeof(buff));
+			if (ret < 0)
+				throw String("error reading stdin: ") + String(strerror(-ret));
 
 			if (ret > 0) {
 				data.append(buff, ret);
-				shred(buff, sizeof(buff));
+				memset(buff, 0, sizeof(buff));
 			}
 
 			if ((size_t) ret < sizeof(buff)) {
@@ -315,9 +317,8 @@
 
 		if (poll_data.revents & (POLLERR | POLLHUP | POLLNVAL))
 			throw String("stdin error: ") + String(strerror(errno));
-	} // while
+	}
 
-	// cout << data << endl;
 	throw String("invalid input");
 }
 
--- conga/ricci/common/sys_util.c	2007/09/09 18:20:00	1.1
+++ conga/ricci/common/sys_util.c	2007/09/11 00:26:52	1.2
@@ -34,12 +34,15 @@
 	while (len > 0) {
 		size_t ret = read(fd, buf, len);
 		if (ret < 0) {
-			if (errno == EINTR || errno == EAGAIN)
+			if (errno == EINTR)
 				continue;
+			if (errno == EAGAIN)
+				break;
 			return -errno;
 		}
+
 		if (ret == 0)
-			return -EPIPE;
+			break;
 
 		buf += ret;
 		len -= (size_t) ret;
@@ -53,12 +56,15 @@
 	while (len > 0) {
 		size_t ret = write(fd, buf, len);
 		if (ret < 0) {
-			if (errno == EINTR || errno == EAGAIN)
+			if (errno == EINTR)
 				continue;
+			if (errno == EAGAIN)
+				break;
 			return -errno;
 		}
+
 		if (ret == 0)
-			return -EPIPE;
+			break;
 
 		buf += ret;
 		len -= (size_t) ret;
--- conga/ricci/include/Logger.h	2007/08/31 13:32:36	1.3
+++ conga/ricci/include/Logger.h	2007/09/11 00:26:52	1.4
@@ -49,8 +49,8 @@
 		Logger(int fd, const String& domain, LogLevel level);
 		virtual ~Logger();
 
-		void log(const String& msg, LogLevel level=LogBasic);
-		void log_sigsafe(const char* msg, LogLevel level=LogBasic);
+		ssize_t log(const String& msg, LogLevel level=LogBasic);
+		ssize_t log_sigsafe(const char* msg, LogLevel level=LogBasic);
 		void operator<< (const String& msg) { log(msg); }
 
 	private:
@@ -67,8 +67,8 @@
 // helper functions
 String operator+ (const String&, int);
 String operator+ (int, const String&);
-void log(const String& msg, LogLevel level=LogBasic);
-void log_sigsafe(const char* msg, LogLevel level=LogBasic);
+ssize_t log(const String& msg, LogLevel level=LogBasic);
+ssize_t log_sigsafe(const char* msg, LogLevel level=LogBasic);
 void set_logger(counting_auto_ptr<Logger>);
 
 #endif
--- conga/ricci/modules/cluster/Virt.cpp	2007/08/23 15:30:27	1.5
+++ conga/ricci/modules/cluster/Virt.cpp	2007/09/11 00:26:52	1.6
@@ -24,6 +24,8 @@
 #include <sys/stat.h>
 #include <string.h>
 #include <errno.h>
+
+#include "sys_util.h"
 #include "base64.h"
 }
 
@@ -59,9 +61,9 @@
 	char *buf = NULL;
 	size_t keylen;
 	size_t keylen_dec = 0;
-	ssize_t ret;
 	bool decoded = false;
 	int fd;
+	ssize_t ret;
 	mode_t old_mask;
 	char tmpname[] = "/etc/cluster/.fence_xvm.keyXXXXXX";
 
@@ -89,14 +91,13 @@
 	umask(old_mask);
 
 	fchmod(fd, 0600);
-	ret = write(fd, buf, keylen_dec);
-	if (ret < 0 || (size_t) ret != keylen_dec) {
-		int err = errno;
+	ret = write_restart(fd, buf, keylen_dec);
+	if (ret < 0) {
 		unlink(tmpname);
 		close(fd);
 		memset(buf, 0, keylen_dec);
 		free(buf);
-		throw String("error setting new key: ") + String(strerror(err));
+		throw String("error setting new key: ") + String(strerror(-ret));
 	}
 
 	close(fd);
@@ -125,22 +126,20 @@
 	if (fd < 0)
 		throw String("error generating key: ") + String(strerror(errno));
 
-	ret = read(fd, buf, keylen);
-	err = errno;
+	ret = read_restart(fd, buf, keylen);
 	close(fd);
-	if ((size_t) ret != keylen)
-		throw String("error generating key: ") + String(strerror(err));
+	if (ret < 0)
+		throw String("error generating key: ") + String(strerror(-ret));
 
 	fd = open(XVM_KEY_PATH, O_WRONLY | O_EXCL | O_CREAT, 0600);
 	if (fd < 0)
 		throw String("error generating key: ") + String(strerror(errno));
 
-	ret = write(fd, buf, keylen);
-	err = errno;
+	ret = write_restart(fd, buf, keylen);
 	close(fd);
-	if ((size_t) ret != keylen) {
+	if (ret < 0) {
 		unlink(XVM_KEY_PATH);
-		throw String("error generating key: ") + String(strerror(err));
+		throw String("error generating key: ") + String(strerror(-ret));
 	}
 	return (true);
 }
@@ -164,12 +163,11 @@
 		throw String("error retrieving key: ") + String(strerror(errno));
 	}
 
-	ret = read(fd, buf, sizeof(buf));
-	err = errno;
+	ret = read_restart(fd, buf, sizeof(buf));
 	close(fd);
 	if (ret < 0 || (off_t) ret != st.st_size) {
 		memset(buf, 0, sizeof(buf));
-		throw String("error retrieving key: ") + String(strerror(err));
+		throw String("error retrieving key: ") + String(strerror(-ret));
 	}
 	keylen_bin = (size_t) ret;
 
--- conga/ricci/modules/cluster/clumon/src/common/ClusterMonitor.cpp	2007/09/04 18:28:40	1.3
+++ conga/ricci/modules/cluster/clumon/src/common/ClusterMonitor.cpp	2007/09/11 00:26:52	1.4
@@ -57,7 +57,9 @@
 			poll_data.revents = 0;
 
 			unsigned int time_start = time_mil();
+
 			int ret = poll(&poll_data, 1, timeout);
+			int err = errno;
 			timeout -= (time_mil() - time_start);
 			if (ret == 0)
 				continue;
@@ -66,7 +68,7 @@
 					continue;
 				else {
 					throw String("get_cluster(): poll() error")
-							+ String(strerror(errno));
+							+ String(strerror(err));
 				}
 			}
 
--- conga/ricci/ricci/Makefile	2007/09/07 19:07:23	1.22
+++ conga/ricci/ricci/Makefile	2007/09/11 00:26:52	1.23
@@ -36,7 +36,7 @@
 
 PARANOID=1
 
-INCLUDE += `pkg-config --cflags dbus-1`
+INCLUDE += `pkg-config --cflags dbus-1` -I../common
 CFLAGS +=
 CXXFLAGS += -DDBUS_MAJOR_VERSION="${dbus_major_version}" -DDBUS_MINOR_VERSION="${dbus_minor_version}" -DPARANOIA=$(PARANOID)
 LDFLAGS += `pkg-config --libs dbus-1`
--- conga/ricci/ricci/Ricci.cpp	2007/09/09 01:06:15	1.27
+++ conga/ricci/ricci/Ricci.cpp	2007/09/11 00:26:52	1.28
@@ -39,6 +39,9 @@
 #include <errno.h>
 #include <dirent.h>
 
+extern "C" {
+	#include "sys_util.h"
+}
 
 #include <fstream>
 using namespace std;
@@ -298,15 +301,10 @@
 	try {
 		// save request
 		String xml_str(generateXML(_report));
-		while (xml_str.size()) {
-			ssize_t ret = write(fd, xml_str.c_str(), xml_str.size());
-			if (ret < 0) {
-				if (errno == EINTR)
-					continue;
-				throw String("unable to write batch request: ")
-						+ String(strerror(errno));
-			}
-			xml_str = xml_str.substr(ret);
+		ssize_t ret = write_restart(fd, xml_str.c_str(), xml_str.size());
+		if (ret < 0) {
+			throw String("unable to write batch request: ")
+					+ String(strerror(-ret));
 		}
 
 		close(fd);
@@ -347,7 +345,7 @@
 			size_t res = fread(buff, 1, sizeof(buff), file);
 			int err = errno;
 			batch.append(buff, res);
-			shred(buff, sizeof(buff));
+			memset(buff, 0, sizeof(buff));
 
 			if (res < sizeof(buff)) {
 				if (ferror(file)) {
--- conga/ricci/ricci/RicciWorker.cpp	2007/08/30 17:08:44	1.13
+++ conga/ricci/ricci/RicciWorker.cpp	2007/09/11 00:26:52	1.14
@@ -35,6 +35,9 @@
 #include <errno.h>
 #include <unistd.h>
 
+extern "C" {
+	#include "sys_util.h"
+}
 
 #include <iostream>
 using namespace std;
@@ -277,19 +280,15 @@
 		// read file
 		String xml_str;
 		char buff[4096];
-		int res;
+		ssize_t res;
 
-		while ((res = read(_fd, buff, sizeof(buff))) != 0) {
-			if (res > 0)
-				xml_str.append(buff, res);
-			else {
-				if (errno != EINTR) {
-					throw String("failure reading batch file: ")
-							+ String(strerror(errno));
-				}
-			}
+		res = read_restart(_fd, buff, sizeof(buff));
+		if (res <= 0) {
+			throw String("error reading batch file: ")
+					+ String(strerror(-res));
 		}
-		shred(buff, sizeof(buff));
+		xml_str.append(buff, res);
+		memset(buff, 0, sizeof(buff));
 
 		// _xml
 		_xml = parseXML(xml_str);
--- conga/ricci/ricci/SSLInstance.cpp	2007/09/09 01:06:15	1.10
+++ conga/ricci/ricci/SSLInstance.cpp	2007/09/11 00:26:52	1.11
@@ -35,6 +35,10 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
+extern "C" {
+	#include "sys_util.h"
+}
+
 #include <iostream>
 #include <list>
 #include <set>
@@ -290,7 +294,7 @@
 		int ret = SSL_read(_ssl, buff, sizeof(buff));
 		if (ret > 0) {
 			String data(buff, ret);
-			shred(buff, sizeof(buff));
+			memset(buff, 0, sizeof(buff));
 			return data;
 		} else {
 			bool want_read, want_write;
@@ -398,11 +402,12 @@
 	f_name += "/client_cert_XXXXXX";
 
 	int fd = -1;
-	char* buff = new char[f_name.size() + 1];
+	char *buff = new char[f_name.size() + 1];
 
 	try {
 		// pick a filename
 		strcpy(buff, f_name.c_str());
+
 		if ((fd = mkstemp(buff)) == -1)
 			throw String("unable to generate random file");
 		f_name = buff;
@@ -411,14 +416,12 @@
 		buff = NULL;
 
 		String data(_cert_pem);
-		while (data.size()) {
-			ssize_t i = write(fd, data.c_str(), data.size());
-			if (i == -1) {
-				if (errno != EINTR)
-					throw String("error writing certificate");
-			} else
-				data = data.substr(i);
+		ssize_t i = write_restart(fd, data.c_str(), data.size());
+		if (i < 0) {
+			throw String("error writing certificate: ")
+					+ String(strerror(-i));
 		}
+
 		while (close(fd) && errno == EINTR)
 			;
 	} catch ( ... ) {




More information about the Cluster-devel mailing list