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 lchown: 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 lchown: 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);
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);
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 (st1.st_gid == st2.st_gid);
ASSERT (st1.st_gid == st2.st_gid);
ASSERT (lstat (BASE "dir/link2", &st2) == 0);
ASSERT (st1.st_uid == st2.st_uid);
- ASSERT (gids[0] == st2.st_gid);
+ ASSERT (gids[1] == st2.st_gid);
/* Trailing slash follows through to directory. */
ASSERT (lstat (BASE "dir/link3", &st2) == 0);
ASSERT (st1.st_uid == st2.st_uid);
ASSERT (st1.st_gid == st2.st_gid);
- ASSERT (func (BASE "dir/link3/", -1, gids[0]) == 0);
+ ASSERT (func (BASE "dir/link3/", -1, gids[1]) == 0);
ASSERT (lstat (BASE "dir/link3", &st2) == 0);
ASSERT (st1.st_uid == st2.st_uid);
ASSERT (st1.st_gid == st2.st_gid);
ASSERT (lstat (BASE "dir/sub", &st2) == 0);
ASSERT (st1.st_uid == st2.st_uid);
- ASSERT (gids[0] == st2.st_gid);
+ ASSERT (gids[1] == st2.st_gid);
}
else if (!CHOWN_CHANGE_TIME_BUG || HAVE_LCHMOD)
{
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);
ASSERT (get_stat_ctime_ns (&st1) == get_stat_ctime_ns (&st2));
ASSERT (lstat (BASE "dir/sub", &st1) == 0);
ASSERT (lstat (BASE "dir/link3", &l1) == 0);
nap ();
- ASSERT (func (BASE "dir/link3/", -1, gids[0]) == 0);
+ ASSERT (func (BASE "dir/link3/", -1, st1.st_gid) == 0);
ASSERT (lstat (BASE "dir/link3", &st2) == 0);
ASSERT (l1.st_ctime == st2.st_ctime);
ASSERT (get_stat_ctime_ns (&l1) == get_stat_ctime_ns (&st2));