Merge branch 'khorben/getgroups' into master
This commit is contained in:
commit
958892932e
106
src/id.c
106
src/id.c
|
@ -35,6 +35,7 @@ static int _id_G(char const * user, int flagn);
|
||||||
static int _id_g(char const * user, int flagn, int flagr);
|
static int _id_g(char const * user, int flagn, int flagr);
|
||||||
static int _id_u(char const * user, int flagn, int flagr);
|
static int _id_u(char const * user, int flagn, int flagr);
|
||||||
static int _id_all(char const * user);
|
static int _id_all(char const * user);
|
||||||
|
static gid_t * _id_getgroups(int * n);
|
||||||
|
|
||||||
static int _id(char const * user, int flag, int flagn, int flagr)
|
static int _id(char const * user, int flag, int flagn, int flagr)
|
||||||
{
|
{
|
||||||
|
@ -58,6 +59,9 @@ static int _id_error(char const * message, int ret)
|
||||||
/* _id_G */
|
/* _id_G */
|
||||||
static int _id_G(char const * user, int flagn)
|
static int _id_G(char const * user, int flagn)
|
||||||
{
|
{
|
||||||
|
gid_t * groups;
|
||||||
|
int n;
|
||||||
|
int i;
|
||||||
struct group * gr;
|
struct group * gr;
|
||||||
struct passwd * pw;
|
struct passwd * pw;
|
||||||
char * g;
|
char * g;
|
||||||
|
@ -65,50 +69,29 @@ static int _id_G(char const * user, int flagn)
|
||||||
|
|
||||||
if(user == NULL)
|
if(user == NULL)
|
||||||
{
|
{
|
||||||
if((pw = getpwuid(geteuid())) == NULL)
|
if((groups = _id_getgroups(&n)) == NULL && n < 0)
|
||||||
return _id_error("getpwuid", 1);
|
return 1;
|
||||||
if((gr = getgrgid(getegid())) == NULL)
|
for(i = 0; i < n; i++)
|
||||||
return _id_error("getgrgid", 1);
|
if(flagn != 0 && (gr = getgrgid(groups[i])) != NULL)
|
||||||
if(getegid() != getgid())
|
printf("%s%s", (i > 0) ? " " : "", gr->gr_name);
|
||||||
{
|
|
||||||
if(flagn == 0)
|
|
||||||
printf("%u %u", (unsigned)getegid(),
|
|
||||||
(unsigned)getgid());
|
|
||||||
else
|
else
|
||||||
{
|
printf("%s%u", (i > 0) ? " " : "", groups[i]);
|
||||||
fputs(gr->gr_name, stdout);
|
putchar('\n');
|
||||||
if((gr = getgrgid(getgid())) == NULL)
|
free(groups);
|
||||||
{
|
return 0;
|
||||||
putchar('\n');
|
|
||||||
return _id_error("getgrgid", 1);
|
|
||||||
}
|
|
||||||
printf(" %s", gr->gr_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(flagn == 0)
|
|
||||||
printf("%u", (unsigned)getgid());
|
|
||||||
else
|
|
||||||
fputs(gr->gr_name, stdout);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if((pw = getpwnam(user)) == NULL)
|
||||||
|
return _id_error(user, 1);
|
||||||
|
if((gr = getgrgid(pw->pw_gid)) == NULL)
|
||||||
|
return _id_error("getgrgid", 1);
|
||||||
|
if(flagn == 0)
|
||||||
|
printf("%u", (unsigned)gr->gr_gid);
|
||||||
else
|
else
|
||||||
{
|
fputs(gr->gr_name, stdout);
|
||||||
if((pw = getpwnam(user)) == NULL)
|
|
||||||
return _id_error(user, 1);
|
|
||||||
if((gr = getgrgid(pw->pw_gid)) == NULL)
|
|
||||||
return _id_error("getgrgid", 1);
|
|
||||||
if(flagn == 0)
|
|
||||||
printf("%u", (unsigned)gr->gr_gid);
|
|
||||||
else
|
|
||||||
fputs(gr->gr_name, stdout);
|
|
||||||
}
|
|
||||||
if((g = 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(pw->pw_name, *p) != 0
|
if(strcmp(pw->pw_name, *p) != 0
|
||||||
|
@ -119,7 +102,6 @@ static int _id_G(char const * user, int flagn)
|
||||||
else
|
else
|
||||||
printf(" %s", gr->gr_name);
|
printf(" %s", gr->gr_name);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
endgrent();
|
endgrent();
|
||||||
free(g);
|
free(g);
|
||||||
|
@ -187,7 +169,9 @@ static int _id_all(char const * user)
|
||||||
struct passwd * pw;
|
struct passwd * pw;
|
||||||
struct group * gr;
|
struct group * gr;
|
||||||
char * u;
|
char * u;
|
||||||
char ** p;
|
int n;
|
||||||
|
gid_t * groups;
|
||||||
|
int i;
|
||||||
|
|
||||||
if(user == NULL)
|
if(user == NULL)
|
||||||
{
|
{
|
||||||
|
@ -234,15 +218,18 @@ static int _id_all(char const * user)
|
||||||
return _id_error(gr->gr_name, 1);
|
return _id_error(gr->gr_name, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("%s%u(%s)", " groups=", (unsigned)pw->pw_gid, u);
|
if((groups = _id_getgroups(&n)) == NULL && n < 0)
|
||||||
setgrent();
|
return 1;
|
||||||
for(gr = getgrent(); gr != NULL; gr = getgrent())
|
printf("%s", " groups=");
|
||||||
for(p = gr->gr_mem; p != NULL && *p != NULL; p++)
|
for(i = 0; i < n; i++)
|
||||||
if(strcmp(u, *p) == 0)
|
if((gr = getgrgid(groups[i])) == NULL)
|
||||||
printf(",%u(%s)", (unsigned)gr->gr_gid,
|
printf("%s%u", (i == 0) ? "" : ",",
|
||||||
gr->gr_name);
|
(unsigned)gr->gr_gid);
|
||||||
|
else
|
||||||
|
printf("%s%u(%s)", (i == 0) ? "" : ",",
|
||||||
|
(unsigned)gr->gr_gid, gr->gr_name);
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
endgrent();
|
free(groups);
|
||||||
free(u);
|
free(u);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -262,6 +249,31 @@ static struct group * _print_gid(gid_t gid)
|
||||||
return gr;
|
return gr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gid_t * _id_getgroups(int * n)
|
||||||
|
{
|
||||||
|
gid_t * groups;
|
||||||
|
|
||||||
|
if((*n = getgroups(0, NULL)) < 0)
|
||||||
|
{
|
||||||
|
_id_error("getgroups", 1);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if(*n == 0)
|
||||||
|
groups = NULL;
|
||||||
|
else if((groups = malloc(sizeof(*groups) * (*n))) == NULL)
|
||||||
|
{
|
||||||
|
_id_error("malloc", 1);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if((*n = getgroups(*n, groups)) < 0)
|
||||||
|
{
|
||||||
|
free(groups);
|
||||||
|
_id_error("getgroups", 1);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* usage */
|
/* usage */
|
||||||
static int _usage(void)
|
static int _usage(void)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user