[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