forked from Imagelibrary/rtems
libcsupport: Implement getgroups()
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 ***
|
||||
|
||||
Reference in New Issue
Block a user