xref: /aosp_15_r20/external/ltp/testcases/kernel/syscalls/setregid/setregid01.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
4  *
5  * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
6  * Mountain View, CA  94043, or:
7  *
8  * http://www.sgi.com
9  *
10  * For further information regarding this notice, see:
11  *
12  * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
13  *
14  * Author: William Roske
15  * Co-pilot: Dave Fenner
16  */
17 
18 /*\
19  * [Description]
20  *
21  * Verify the basic functionality of setregid(2) system call.
22  */
23 
24 #include "tst_test.h"
25 #include "compat_tst_16.h"
26 
27 static gid_t gid, egid;
28 static gid_t neg_one = -1;
29 
30 static struct tcase {
31 	gid_t *arg1;
32 	gid_t *arg2;
33 	const char *msg;
34 } tcases[] = {
35 	{&neg_one, &neg_one, "Leave real and effective both gids unchanged" },
36 	{&neg_one, &egid,    "Change effective to effective gid" },
37 	{&gid,     &neg_one, "Change real to real gid" },
38 	{&neg_one, &gid,     "Change effective to real gid" },
39 	{&gid,     &gid,     "Change real and effective both gids to current real gid" }
40 };
41 
run(unsigned int n)42 static void run(unsigned int n)
43 {
44 	struct tcase *tc = &tcases[n];
45 
46 	TST_EXP_PASS(SETREGID(*tc->arg1, *tc->arg2), "%s:", tc->msg);
47 }
48 
setup(void)49 static void setup(void)
50 {
51 	gid = getgid();
52 	GID16_CHECK(gid, setregid);
53 
54 	egid = getegid();
55 	GID16_CHECK(egid, setregid);
56 }
57 
58 static struct tst_test test = {
59 	.tcnt = ARRAY_SIZE(tcases),
60 	.test = run,
61 	.setup = setup,
62 };
63