Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > d236c5da97a239a1b6991cfba2865b66 > files > 111

cman-2.0.115-68.el5_6.1.src.rpm

From 2813311e01fce84251fd9b3f313a9af1b3bc2092 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Wed, 3 Feb 2010 14:30:22 -0600
Subject: [PATCH] group_tool: list more than 64 groups

if hardcoded limit of 64 fills up, then call get_groups
again with 1024 limit.

bz 561509

Signed-off-by: David Teigland <teigland@redhat.com>
---
 group/tool/main.c |   38 ++++++++++++++++++++++++++++++++------
 1 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/group/tool/main.c b/group/tool/main.c
index a6b4542..2732a46 100644
--- a/group/tool/main.c
+++ b/group/tool/main.c
@@ -269,9 +269,13 @@ static int member_compare(const void *va, const void *vb)
 	return *a - *b;
 }
 
+#define BIG_GROUPS 1024
+
 int do_ls(int argc, char **argv)
 {
-	group_data_t data[MAX_GROUPS];
+	group_data_t data_max[MAX_GROUPS];
+	group_data_t *data_big = NULL;
+	group_data_t *data;
 	int i, j, rv, count = 0, level, ret = 0;
 	char *name, *state_header;
 	int type_width = 16;
@@ -287,8 +291,9 @@ int do_ls(int argc, char **argv)
 		level = atoi(argv[opt_ind++]);
 		name = argv[opt_ind];
 
-		rv = group_get_group(level, name, data);
+		rv = group_get_group(level, name, data_max);
 		count = 1;
+		data = data_max;
 
 		/* don't output if there's no group at all */
 		if (data[0].id == 0 && !strlen(data[0].name) && 
@@ -302,9 +307,27 @@ int do_ls(int argc, char **argv)
 		   the caller */
 		if (data[0].member != 1)
 			ret = 1;
-	} else
-		rv = group_get_groups(MAX_GROUPS, &count, data);
+	} else {
+		data = data_max;
+		count = 0;
+
+		rv = group_get_groups(MAX_GROUPS, &count, data_max);
+		if (count < MAX_GROUPS)
+			goto report;
+
+		data_big = malloc(BIG_GROUPS * sizeof(group_data_t));
+		if (!data_big) {
+			fprintf(stderr, "cannot report all groups");
+			goto report;
+		}
+		memset(data_big, 0, BIG_GROUPS * sizeof(group_data_t));
+		count = 0;
 
+		data = data_big;
+		rv = group_get_groups(BIG_GROUPS, &count, data_big);
+	}
+
+ report:
 	if (rv < 0) {
 		fprintf(stderr,"Unable to connect to groupd.  Is it running?\n");
 		return rv;
@@ -328,7 +351,7 @@ int do_ls(int argc, char **argv)
 		id_width, "id",
 		state_width, state_header);
 
-	qsort(&data, count, sizeof(group_data_t), data_compare);
+	qsort(data, count, sizeof(group_data_t), data_compare);
 
 	for (i = 0; i < count; i++) {
 
@@ -339,7 +362,7 @@ int do_ls(int argc, char **argv)
 			id_width, data[i].id,
 			state_width, state_str(&data[i]));
 
-		qsort(&data[i].members, data[i].member_count,
+		qsort(data[i].members, data[i].member_count,
 		      sizeof(int), member_compare);
 
 		printf("[");
@@ -350,6 +373,9 @@ int do_ls(int argc, char **argv)
 		}
 		printf("]\n");
 	}
+
+	if (data_big)
+		free(data_big);
 	return ret;
 }
 
-- 
1.7.1.1