[Cluster-devel] cluster/group/lib libgroup.c

teigland at sourceware.org teigland at sourceware.org
Thu Sep 7 19:24:09 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	teigland at sourceware.org	2006-09-07 19:24:08

Modified files:
	group/lib      : libgroup.c 

Log message:
	handle short or interrupted reads/writes, an snprintf instead of sprintf,
	strtoul instead of atoi, handle an ENOMEM

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/lib/libgroup.c.diff?cvsroot=cluster&r1=1.19&r2=1.20

--- cluster/group/lib/libgroup.c	2006/02/28 20:31:27	1.19
+++ cluster/group/lib/libgroup.c	2006/09/07 19:24:08	1.20
@@ -88,7 +88,7 @@
 	return rp;
 }
 
-void get_nodeids(char *buf, int memb_count, int *nodeids)
+static void get_nodeids(char *buf, int memb_count, int *nodeids)
 {
 	char *p;
 	int i, count = 0;
@@ -112,7 +112,7 @@
 	}
 }
 
-int get_action(char *buf)
+static int get_action(char *buf)
 {
 	char act[16];
 	int i;
@@ -151,15 +151,32 @@
 {
 	int rv, off = 0;
 
- again:
+ retry:
 	rv = write(fd, buf + off, count);
+	if (rv == -1 && errno == EINTR)
+		goto retry;
 	if (rv < 0)
 		return rv;
 
 	if (rv != count) {
 		count -= rv;
 		off += rv;
-		goto again;
+		goto retry;
+	}
+	return 0;
+}
+
+static int do_read(int fd, void *buf, size_t count)
+{
+	int rv, off = 0;
+
+	while (off < count) {
+		rv = read(fd, buf + off, count - off);
+		if (rv == 0)
+			return -1;
+		if (rv == -1 && errno == EINTR)
+			continue;
+		off += rv;
 	}
 	return 0;
 }
@@ -231,7 +248,7 @@
 		return -EINVAL;
 
 	memset(buf, 0, sizeof(buf));
-	rv = sprintf(buf, "send %s %d", name, len);
+	rv = snprintf(buf, sizeof(buf), "send %s %d", name, len);
 	memcpy(buf + rv + 1, data, len);
 
 	return do_write(h->fd, buf, GROUPD_MSGLEN);
@@ -359,8 +376,8 @@
 
 	memset(buf, 0, sizeof(buf));
 
-	rv = read(h->fd, &buf, GROUPD_MSGLEN);
-	if (rv != GROUPD_MSGLEN)
+	rv = do_read(h->fd, &buf, GROUPD_MSGLEN);
+	if (rv < 0)
 		goto out;
 
 	act = get_action(buf);
@@ -378,6 +395,10 @@
 
 		count = atoi(argv[4]);
 		nodeids = malloc(count * sizeof(int));
+		if (!nodeids) {
+			rv = -ENOMEM;
+			goto out;
+		}
 		get_nodeids(p, count, nodeids);
 
 		h->cbs.start(h, h->private, argv[1], atoi(argv[2]),
@@ -403,9 +424,8 @@
 	case DO_SET_ID:
 		get_args(buf, &argc, argv, ' ', 3);
 
-		/* FIXME: id is unsigned, use strtoul() here */
-
-		h->cbs.set_id(h, h->private, argv[1], atoi(argv[2]));
+		h->cbs.set_id(h, h->private, argv[1],
+			      (unsigned int) strtoul(argv[2], NULL, 10));
 		break;
 
 	case DO_DELIVER:
@@ -472,9 +492,9 @@
 	if (rv < 0)
 		goto out;
 
-	rv = read(fd, &data_buf, sizeof(data_buf));
-
-	/* FIXME: check rv */
+	rv = do_read(fd, &data_buf, sizeof(data_buf));
+	if (rv < 0)
+		goto out;
 
 	memcpy(data, data_buf, sizeof(group_data_t));
 	rv = 0;




More information about the Cluster-devel mailing list