libcsupport: Implement getgroups()

This commit is contained in:
Sebastian Huber
2014-11-17 07:53:01 +01:00
parent 395e5d4d7a
commit ffa71f1cd0
5 changed files with 157 additions and 11 deletions

View File

@@ -10,15 +10,66 @@
#endif
#include <sys/types.h>
#include <grp.h>
#include <pwd.h>
#include <string.h>
#include <unistd.h>
#include <rtems/seterr.h>
/**
* 4.2.3 Get Supplementary IDs, P1003.1b-1993, p. 86
*/
int getgroups(
int gidsetsize __attribute__((unused)),
gid_t grouplist[] __attribute__((unused))
int gidsetsize,
gid_t grouplist[]
)
{
return 0; /* no supplemental group ids */
int rv;
struct passwd pwd;
struct passwd *pwd_res;
char buf[256];
gid_t gid;
const char *user;
struct group *grp;
rv = getpwuid_r(getuid(), &pwd, &buf[0], sizeof(buf), &pwd_res);
if (rv != 0) {
return rv;
}
gid = pwd.pw_gid;
user = pwd.pw_name;
setgrent();
while ((grp = getgrent()) != NULL) {
char **mem = &grp->gr_mem[0];
if (grp->gr_gid == gid) {
continue;
}
while (*mem != NULL) {
if (strcmp(*mem, user) == 0) {
if (rv < gidsetsize) {
grouplist[rv] = grp->gr_gid;
}
++rv;
break;
}
++mem;
}
}
endgrent();
if (gidsetsize == 0 || rv <= gidsetsize) {
return rv;
} else {
rtems_set_errno_and_return_minus_one(EINVAL);
}
}

View File

@@ -17,9 +17,12 @@
#endif
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <grp.h>
#include <pwd.h>
#include <stdio.h>
#include <unistd.h>
#include "tmacros.h"
@@ -69,6 +72,7 @@ static void test(void)
struct passwd *pwd_res;
struct group *grp_res;
char buf[256];
gid_t grps[5];
rv = mkdir("/etc", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
rtems_test_assert(rv == 0);
@@ -80,7 +84,14 @@ static void test(void)
create_file(
"/etc/group",
"A::1:moop,u,v,w\n"
"B::2:moop\n"
"blub:bar:3:moop\n"
"C::4:l,m,n,moop\n"
"D::5:moop,moop\n"
"E::6:x\n"
"E::7:y,z\n"
"F::8:s,moop,t\n"
);
memset(&pwd, 0xff, sizeof(pwd));
@@ -106,6 +117,34 @@ static void test(void)
rtems_test_assert(rv == 0);
rtems_test_assert(&grp == grp_res);
assert_grp(grp_res);
rv = setuid(0);
rtems_test_assert(rv == 0);
errno = 0;
rv = getgroups(0, NULL);
rtems_test_assert(rv == -1);
rtems_test_assert(errno == EINVAL);
rv = setuid(1);
rtems_test_assert(rv == 0);
rv = getgroups(0, NULL);
rtems_test_assert(rv == 5);
errno = 0;
rv = getgroups(1, &grps[0]);
rtems_test_assert(rv == -1);
rtems_test_assert(errno == EINVAL);
memset(&grps[0], 0xff, sizeof(grps));
rv = getgroups(5, &grps[0]);
rtems_test_assert(rv == 5);
rtems_test_assert(grps[0] == 1);
rtems_test_assert(grps[1] == 2);
rtems_test_assert(grps[2] == 4);
rtems_test_assert(grps[3] == 5);
rtems_test_assert(grps[4] == 8);
}
static void Init(rtems_task_argument arg)
@@ -126,6 +165,8 @@ static void Init(rtems_task_argument arg)
#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4
#define CONFIGURE_MAXIMUM_TASKS 1
#define CONFIGURE_MAXIMUM_POSIX_KEYS 1
#define CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS 1
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION

View File

@@ -9,6 +9,7 @@ directives:
- getpwuid_r
- getgrnam_r
- getgrgid_r
- getgroups
concepts:
@@ -17,3 +18,4 @@ concepts:
custom /etc/passwd.
- Ensure that getgrnam_r() and getgrgid_r() return the values specified by
custom /etc/group.
- Ensure that getgroups() returns the values specified by custom /etc/group.

View File

@@ -34,9 +34,11 @@ void test_gid(void)
int sc;
gid = getegid();
rtems_test_assert( gid == 0 );
printf( "getegid = %d\n", gid );
gid = getgid();
rtems_test_assert( gid == 0 );
printf( "getgid = %d\n", gid );
puts( "setgid(5)" );
@@ -44,11 +46,34 @@ void test_gid(void)
rtems_test_assert( sc == 0 );
gid = getegid();
rtems_test_assert( gid == 0 );
printf( "getegid = %d\n", gid );
gid = getgid();
rtems_test_assert( gid == 5 );
printf( "getgid = %d\n", gid );
puts( "setegid(5)" );
sc = setegid(5);
rtems_test_assert( sc == 0 );
gid = getegid();
rtems_test_assert( gid == 5 );
printf( "getegid = %d\n", gid );
gid = getgid();
rtems_test_assert( gid == 5 );
printf( "getgid = %d\n", gid );
puts( "setgid(0)" );
sc = setgid(0);
rtems_test_assert( sc == 0 );
puts( "setegid(0)" );
sc = setegid(0);
rtems_test_assert( sc == 0 );
errno = 0;
puts( "setpgid(getpid(), 10) - ENOSYS" );
sc = setpgid( getpid(), 10 );
rtems_test_assert( sc == -1 );
@@ -61,9 +86,11 @@ void test_uid(void)
int sc;
uid = geteuid();
rtems_test_assert( uid == 0 );
printf( "geteuid = %d\n", uid );
uid = getuid();
rtems_test_assert( uid == 0 );
printf( "getuid = %d\n", uid );
puts( "setuid(5)" );
@@ -71,11 +98,32 @@ void test_uid(void)
rtems_test_assert( sc == 0 );
uid = geteuid();
rtems_test_assert( uid == 0 );
printf( "geteuid = %d\n", uid );
uid = getuid();
rtems_test_assert( uid == 5 );
printf( "getuid = %d\n", uid );
puts( "seteuid(5)" );
sc = seteuid(5);
rtems_test_assert( sc == 0 );
uid = geteuid();
rtems_test_assert( uid == 5 );
printf( "geteuid = %d\n", uid );
uid = getuid();
rtems_test_assert( uid == 5 );
printf( "getuid = %d\n", uid );
puts( "seteuid(0)" );
sc = seteuid(0);
rtems_test_assert( sc == 0 );
puts( "setuid(0)" );
sc = setuid(0);
rtems_test_assert( sc == 0 );
}
pid_t __getpid(void);
@@ -106,11 +154,6 @@ void test_pid(void)
puts( "getpgrp - return local node - OK" );
pid = getpgrp();
printf( "getpgrp returned %d\n", pid );
puts( "getgroups - return 0 - OK" );
sc = getgroups( 0, NULL );
rtems_test_assert( sc == 0 );
}
void test_getlogin(void)

View File

@@ -1,9 +1,14 @@
*** TEST ID 01 ***
*** BEGIN OF TEST PSXID 1 ***
getegid = 0
getgid = 0
setgid(5)
getegid = 0
getgid = 5
setegid(5)
getegid = 5
getgid = 5
setgid(0)
setegid(0)
setpgid(getpid(), 10) - ENOSYS
geteuid = 0
@@ -11,6 +16,11 @@ getuid = 0
setuid(5)
geteuid = 0
getuid = 5
seteuid(5)
geteuid = 5
getuid = 5
seteuid(0)
setuid(0)
getpid = 1
__getpid = 1
@@ -18,7 +28,6 @@ getppid = 0
setsid - EPERM
getpgrp - return local node - OK
getpgrp returned 1
getgroups - return 0 - OK
setuid(5)
getlogin() -- ()
@@ -26,4 +35,4 @@ setuid(0)
getlogin() -- (root)
getlogin_r(NULL, LOGIN_NAME_MAX) -- EFAULT
getlogin_r(buffer, 0) -- ERANGE
*** END OF TEST ID 01 ***
*** END OF TEST PSXID 1 ***