blob: 40c9a4fab1962805b29efcd4a15ccf69d20eb07e [file] [log] [blame]
plars865695b2001-08-27 22:15:12 +00001/*
2 *
3 * Copyright (c) International Business Machines Corp., 2001
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13 * the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
Wanlong Gao4548c6c2012-10-19 18:03:36 +080017 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
plars865695b2001-08-27 22:15:12 +000018 */
19
subrata_modak4bb656a2009-02-26 12:02:09 +000020/*
plars865695b2001-08-27 22:15:12 +000021 * NAME
22 * sched_setscheduler01.c
23 *
24 * DESCRIPTION
25 * Testcase to test whether sched_setscheduler(2) sets the errnos
26 * correctly.
27 *
28 * ALGORITHM
29 * 1. Call sched_setscheduler as a non-root uid, and expect EPERM
30 * to be returned.
31 *
32 * USAGE: <for command-line>
33 * sched_setscheduler02 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
34 * where, -c n : Run n copies concurrently.
35 * -e : Turn on errno logging.
36 * -i n : Execute test n times.
37 * -I x : Execute test for x seconds.
38 * -P x : Pause for x seconds between iterations.
39 * -t : Turn on syscall timing.
40 *
41 * HISTORY
42 * 07/2001 Ported by Wayne Boyer
43 *
44 * RESTRICTIONS
45 * Must run test as root.
46 */
47#include <stdio.h>
48#include <errno.h>
49#include <sched.h>
50#include <pwd.h>
robbiew7edec5a2001-09-17 20:03:35 +000051#include <sys/types.h>
52#include <sys/wait.h>
plars865695b2001-08-27 22:15:12 +000053#include "test.h"
plars865695b2001-08-27 22:15:12 +000054
55#define SCHED_INVALID 99
56#define INVALID_PID 999999
57
58char *TCID = "sched_setscheduler02";
59int TST_TOTAL = 1;
plars865695b2001-08-27 22:15:12 +000060
plars865695b2001-08-27 22:15:12 +000061extern struct passwd *my_getpwnam(char *);
62
63void setup(void);
64void cleanup(void);
65
66char user1name[] = "nobody";
67
plars74948ad2002-11-14 16:16:14 +000068int main(int ac, char **av)
plars865695b2001-08-27 22:15:12 +000069{
Cyril Hrubis89af32a2012-10-24 16:39:11 +020070 int lc;
Cyril Hrubis0b9589f2014-05-27 17:40:33 +020071 const char *msg;
plars865695b2001-08-27 22:15:12 +000072
73 struct passwd *nobody;
74 pid_t pid;
plars08345602002-02-26 20:54:07 +000075 struct sched_param param;
robbiew7edec5a2001-09-17 20:03:35 +000076 int status;
subrata_modakbdbaec52009-02-26 12:14:51 +000077
Garrett Cooper45e285d2010-11-22 12:19:25 -080078 if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) {
Garrett Cooper60fa8012010-11-22 13:50:58 -080079 tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
Wanlong Gao354ebb42012-12-07 10:10:04 +080080 }
plars865695b2001-08-27 22:15:12 +000081
82 setup();
83
plars865695b2001-08-27 22:15:12 +000084 for (lc = 0; TEST_LOOPING(lc); lc++) {
85
Caspar Zhangd59a6592013-03-07 14:59:12 +080086 /* reset tst_count in case we are looping */
87 tst_count = 0;
plars865695b2001-08-27 22:15:12 +000088
robbiewd34d5812005-07-11 22:28:09 +000089 if ((pid = FORK_OR_VFORK()) == -1) {
plars865695b2001-08-27 22:15:12 +000090 tst_brkm(TBROK, cleanup, "fork failed");
91 }
92
subrata_modak56207ce2009-03-23 13:35:39 +000093 if (pid == 0) { /* child */
plars08345602002-02-26 20:54:07 +000094 param.sched_priority = 1;
plars865695b2001-08-27 22:15:12 +000095
96 nobody = my_getpwnam(user1name);
97
98 if (seteuid(nobody->pw_uid) == -1) {
99 tst_brkm(TBROK, cleanup, "seteuid() failed");
100 }
101
plars08345602002-02-26 20:54:07 +0000102 TEST(sched_setscheduler(pid, SCHED_FIFO, &param));
plars865695b2001-08-27 22:15:12 +0000103
104 if (TEST_ERRNO) {
plars865695b2001-08-27 22:15:12 +0000105 }
106
107 if (TEST_RETURN != -1) {
108 tst_resm(TFAIL, "sched_setscheduler(2) passed "
109 "with non root priveledges");
110 } else if (TEST_ERRNO != EPERM) {
111 tst_resm(TFAIL, "Expected EPERM, got %d",
112 TEST_ERRNO);
113 } else {
114 tst_resm(TPASS, "got EPERM");
115 }
subrata_modak56207ce2009-03-23 13:35:39 +0000116 } else { /* parent */
plars865695b2001-08-27 22:15:12 +0000117 /* let the child carry on */
robbiew7edec5a2001-09-17 20:03:35 +0000118 wait(&status);
subrata_modak56207ce2009-03-23 13:35:39 +0000119 if (WIFEXITED(status) != 0) { /* Exit with errors */
robbiew7edec5a2001-09-17 20:03:35 +0000120 exit(WEXITSTATUS(status));
121 } else {
122 exit(0);
123 }
plars865695b2001-08-27 22:15:12 +0000124 }
125
126 if (seteuid(0) == -1) {
127 tst_brkm(TBROK, cleanup, "seteuid(0) failed");
128 }
subrata_modakbdbaec52009-02-26 12:14:51 +0000129 }
plars865695b2001-08-27 22:15:12 +0000130 cleanup();
Garrett Cooper1e6f5a62010-12-19 09:58:10 -0800131 tst_exit();
robbiewaa01abd2003-03-27 18:39:24 +0000132
plars865695b2001-08-27 22:15:12 +0000133}
134
135/*
136 * setup() - performs all ONE TIME setup for this test.
137 */
Mike Frysingerc57fba52014-04-09 18:56:30 -0400138void setup(void)
plars865695b2001-08-27 22:15:12 +0000139{
Nicolas Jolyd4ceb372014-06-22 17:03:57 +0200140 tst_require_root(NULL);
plars865695b2001-08-27 22:15:12 +0000141
plars865695b2001-08-27 22:15:12 +0000142 tst_sig(FORK, DEF_HANDLER, cleanup);
143
plars865695b2001-08-27 22:15:12 +0000144 TEST_PAUSE;
145}
146
147/*
148 * cleanup() - performs all ONE TIME cleanup for this test at
149 * completion or premature exit.
150 */
Mike Frysingerc57fba52014-04-09 18:56:30 -0400151void cleanup(void)
plars865695b2001-08-27 22:15:12 +0000152{
plars865695b2001-08-27 22:15:12 +0000153
Chris Dearmanec6edca2012-10-17 19:54:01 -0700154}