Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: 2813311e01fce84251fd9b3f313a9af1b3bc2092
Parent: e8c551339350df530a99bd6006246b13b0521f12
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Wed Feb 3 14:30:22 2010 -0600
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Thu Aug 5 16:25:06 2010 -0500
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(a)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;
}