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

rpeterso at sourceware.org rpeterso at sourceware.org
Sat Oct 21 17:15:13 UTC 2006


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	rpeterso at sourceware.org	2006-10-21 17:15:12

Modified files:
	group/daemon   : main.c 
	group/lib      : libgroup.c 
	group/tool     : main.c 

Log message:
	This is the fix for Bugzilla Bug 210344: group_tool does not
	handle short reads.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/daemon/main.c.diff?cvsroot=cluster&r1=1.49&r2=1.50
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/lib/libgroup.c.diff?cvsroot=cluster&r1=1.22&r2=1.23
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/group/tool/main.c.diff?cvsroot=cluster&r1=1.20&r2=1.21

--- cluster/group/daemon/main.c	2006/10/20 15:42:44	1.49
+++ cluster/group/daemon/main.c	2006/10/21 17:15:12	1.50
@@ -490,30 +490,24 @@
 {
 	group_t *g;
 	group_data_t *data;
-	int i, rv, len, count = 0, max = atoi(argv[1]);
+	int rv, count = 0, max = atoi(argv[1]);
 
-	list_for_each_entry(g, &gd_groups, list)
-		count++;
-	if (count > max)
-		count = max;
-	/* if no groups, send back one empty data struct */
-	if (!count)
-		count = 1;
-
-	len = count * sizeof(group_data_t);
-	data = malloc(len);
-	memset(data, 0, len);
-
-	i = 0;
+	data = malloc(sizeof(group_data_t));
+	count = 0;
 	list_for_each_entry(g, &gd_groups, list) {
-		copy_group_data(g, &data[i]);
-		i++;
+		copy_group_data(g, data);
+		rv = do_write(client[ci].fd, data, sizeof(group_data_t));
+		if (rv < 0) {
+			log_print("do_get_groups write error");
+			break;
+		}
+		count++;
+		if (count >= max)
+			break;
 	}
-
-	rv = do_write(client[ci].fd, data, len);
-	if (rv < 0)
-		log_print("do_get_groups write error");
-
+	/* Now write an empty one indicating there aren't anymore: */
+	memset(data, 0, sizeof(group_data_t));
+	rv = do_write(client[ci].fd, data, sizeof(group_data_t));
 	free(data);
 	return 0;
 }
--- cluster/group/lib/libgroup.c	2006/10/13 17:15:26	1.22
+++ cluster/group/lib/libgroup.c	2006/10/21 17:15:12	1.23
@@ -446,11 +446,11 @@
 	return rv;
 }
 
-int group_get_groups(int max, int *count, group_data_t *data)
+int group_get_groups(int max, int *count, group_data_t  *data)
 {
 	char buf[GROUPD_MSGLEN];
 	group_data_t empty;
-	int fd, rv, maxlen;
+	int fd, rv;
 
 	fd = connect_groupd();
 	if (fd < 0)
@@ -461,21 +461,20 @@
 	snprintf(buf, sizeof(buf), "get_groups %d", max);
 
 	rv = do_write(fd, &buf, GROUPD_MSGLEN);
-	if (rv < 0)
-		goto out;
-
-	maxlen = max * sizeof(group_data_t);
-
-	rv = read(fd, data, maxlen);
-	if (rv > 0) {
-		/* a blank data struct is returned when there are none */
-		if (rv == sizeof(empty) && !memcmp(data, &empty, rv))
-			*count = 0;
-		else
-			*count = rv / sizeof(group_data_t);
-		rv = 0;
+	*count = 0;
+	if (!rv) {
+		while (1) {
+			rv = read(fd, &data[*count], sizeof(group_data_t));
+			/* a blank data struct is returned when there are none */
+			if (rv <= 0 || (rv == sizeof(group_data_t) &&
+							!memcmp(&data[*count], &empty, rv))) {
+				rv = 0;
+				break;
+			}
+			else
+				(*count)++;
+		}
 	}
- out:
 	close(fd);
 	return rv;
 }
--- cluster/group/tool/main.c	2006/08/14 19:38:20	1.20
+++ cluster/group/tool/main.c	2006/10/21 17:15:12	1.21
@@ -247,6 +247,10 @@
 	} else
 		rv = group_get_groups(MAX_GROUPS, &count, data);
 
+	if (rv < 0) {
+		fprintf(stderr,"Unable to connect to groupd.  Is it running?\n");
+		return rv;
+	}
 	for (i = 0; i < count; i++) {
 		len = strlen(data[i].name);
 		if (len > max_name)




More information about the Cluster-devel mailing list