Skip to content

Commit

Permalink
testcases/.../syscalls/getgroups03: Cleanup.
Browse files Browse the repository at this point in the history
* Remove useless commets

* Shuffle the code a little to make it more readable

Signed-off-by: Cyril Hrubis <[email protected]>
  • Loading branch information
metan-ucw committed Apr 4, 2013
1 parent be0d9d6 commit c515be2
Showing 1 changed file with 76 additions and 122 deletions.
198 changes: 76 additions & 122 deletions testcases/kernel/syscalls/getgroups/getgroups03.c
Original file line number Diff line number Diff line change
@@ -1,66 +1,31 @@
/*
* Copyright (c) International Business Machines Corp., 2001
* Ported by Wayne Boyer
* Copyright (c) Cyril Hrubis <[email protected]> 2013
*
* Copyright (c) International Business Machines Corp., 2001
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

/*
* Test Name: getgroups03
*
* Test Description:
* Verify that, getgroups() system call gets the supplementary group IDs
* of the calling process.
*
* Expected Result:
* The call succeeds in getting all the supplementary group IDs of the
* calling process. The effective group ID may or may not be returned.
*
* Algorithm:
* Setup:
* Setup signal handling.
* Pause for SIGUSR1 if option specified.
*
* Test:
* Loop if the proper options are given.
* Execute system call
* Check return code, if system call failed (return=-1)
* Log the errno and Issue a FAIL message.
* Otherwise,
* Verify the Functionality of system call
* if successful,
* Issue Functionality-Pass message.
* Otherwise,
* Issue Functionality-Fail message.
* Cleanup:
* Print errno log and/or timing stats if options given
*
* Usage: <for command-line>
* getgroups01 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
* where, -c n : Run n copies concurrently.
* -f : Turn off functionality Testing.
* -i n : Execute test n times.
* -I x : Execute test for x seconds.
* -P x : Pause for x seconds between iterations.
* -t : Turn on syscall timing.
*
* HISTORY
* 07/2001 Ported by Wayne Boyer
*
* RESTRICTIONS:
*
*/

#include <stdio.h>
Expand All @@ -77,28 +42,24 @@
#include "test.h"
#include "usctest.h"

#define TESTUSER "root"
#define PRESENT 1
#define NOT_PRESENT 0
#define TESTUSER "root"

char *TCID = "getgroups03"; /* Test program identifier. */
int TST_TOTAL = 1; /* Total number of test conditions */
int ngroups; /* No. of groups */
gid_t groups_list[NGROUPS]; /* Array to hold gids for getgroups() */
gid_t groups[NGROUPS]; /* Array to hold gids read fr. /etc/group */
int fflag; /* functionality flag variable */
char *TCID = "getgroups03";
int TST_TOTAL = 1;

int verify_groups(int); /* function to verify groups returned */
int readgroups(gid_t *); /* function to read gids of testuser */
void setup(); /* setup function for the test */
void cleanup(); /* cleanup function for the test */
static int ngroups;
static gid_t groups_list[NGROUPS];
static gid_t groups[NGROUPS];

static void verify_groups(int ret_ngroups);
static void setup(void);
static void cleanup(void);

int main(int ac, char **av)
{
int lc;
char *msg;
int ret_val;
int gidsetsize = NGROUPS; /* total groups */
int gidsetsize = NGROUPS;

if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL)
tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
Expand All @@ -111,59 +72,31 @@ int main(int ac, char **av)

TEST(getgroups(gidsetsize, groups_list));

if ((ret_val = TEST_RETURN) == -1) {
if (TEST_RETURN == -1) {
tst_resm(TFAIL | TTERRNO, "getgroups failed");
continue;
}
if (STD_FUNCTIONAL_TEST) {
fflag = verify_groups(ret_val);
if (fflag)
tst_resm(TPASS,
"getgroups functionality correct");
} else
tst_resm(TPASS, "call succeeded");

if (STD_FUNCTIONAL_TEST)
verify_groups(TEST_RETURN);
else
tst_resm(TPASS, "getgroups succeeded");
}

cleanup();

tst_exit();
}

void setup()
{

tst_require_root(NULL);

tst_sig(NOFORK, DEF_HANDLER, cleanup);

TEST_PAUSE;

/*
* Get the IDs of all the groups of "root"
* from /etc/group file
*/
ngroups = readgroups(groups);

/* Setgroups is called by the login(1) process
* if the testcase is executed via an ssh session this
* testcase will fail. So execute setgroups() before executing
* getgroups()
*/
if (setgroups(ngroups, groups) == -1)
tst_brkm(TBROK | TERRNO, cleanup, "setgroups failed");

}

/*
* readgroups(gid_t *) - Read supplimentary group ids of "root" user
* Scans the /etc/group file to get IDs of all the groups to which TESTUSER
* belongs and puts them into the array passed.
* Returns the no of gids read.
*/
int readgroups(gid_t groups[NGROUPS])
static int readgroups(gid_t groups[NGROUPS])
{
struct group *grp; /* To hold the group entry */
int ngrps = 0; /* No of groups */
struct group *grp;
int ngrps = 0;
int i;
int found;
gid_t g;
Expand Down Expand Up @@ -196,7 +129,30 @@ int readgroups(gid_t groups[NGROUPS])
groups[ngrps++] = g;

endgrent();
return (ngrps);
return ngrps;
}

static void setup(void)
{
tst_require_root(NULL);

tst_sig(NOFORK, DEF_HANDLER, cleanup);

TEST_PAUSE;

/*
* Get the IDs of all the groups of "root"
* from /etc/group file
*/
ngroups = readgroups(groups);

/* Setgroups is called by the login(1) process
* if the testcase is executed via an ssh session this
* testcase will fail. So execute setgroups() before executing
* getgroups()
*/
if (setgroups(ngroups, groups) == -1)
tst_brkm(TBROK | TERRNO, cleanup, "setgroups failed");
}

/*
Expand All @@ -206,14 +162,12 @@ int readgroups(gid_t groups[NGROUPS])
* This function returns flag value which indicates success or failure
* of verification.
*/
int verify_groups(int ret_val)
static void verify_groups(int ret_ngroups)
{
int i, j; /* counter variables */
gid_t egid; /* Effective gid of the process */
int egid_flag = PRESENT; /* egid present or not */

/* Set the functionality flag */
fflag = 1;
int i, j;
gid_t egid;
int egid_flag = 1;
int fflag = 1;

/*
* Loop through the array to verify the gids
Expand All @@ -222,7 +176,7 @@ int verify_groups(int ret_val)
* returned by getgroups() with that read from
* group file.
*/
for (i = 0; i < ret_val; i++) {
for (i = 0; i < ret_ngroups; i++) {
for (j = 0; j < ngroups; j++) {
if (groups_list[i] != groups[j]) {
/* If loop ends and gids are not matching */
Expand All @@ -234,23 +188,23 @@ int verify_groups(int ret_val)
} else {
continue;
}
} else { /* if equal, continue the outer loop */
} else {
break;
}
}
}

/* Now do the reverse comparison */
egid = getegid(); /* get egid */
egid = getegid();
for (i = 0; i < ngroups; i++) {
for (j = 0; j < ret_val; j++) {
for (j = 0; j < ret_ngroups; j++) {
if (groups[i] != groups_list[j]) {
/*
* If the loop ends & gids are not matching
* if gid is not egid, exit with error
* else egid is returned by getgroups()
*/
if (j == (ret_val - 1)) {
if (j == (ret_ngroups - 1)) {
if (groups[i] != egid) {
tst_resm(TFAIL, "getgroups "
"didn't return %d one "
Expand All @@ -263,10 +217,10 @@ int verify_groups(int ret_val)
* group_list.
* Reset the egid flag
*/
egid_flag = NOT_PRESENT;
egid_flag = 0;
}
}
} else { /* if equal, continue the outer loop */
} else {
break;
}
}
Expand All @@ -279,20 +233,20 @@ int verify_groups(int ret_val)
* Now, if ngroups matches ret_val, as above comparisons of the array
* are successful, this implies that the array contents match.
*/
if (egid_flag == 0) /* If egid is not returned */
if (egid_flag == 0)
ngroups--;
if (ngroups != ret_val) {
if (ngroups != ret_ngroups) {
tst_resm(TFAIL,
"getgroups(2) returned incorrect no. of gids %d "
"(expected %d)", ret_val, ngroups);
"(expected %d)", ret_ngroups, ngroups);
fflag = 0;
}

return (fflag);
if (fflag)
tst_resm(TPASS, "getgroups functionality correct");
}

void cleanup()
static void cleanup(void)
{
TEST_CLEANUP;

}

0 comments on commit c515be2

Please sign in to comment.