Hopefully fixed "id -G"

This commit is contained in:
Pierre Pronchery 2013-07-20 01:58:52 +02:00
parent 367c950182
commit e76d32b0b2

View File

@ -54,11 +54,14 @@ static int _id_error(char const * message, int ret)
static int _id_G(char const * user, int flagn) static int _id_G(char const * user, int flagn)
{ {
struct group * gr; struct group * gr;
char * u; struct passwd * pw;
char * g;
char ** p; char ** p;
if(user == NULL) if(user == NULL)
{ {
if((pw = getpwuid(geteuid())) == NULL)
return _id_error("geteuid", 1);
if((gr = getgrgid(getegid())) == NULL) if((gr = getgrgid(getegid())) == NULL)
return _id_error("getgrgid", 1); return _id_error("getgrgid", 1);
if(getegid() != getgid()) if(getegid() != getgid())
@ -87,32 +90,34 @@ static int _id_G(char const * user, int flagn)
} }
else else
{ {
if((gr = getgrnam(user)) == NULL) if((pw = getpwnam(user)) == NULL)
return _id_error(user, 1); return _id_error(user, 1);
if((gr = getgrgid(pw->pw_gid)) == NULL)
return _id_error("getgrgid", 1);
if(flagn == 0) if(flagn == 0)
printf("%u", (unsigned)gr->gr_gid); printf("%u", (unsigned)gr->gr_gid);
else else
puts(gr->gr_name); fputs(gr->gr_name, stdout);
} }
if((u = strdup(gr->gr_name)) == NULL) if((g = strdup(gr->gr_name)) == NULL)
return _id_error(gr->gr_name, 1); return _id_error(gr->gr_name, 1);
setgrent(); setgrent();
for(gr = getgrent(); gr != NULL; gr = getgrent()) for(gr = getgrent(); gr != NULL; gr = getgrent())
{ {
for(p = gr->gr_mem; p != NULL && *p != NULL; p++) for(p = gr->gr_mem; p != NULL && *p != NULL; p++)
{ {
if(strcmp(u, *p) == 0) if(strcmp(pw->pw_name, *p) != 0
{ || strcmp(g, gr->gr_name) == 0)
continue;
if(flagn == 0) if(flagn == 0)
printf(" %u", (unsigned)gr->gr_gid); printf(" %u", (unsigned)gr->gr_gid);
else else
printf(" %s", gr->gr_name); printf(" %s", gr->gr_name);
} }
} }
}
putchar('\n'); putchar('\n');
endgrent(); endgrent();
free(u); free(g);
return 0; return 0;
} }