Mercurial > hg > octave-lojdl > gnulib-hg
diff tests/test-chown.h @ 12397:799c920db2a5
mgetgroups: reduce duplicate listings
POSIX doesn't guarantee whether the effective gid is included in
the list of supplementary groups returned by getgroups. On the
other hand, some platforms include the effective gid twice in
the list. Meanwhile, mgetgroups can independently add a duplicate.
Rather than spend a full-blown O(n log n) cleanup, we just remove
the most common forms of duplicate groups with an O(n) pass.
* lib/mgetgroups.c (mgetgroups): Reduce duplicates from the
resulting array.
* tests/test-chown.h (test_chown): Simplify client.
* tests/test-lchown.h (test_lchown): Likewise.
Signed-off-by: Eric Blake <ebb9@byu.net>
author | Eric Blake <ebb9@byu.net> |
---|---|
date | Fri, 04 Dec 2009 14:07:58 -0700 |
parents | e63e3a5265e5 |
children | 8b48f88c47f1 |
line wrap: on
line diff
--- a/tests/test-chown.h +++ b/tests/test-chown.h @@ -170,21 +170,12 @@ changing group ownership of a file we own. If we belong to at least two groups, then verifying the correct change is simple. But if we belong to only one group, then we fall back on the - other observable effect of chown: the ctime must be updated. - Be careful of duplicates returned by getgroups. */ - gids_count = mgetgroups (NULL, -1, &gids); - if (2 <= gids_count && gids[0] == gids[1] && 2 < gids_count--) - gids[1] = gids[2]; - if (1 < gids_count || (gids_count == 1 && gids[0] != st1.st_gid)) + other observable effect of chown: the ctime must be updated. */ + gids_count = mgetgroups (NULL, st1.st_gid, &gids); + if (1 < gids_count) { - if (gids[0] == st1.st_gid) - { - ASSERT (1 < gids_count); - ASSERT (gids[0] != gids[1]); - gids[0] = gids[1]; - } - ASSERT (gids[0] != st1.st_gid); - ASSERT (gids[0] != (gid_t) -1); + ASSERT (gids[1] != st1.st_gid); + ASSERT (gids[1] != (gid_t) -1); ASSERT (lstat (BASE "dir/link", &st2) == 0); ASSERT (st1.st_uid == st2.st_uid); ASSERT (st1.st_gid == st2.st_gid); @@ -193,7 +184,7 @@ ASSERT (st1.st_gid == st2.st_gid); errno = 0; - ASSERT (func (BASE "dir/link2/", -1, gids[0]) == -1); + ASSERT (func (BASE "dir/link2/", -1, gids[1]) == -1); ASSERT (errno == ENOTDIR); ASSERT (stat (BASE "dir/file", &st2) == 0); ASSERT (st1.st_uid == st2.st_uid); @@ -205,10 +196,10 @@ ASSERT (st1.st_uid == st2.st_uid); ASSERT (st1.st_gid == st2.st_gid); - ASSERT (func (BASE "dir/link2", -1, gids[0]) == 0); + ASSERT (func (BASE "dir/link2", -1, gids[1]) == 0); ASSERT (stat (BASE "dir/file", &st2) == 0); ASSERT (st1.st_uid == st2.st_uid); - ASSERT (gids[0] == st2.st_gid); + ASSERT (gids[1] == st2.st_gid); ASSERT (lstat (BASE "dir/link", &st2) == 0); ASSERT (st1.st_uid == st2.st_uid); ASSERT (st1.st_gid == st2.st_gid); @@ -238,7 +229,7 @@ ASSERT (l2.st_ctime == st2.st_ctime); ASSERT (get_stat_ctime_ns (&l2) == get_stat_ctime_ns (&st2)); - ASSERT (func (BASE "dir/link2", -1, gids[0]) == 0); + ASSERT (func (BASE "dir/link2", -1, st1.st_gid) == 0); ASSERT (stat (BASE "dir/file", &st2) == 0); ASSERT (st1.st_ctime < st2.st_ctime || (st1.st_ctime == st2.st_ctime