From: rmccabe@sourceware.org <rmccabe@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga/ricci common/ClientSocket.cpp common/Log ...
Date: 11 Sep 2007 00:26:54 -0000 [thread overview]
Message-ID: <20070911002654.23268.qmail@sourceware.org> (raw)
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 ( ... ) {
reply other threads:[~2007-09-11 0:26 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070911002654.23268.qmail@sourceware.org \
--to=rmccabe@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.