[Cluster-devel] cluster/group/dlm_controld action.c group.c main.c
teigland at sourceware.org
teigland at sourceware.org
Thu Aug 31 18:17:01 UTC 2006
CVSROOT: /cvs/cluster
Module name: cluster
Changes by: teigland at sourceware.org 2006-08-31 18:17:00
Modified files:
group/dlm_controld: action.c group.c main.c
Log message:
- break from snprintf loop when buffer is filled
- handle some odd error cases like EINTR
- handle short writes
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/action.c.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/group.c.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/dlm_controld/main.c.diff?cvsroot=cluster&r1=1.4&r2=1.5
--- cluster/group/dlm_controld/action.c 2006/07/24 18:50:01 1.5
+++ cluster/group/dlm_controld/action.c 2006/08/31 18:17:00 1.6
@@ -46,10 +46,31 @@
#define COMMS_DIR "/sys/kernel/config/dlm/cluster/comms"
+static int do_write(int fd, void *buf, size_t count)
+{
+ int rv, off = 0;
+
+ retry:
+ rv = write(fd, buf + off, count);
+ if (rv == -1 && errno == EINTR)
+ goto retry;
+ if (rv < 0) {
+ log_error("write errno %d", errno);
+ return rv;
+ }
+
+ if (rv != count) {
+ count -= rv;
+ off += rv;
+ goto retry;
+ }
+ return 0;
+}
+
static int do_sysfs(char *name, char *file, char *val)
{
char fname[512];
- int rv, fd, len;
+ int rv, fd;
sprintf(fname, "%s/%s/%s", DLM_SYSFS_DIR, name, file);
@@ -61,14 +82,7 @@
log_debug("write \"%s\" to \"%s\"", val, fname);
- len = strlen(val) + 1;
- rv = write(fd, val, len);
- if (rv != len) {
- log_error("write %d error %d %d", len, rv, errno);
- rv = -1;
- } else
- rv = 0;
-
+ rv = do_write(fd, val, strlen(val) + 1);
close(fd);
return rv;
}
@@ -314,7 +328,7 @@
memset(buf, 0, 32);
snprintf(buf, 32, "%d", id);
- rv = write(fd, buf, strlen(buf));
+ rv = do_write(fd, buf, strlen(buf));
if (rv < 0) {
log_error("%s: write failed: %d, %s", path, errno, buf);
close(fd);
@@ -344,7 +358,7 @@
memset(buf, 0, 32);
snprintf(buf, 32, "%d", w);
- rv = write(fd, buf, strlen(buf));
+ rv = do_write(fd, buf, strlen(buf));
if (rv < 0) {
log_error("%s: write failed: %d, %s", path, errno, buf);
close(fd);
@@ -360,6 +374,7 @@
return rv;
}
+#if 0
char *str_ip(char *addr)
{
static char ip[256];
@@ -368,6 +383,24 @@
inet_ntop(AF_INET, &sin->sin_addr, ip, 256);
return ip;
}
+#endif
+
+char *str_ip(char *addr)
+{
+ static char str_ip_buf[INET6_ADDRSTRLEN];
+ struct sockaddr_storage *ss = (struct sockaddr_storage *)addr;
+ struct sockaddr_in *sin = (struct sockaddr_in *)addr;
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
+ void *saddr;
+
+ if (ss->ss_family == AF_INET6)
+ saddr = &sin6->sin6_addr;
+ else
+ saddr = &sin->sin_addr;
+
+ inet_ntop(ss->ss_family, saddr, str_ip_buf, sizeof(str_ip_buf));
+ return str_ip_buf;
+}
/* record the nodeids that are currently listed under
config/dlm/cluster/comms/ so that we can remove all of them */
@@ -539,7 +572,7 @@
memset(buf, 0, sizeof(buf));
snprintf(buf, 32, "%d", nodeid);
- rv = write(fd, buf, strlen(buf));
+ rv = do_write(fd, buf, strlen(buf));
if (rv < 0) {
log_error("%s: write failed: %d, %s", path, errno, buf);
close(fd);
@@ -563,8 +596,8 @@
return -1;
}
- rv = write(fd, padded_addr, sizeof(struct sockaddr_storage));
- if (rv != sizeof(struct sockaddr_storage)) {
+ rv = do_write(fd, padded_addr, sizeof(struct sockaddr_storage));
+ if (rv < 0) {
log_error("%s: write failed: %d %d", path, errno, rv);
close(fd);
return -1;
@@ -587,7 +620,7 @@
return -1;
}
- rv = write(fd, "1", strlen("1"));
+ rv = do_write(fd, "1", strlen("1"));
if (rv < 0) {
log_error("%s: write failed: %d", path, errno);
close(fd);
--- cluster/group/dlm_controld/group.c 2006/06/09 20:59:57 1.1
+++ cluster/group/dlm_controld/group.c 2006/08/31 18:17:00 1.2
@@ -85,14 +85,22 @@
char *str_members(void)
{
static char str_members_buf[MAXLINE];
- int i, len = 0;
+ int i, ret, pos = 0, len = MAXLINE;
memset(str_members_buf, 0, MAXLINE);
for (i = 0; i < cb_member_count; i++) {
- if (i != 0)
- len += sprintf(str_members_buf+len, " ");
- len += sprintf(str_members_buf+len, "%d", cb_members[i]);
+ if (i != 0) {
+ ret = snprintf(str_members_buf + pos, len - pos, " ");
+ if (ret >= len - pos)
+ break;
+ pos += ret;
+ }
+ ret = snprintf(str_members_buf + pos, len - pos, "%d",
+ cb_members[i]);
+ if (ret >= len - pos)
+ break;
+ pos += ret;
}
return str_members_buf;
}
--- cluster/group/dlm_controld/main.c 2006/08/15 17:17:46 1.4
+++ cluster/group/dlm_controld/main.c 2006/08/31 18:17:00 1.5
@@ -29,10 +29,11 @@
struct lockspace *ls;
ls = malloc(sizeof(*ls));
+ if (!ls)
+ goto out;
memset(ls, 0, sizeof(*ls));
-
strncpy(ls->name, name, MAXNAME);
-
+ out:
return ls;
}
@@ -112,7 +113,12 @@
memset(buf, 0, sizeof(buf));
memset(argv, 0, sizeof(char *) * MAXARGS);
+ retry_recv:
rv = recv(uevent_fd, &buf, sizeof(buf), 0);
+ if (rv == -1 && rv == EINTR)
+ goto retry_recv;
+ if (rv == -1 && rv == EAGAIN)
+ return 0;
if (rv < 0) {
log_error("uevent recv error %d errno %d", rv, errno);
goto out;
@@ -226,8 +232,10 @@
for (;;) {
rv = poll(pollfd, maxi + 1, -1);
+ if (rv == -1 && errno == EINTR)
+ continue;
if (rv < 0) {
- log_error("poll");
+ log_error("poll errno %d", errno);
goto out;
}
More information about the Cluster-devel
mailing list