xref: /aosp_15_r20/external/strace/tests-m32/quotactl.h (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Common definitions for Linux and XFS quota tests.
3*cf84ac9aSAndroid Build Coastguard Worker  *
4*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016 Dmitry V. Levin <[email protected]>
6*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016-2018 The strace developers.
7*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
8*cf84ac9aSAndroid Build Coastguard Worker  *
9*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
10*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
11*cf84ac9aSAndroid Build Coastguard Worker  * are met:
12*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
13*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
14*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
15*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
16*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
17*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
18*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
19*cf84ac9aSAndroid Build Coastguard Worker  *
20*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*cf84ac9aSAndroid Build Coastguard Worker  */
31*cf84ac9aSAndroid Build Coastguard Worker 
32*cf84ac9aSAndroid Build Coastguard Worker #ifndef STRACE_TESTS_QUOTACTL_H
33*cf84ac9aSAndroid Build Coastguard Worker #define STRACE_TESTS_QUOTACTL_H
34*cf84ac9aSAndroid Build Coastguard Worker 
35*cf84ac9aSAndroid Build Coastguard Worker # include <inttypes.h>
36*cf84ac9aSAndroid Build Coastguard Worker # include <stdarg.h>
37*cf84ac9aSAndroid Build Coastguard Worker # include <stdio.h>
38*cf84ac9aSAndroid Build Coastguard Worker # include "print_fields.h"
39*cf84ac9aSAndroid Build Coastguard Worker 
40*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_LINUX_QUOTA_H
41*cf84ac9aSAndroid Build Coastguard Worker /* Broken in CentOS 5: has extern spinlock_t dq_data_lock; declaration */
42*cf84ac9aSAndroid Build Coastguard Worker #  include <linux/quota.h>
43*cf84ac9aSAndroid Build Coastguard Worker # else
44*cf84ac9aSAndroid Build Coastguard Worker #  include <linux/types.h>
45*cf84ac9aSAndroid Build Coastguard Worker /* Broken in some new glibc versions: have Q_GETNEXTQUOTA definition but no
46*cf84ac9aSAndroid Build Coastguard Worker  * struct nextdqblk defined. Fixed in glibc-2.24-106-g4d72808. */
47*cf84ac9aSAndroid Build Coastguard Worker #  include <sys/quota.h>
48*cf84ac9aSAndroid Build Coastguard Worker # endif
49*cf84ac9aSAndroid Build Coastguard Worker 
50*cf84ac9aSAndroid Build Coastguard Worker # ifndef QCMD_CMD
51*cf84ac9aSAndroid Build Coastguard Worker #  define QCMD_CMD(_val) ((unsigned) (_val) >> SUBCMDSHIFT)
52*cf84ac9aSAndroid Build Coastguard Worker # endif /* !QCMD_CMD */
53*cf84ac9aSAndroid Build Coastguard Worker 
54*cf84ac9aSAndroid Build Coastguard Worker # ifndef QCMD_TYPE
55*cf84ac9aSAndroid Build Coastguard Worker #  define QCMD_TYPE(_val) ((unsigned) (_val) & SUBCMDMASK)
56*cf84ac9aSAndroid Build Coastguard Worker # endif /* !QCMD_TYPE */
57*cf84ac9aSAndroid Build Coastguard Worker 
58*cf84ac9aSAndroid Build Coastguard Worker # ifndef PRJQUOTA
59*cf84ac9aSAndroid Build Coastguard Worker #  define PRJQUOTA 2
60*cf84ac9aSAndroid Build Coastguard Worker # endif
61*cf84ac9aSAndroid Build Coastguard Worker 
62*cf84ac9aSAndroid Build Coastguard Worker typedef void (*print_cb)(long rc, void *addr, void *arg);
63*cf84ac9aSAndroid Build Coastguard Worker 
64*cf84ac9aSAndroid Build Coastguard Worker enum check_quotactl_flag_bits {
65*cf84ac9aSAndroid Build Coastguard Worker 	CQF_ID_SKIP_BIT,
66*cf84ac9aSAndroid Build Coastguard Worker 	CQF_ID_STR_BIT,
67*cf84ac9aSAndroid Build Coastguard Worker 	CQF_ADDR_SKIP_BIT,
68*cf84ac9aSAndroid Build Coastguard Worker 	CQF_ADDR_STR_BIT,
69*cf84ac9aSAndroid Build Coastguard Worker 	CQF_ADDR_CB_BIT,
70*cf84ac9aSAndroid Build Coastguard Worker };
71*cf84ac9aSAndroid Build Coastguard Worker 
72*cf84ac9aSAndroid Build Coastguard Worker enum check_quotactl_flags {
73*cf84ac9aSAndroid Build Coastguard Worker 	CQF_NONE,
74*cf84ac9aSAndroid Build Coastguard Worker 	CQF_ID_SKIP   = 1 << CQF_ID_SKIP_BIT,
75*cf84ac9aSAndroid Build Coastguard Worker 	CQF_ID_STR    = 1 << CQF_ID_STR_BIT,
76*cf84ac9aSAndroid Build Coastguard Worker 	CQF_ADDR_SKIP = 1 << CQF_ADDR_SKIP_BIT,
77*cf84ac9aSAndroid Build Coastguard Worker 	CQF_ADDR_STR  = 1 << CQF_ADDR_STR_BIT,
78*cf84ac9aSAndroid Build Coastguard Worker 	CQF_ADDR_CB   = 1 << CQF_ADDR_CB_BIT,
79*cf84ac9aSAndroid Build Coastguard Worker };
80*cf84ac9aSAndroid Build Coastguard Worker 
81*cf84ac9aSAndroid Build Coastguard Worker static const char *errstr;
82*cf84ac9aSAndroid Build Coastguard Worker 
83*cf84ac9aSAndroid Build Coastguard Worker /**
84*cf84ac9aSAndroid Build Coastguard Worker  * Generic quotactl syscall checker function.  Call convention:
85*cf84ac9aSAndroid Build Coastguard Worker  *
86*cf84ac9aSAndroid Build Coastguard Worker  *     check_quota(flags, cmd, cmd_str, special, special_str
87*cf84ac9aSAndroid Build Coastguard Worker  *		   [, id [, id_str]]
88*cf84ac9aSAndroid Build Coastguard Worker  *		   [, addr [, { addr_cb, addr_cb_arg | addr_str }]])
89*cf84ac9aSAndroid Build Coastguard Worker  *
90*cf84ac9aSAndroid Build Coastguard Worker  * check_quota performs a syscall invocation and prints the expected output
91*cf84ac9aSAndroid Build Coastguard Worker  * for it.
92*cf84ac9aSAndroid Build Coastguard Worker  *
93*cf84ac9aSAndroid Build Coastguard Worker  * It might be useful to employ ARG_STR macro for passing cmd/cmd_str,
94*cf84ac9aSAndroid Build Coastguard Worker  * special_special_str, id/id_str, and addr/addr_str argument pairs.
95*cf84ac9aSAndroid Build Coastguard Worker  *
96*cf84ac9aSAndroid Build Coastguard Worker  * @param flags Check flags:
97*cf84ac9aSAndroid Build Coastguard Worker  *               - CQF_ID_SKIP: the "id" syscall argument is ignored
98*cf84ac9aSAndroid Build Coastguard Worker  *                 in the syscall invocation.  No id and id_str arguments
99*cf84ac9aSAndroid Build Coastguard Worker  *                 should be provided if this flag is set.
100*cf84ac9aSAndroid Build Coastguard Worker  *                 This flag has priority over the CQF_ID_STR flag.
101*cf84ac9aSAndroid Build Coastguard Worker  *               - CQF_ID_STR: the "id" syscall argument has a special string
102*cf84ac9aSAndroid Build Coastguard Worker  *                 representation.  id_str argument should be provided if this
103*cf84ac9aSAndroid Build Coastguard Worker  *                 flag is set; no id_str argument should be provided and id
104*cf84ac9aSAndroid Build Coastguard Worker  *                 argument is printed as unsigned integer (with an exception
105*cf84ac9aSAndroid Build Coastguard Worker  *                 for -1, which is printed as signed) if this flag is not set.
106*cf84ac9aSAndroid Build Coastguard Worker  *               - CQF_ADDR_SKIP: the "addr" syscall argument is ignored
107*cf84ac9aSAndroid Build Coastguard Worker  *                 in the syscall invocation.  None of the addr, addr_cb,
108*cf84ac9aSAndroid Build Coastguard Worker  *                 addr_cb_arg, and/or addr_str arguments should be provided
109*cf84ac9aSAndroid Build Coastguard Worker  *                 if this flag is set.  This flag has priority
110*cf84ac9aSAndroid Build Coastguard Worker  *                 over the CQF_ADDR_STR and CQF_ADDR_CB flags.
111*cf84ac9aSAndroid Build Coastguard Worker  *               - CQF_ADDR_CB: the "addr" syscall argument printing is handled
112*cf84ac9aSAndroid Build Coastguard Worker  *                 via a callback function.  addr_cb (that points to a callback
113*cf84ac9aSAndroid Build Coastguard Worker  *                 function of type print_cb) and addr_cb_arg (an opaque pointer
114*cf84ac9aSAndroid Build Coastguard Worker  *                 that is passed to addr_cb in the third argument) should
115*cf84ac9aSAndroid Build Coastguard Worker  *                 be provided if this flag is set.
116*cf84ac9aSAndroid Build Coastguard Worker  *                 This flag has priority over the CQF_ADDR_STR flag.
117*cf84ac9aSAndroid Build Coastguard Worker  *               - CQF_ADDR_STR: addr syscall argument has a special string
118*cf84ac9aSAndroid Build Coastguard Worker  *                 representation.  addr_str argument should be provided if this
119*cf84ac9aSAndroid Build Coastguard Worker  *                 flag is set.  If both CQF_ADDR_CB and CQF_ADDR_STR flags
120*cf84ac9aSAndroid Build Coastguard Worker  *                 are not set, addr syscall argument is printed using "%p"
121*cf84ac9aSAndroid Build Coastguard Worker  *                 printf format.
122*cf84ac9aSAndroid Build Coastguard Worker  * @param cmd Value of the "cmd" syscall argument that should be passed
123*cf84ac9aSAndroid Build Coastguard Worker  *            in the syscall invocation.
124*cf84ac9aSAndroid Build Coastguard Worker  * @param cmd_str String representation of the "cmd" syscall argument.
125*cf84ac9aSAndroid Build Coastguard Worker  * @param special Value of the "special" syscall argument that should be passed
126*cf84ac9aSAndroid Build Coastguard Worker  *                in the syscall invocation.
127*cf84ac9aSAndroid Build Coastguard Worker  * @param special_str String representation of the "special" syscall argument.
128*cf84ac9aSAndroid Build Coastguard Worker  * @param ... Additional arguments depend on the flags being set:
129*cf84ac9aSAndroid Build Coastguard Worker  *             - id: Value of the "id" syscall argument.  Provided
130*cf84ac9aSAndroid Build Coastguard Worker  *               if CQF_ID_SKIP is not set, otherwise -1 is passed
131*cf84ac9aSAndroid Build Coastguard Worker  *               in the syscall invocation and the argument is not printed
132*cf84ac9aSAndroid Build Coastguard Worker  *               in the expected output.
133*cf84ac9aSAndroid Build Coastguard Worker  *             - id_str: String representation of the "id" syscall argument.
134*cf84ac9aSAndroid Build Coastguard Worker  *               Provided if CQF_ID_SKIP is not set and CQF_ID_STR is set.
135*cf84ac9aSAndroid Build Coastguard Worker  *             - addr: Value of the "addr" syscall argument.  Provided
136*cf84ac9aSAndroid Build Coastguard Worker  *               if CQF_ADDR_SKIP is not set, otherwise NULL is passed
137*cf84ac9aSAndroid Build Coastguard Worker  *               in the syscall invocation and the argument is not printed
138*cf84ac9aSAndroid Build Coastguard Worker  *               in the expected output.
139*cf84ac9aSAndroid Build Coastguard Worker  *             - addr_cb: Callback function that is called for the "addr"
140*cf84ac9aSAndroid Build Coastguard Worker  *               syscall argument printing. Should be of print_cb type.
141*cf84ac9aSAndroid Build Coastguard Worker  *               Provided if CQF_ADDR_SKIP is not set and CQF_ADDR_CB is set.
142*cf84ac9aSAndroid Build Coastguard Worker  *             - addr_cb_arg: Opaque pointer that is passed to addr_cb,
143*cf84ac9aSAndroid Build Coastguard Worker  *               Provided if CQF_ADDR_SKIP is not set and CQF_ADDR_CB is set.
144*cf84ac9aSAndroid Build Coastguard Worker  *             - addr_str: String representation of the "addr" syscall argument.
145*cf84ac9aSAndroid Build Coastguard Worker  *               Provided if CQF_ADDR_SKIP is not set, CQF_ADDR_CB is not set,
146*cf84ac9aSAndroid Build Coastguard Worker  *               and CQF_ADDR_STR is set.
147*cf84ac9aSAndroid Build Coastguard Worker  */
148*cf84ac9aSAndroid Build Coastguard Worker static inline void
check_quota(uint32_t flags,int cmd,const char * cmd_str,const char * special,const char * special_str,...)149*cf84ac9aSAndroid Build Coastguard Worker check_quota(uint32_t flags, int cmd, const char *cmd_str,
150*cf84ac9aSAndroid Build Coastguard Worker 	const char *special, const char *special_str, ...)
151*cf84ac9aSAndroid Build Coastguard Worker {
152*cf84ac9aSAndroid Build Coastguard Worker 	long rc;
153*cf84ac9aSAndroid Build Coastguard Worker 	const char *addr_str = NULL;
154*cf84ac9aSAndroid Build Coastguard Worker 	const char *id_str = NULL;
155*cf84ac9aSAndroid Build Coastguard Worker 	void *addr = NULL;
156*cf84ac9aSAndroid Build Coastguard Worker 	print_cb addr_cb = NULL;
157*cf84ac9aSAndroid Build Coastguard Worker 	void *addr_cb_arg = NULL;
158*cf84ac9aSAndroid Build Coastguard Worker 	uint32_t id = -1;
159*cf84ac9aSAndroid Build Coastguard Worker 
160*cf84ac9aSAndroid Build Coastguard Worker 	va_list ap;
161*cf84ac9aSAndroid Build Coastguard Worker 
162*cf84ac9aSAndroid Build Coastguard Worker 	va_start(ap, special_str);
163*cf84ac9aSAndroid Build Coastguard Worker 
164*cf84ac9aSAndroid Build Coastguard Worker 	if (!(flags & CQF_ID_SKIP)) {
165*cf84ac9aSAndroid Build Coastguard Worker 		id = va_arg(ap, uint32_t);
166*cf84ac9aSAndroid Build Coastguard Worker 
167*cf84ac9aSAndroid Build Coastguard Worker 		if (flags & CQF_ID_STR)
168*cf84ac9aSAndroid Build Coastguard Worker 			id_str = va_arg(ap, const char *);
169*cf84ac9aSAndroid Build Coastguard Worker 	}
170*cf84ac9aSAndroid Build Coastguard Worker 
171*cf84ac9aSAndroid Build Coastguard Worker 	if (!(flags & CQF_ADDR_SKIP)) {
172*cf84ac9aSAndroid Build Coastguard Worker 		addr = va_arg(ap, void *);
173*cf84ac9aSAndroid Build Coastguard Worker 
174*cf84ac9aSAndroid Build Coastguard Worker 		if (flags & CQF_ADDR_CB) {
175*cf84ac9aSAndroid Build Coastguard Worker 			addr_cb = va_arg(ap, print_cb);
176*cf84ac9aSAndroid Build Coastguard Worker 			addr_cb_arg = va_arg(ap, void *);
177*cf84ac9aSAndroid Build Coastguard Worker 		} else if (flags & CQF_ADDR_STR) {
178*cf84ac9aSAndroid Build Coastguard Worker 			addr_str = va_arg(ap, const char *);
179*cf84ac9aSAndroid Build Coastguard Worker 		}
180*cf84ac9aSAndroid Build Coastguard Worker 	}
181*cf84ac9aSAndroid Build Coastguard Worker 
182*cf84ac9aSAndroid Build Coastguard Worker 	va_end(ap);
183*cf84ac9aSAndroid Build Coastguard Worker 
184*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_quotactl, cmd, special, id, addr);
185*cf84ac9aSAndroid Build Coastguard Worker 
186*cf84ac9aSAndroid Build Coastguard Worker 	errstr = sprintrc(rc);
187*cf84ac9aSAndroid Build Coastguard Worker 
188*cf84ac9aSAndroid Build Coastguard Worker #ifdef INJECT_RETVAL
189*cf84ac9aSAndroid Build Coastguard Worker 	if (rc != INJECT_RETVAL)
190*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_fail("Got a return value of %ld != %d",
191*cf84ac9aSAndroid Build Coastguard Worker 				   rc, INJECT_RETVAL);
192*cf84ac9aSAndroid Build Coastguard Worker 
193*cf84ac9aSAndroid Build Coastguard Worker 	static char inj_errstr[4096];
194*cf84ac9aSAndroid Build Coastguard Worker 
195*cf84ac9aSAndroid Build Coastguard Worker 	snprintf(inj_errstr, sizeof(inj_errstr), "%s (INJECTED)", errstr);
196*cf84ac9aSAndroid Build Coastguard Worker 	errstr = inj_errstr;
197*cf84ac9aSAndroid Build Coastguard Worker #endif
198*cf84ac9aSAndroid Build Coastguard Worker 
199*cf84ac9aSAndroid Build Coastguard Worker 	printf("quotactl(%s, %s", cmd_str, special_str);
200*cf84ac9aSAndroid Build Coastguard Worker 
201*cf84ac9aSAndroid Build Coastguard Worker 	if (!(flags & CQF_ID_SKIP)) {
202*cf84ac9aSAndroid Build Coastguard Worker 		if (flags & CQF_ID_STR) {
203*cf84ac9aSAndroid Build Coastguard Worker 			printf(", %s", id_str);
204*cf84ac9aSAndroid Build Coastguard Worker 		} else {
205*cf84ac9aSAndroid Build Coastguard Worker 			if (id == (uint32_t)-1)
206*cf84ac9aSAndroid Build Coastguard Worker 				printf(", -1");
207*cf84ac9aSAndroid Build Coastguard Worker 			else
208*cf84ac9aSAndroid Build Coastguard Worker 				printf(", %u", id);
209*cf84ac9aSAndroid Build Coastguard Worker 		}
210*cf84ac9aSAndroid Build Coastguard Worker 	}
211*cf84ac9aSAndroid Build Coastguard Worker 
212*cf84ac9aSAndroid Build Coastguard Worker 	if (!(flags & CQF_ADDR_SKIP)) {
213*cf84ac9aSAndroid Build Coastguard Worker 		if (flags & CQF_ADDR_CB) {
214*cf84ac9aSAndroid Build Coastguard Worker 			printf(", ");
215*cf84ac9aSAndroid Build Coastguard Worker 			addr_cb(rc, addr, addr_cb_arg);
216*cf84ac9aSAndroid Build Coastguard Worker 		} else if (flags & CQF_ADDR_STR) {
217*cf84ac9aSAndroid Build Coastguard Worker 			printf(", %s", addr_str);
218*cf84ac9aSAndroid Build Coastguard Worker 		} else {
219*cf84ac9aSAndroid Build Coastguard Worker 			printf(", %p", addr);
220*cf84ac9aSAndroid Build Coastguard Worker 		}
221*cf84ac9aSAndroid Build Coastguard Worker 	}
222*cf84ac9aSAndroid Build Coastguard Worker 
223*cf84ac9aSAndroid Build Coastguard Worker 	printf(") = %s\n", errstr);
224*cf84ac9aSAndroid Build Coastguard Worker }
225*cf84ac9aSAndroid Build Coastguard Worker 
226*cf84ac9aSAndroid Build Coastguard Worker 
227*cf84ac9aSAndroid Build Coastguard Worker static const int bogus_cmd = 0xbadc0ded;
228*cf84ac9aSAndroid Build Coastguard Worker static const int bogus_id = 0xca7faced;
229*cf84ac9aSAndroid Build Coastguard Worker 
230*cf84ac9aSAndroid Build Coastguard Worker /* It is invalid anyway due to the slash in the end */
231*cf84ac9aSAndroid Build Coastguard Worker static const char *bogus_dev = "/dev/bogus/";
232*cf84ac9aSAndroid Build Coastguard Worker static const char *bogus_dev_str = "\"/dev/bogus/\"";
233*cf84ac9aSAndroid Build Coastguard Worker 
234*cf84ac9aSAndroid Build Coastguard Worker static const char unterminated_data[] = { '\1', '\2', '\3' };
235*cf84ac9aSAndroid Build Coastguard Worker 
236*cf84ac9aSAndroid Build Coastguard Worker #endif /* !STRACE_TESTS_QUOTACTL_H */
237