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