summaryrefslogtreecommitdiff
path: root/tests/ioprio.c
blob: 5d998a225db0b3d10e49fd6f75832613c9985771 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
 * Check decoding of ioprio_get and ioprio_set syscalls.
 *
 * Copyright (c) 2016 Eugene Syromyatnikov <evgsyr@gmail.com>
 * Copyright (c) 2016-2020 The strace developers.
 * All rights reserved.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#include "tests.h"
#include "scno.h"
#include "pidns.h"

#if defined(__NR_ioprio_get) && defined(__NR_ioprio_set)

# include <stdio.h>
# include <unistd.h>

enum {
	IOPRIO_CLASS_NONE,
	IOPRIO_CLASS_RT,
	IOPRIO_CLASS_BE,
	IOPRIO_CLASS_IDLE
};

# include "xlat.h"
# include "xlat/ioprio_class.h"

int
main(void)
{
	PIDNS_TEST_INIT;

	static const kernel_ulong_t bogus_which =
		(kernel_ulong_t) 0xdeadfacefa57beefULL;
	static const kernel_ulong_t bogus_who =
		(kernel_ulong_t) 0xbadc0dedda7a1057ULL;
	static const kernel_ulong_t bogus_ioprio =
		(kernel_ulong_t) 0xdec0ded1facefeedULL;

	const int pid = getpid();
	const int pgid = getpgid(0);

# if !XLAT_RAW
	static const char * const bogus_ioprio_str =
		"IOPRIO_PRIO_VALUE(0x7d677 /* IOPRIO_CLASS_??? */, 7917)";
# endif

	long rc;
	const char *errstr;

	rc = syscall(__NR_ioprio_get, bogus_which, bogus_who);
	errstr = sprintrc(rc);
	pidns_print_leader();
# if XLAT_RAW
	printf("ioprio_get(%#x, %d) = %s\n",
	       (int) bogus_which, (int) bogus_who, errstr);
# else /* XLAT_ABBREV || XLAT_VERBOSE */
	printf("ioprio_get(%#x /* IOPRIO_WHO_??? */, %d) = %s\n",
	       (int) bogus_which, (int) bogus_who, errstr);
# endif

	rc = syscall(__NR_ioprio_get, 1, pid);
	errstr = sprintrc(rc);
	pidns_print_leader();
	printf("ioprio_get(");
# if XLAT_RAW
	printf("0x1, ");
# elif XLAT_VERBOSE
	printf("0x1 /* IOPRIO_WHO_PROCESS */, ");
# else /* XLAT_ABBREV */
	printf("IOPRIO_WHO_PROCESS, ");
# endif
	printf("%d%s) = %s", pid, pidns_pid2str(PT_TGID), errstr);
# if !XLAT_RAW
	if (rc >= 0) {
		printf(" (IOPRIO_PRIO_VALUE(");
		printxval(ioprio_class, (unsigned int) rc >> 13,
			  "IOPRIO_CLASS_???");
		printf(", %u))", (unsigned int) rc & 0x1fff);
	}
# endif
	puts("");

	rc = syscall(__NR_ioprio_set, 2, pgid, 8191);
	errstr = sprintrc(rc);
	pidns_print_leader();
	printf("ioprio_set(");
# if XLAT_RAW
	printf("%#x", 2);
# elif XLAT_VERBOSE
	printf("%#x /* IOPRIO_WHO_PGRP */", 2);
# else /* XLAT_ABBREV */
	printf("IOPRIO_WHO_PGRP");
# endif
	printf(", %d%s", pgid, pidns_pid2str(PT_PGID));
# if XLAT_RAW
	printf(", 8191)");
# elif XLAT_VERBOSE
	printf(", 8191 /* IOPRIO_PRIO_VALUE(0 /* IOPRIO_CLASS_NONE */, 8191) */)");
# else /* XLAT_ABBREV */
	printf(", IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 8191))");
# endif
	printf(" = %s\n", errstr);

	rc = syscall(__NR_ioprio_set, bogus_which, bogus_who, bogus_ioprio);
	errstr = sprintrc(rc);
	pidns_print_leader();
# if XLAT_RAW
	printf("ioprio_set(%#x, %d, %d) = %s\n",
	       (int) bogus_which, (int) bogus_who, (int) bogus_ioprio,
	       errstr);
# elif XLAT_VERBOSE
	printf("ioprio_set(%#x /* IOPRIO_WHO_??? */, %d, %d /* %s */) = %s\n",
	       (int) bogus_which, (int) bogus_who, (int) bogus_ioprio,
	       bogus_ioprio_str, errstr);
# else /* XLAT_ABBREV */
	printf("ioprio_set(%#x /* IOPRIO_WHO_??? */, %d, %s) = %s\n",
	       (int) bogus_which, (int) bogus_who, bogus_ioprio_str,
	       errstr);
# endif

	pidns_print_leader();
	puts("+++ exited with 0 +++");

	return 0;
}

#else

SKIP_MAIN_UNDEFINED("__NR_ioprio_get && __NR_ioprio_set");

#endif