xref: /aosp_15_r20/external/ltp/testcases/kernel/containers/sysvipc/common.h (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (c) International Business Machines Corp., 2007
4  *               Rishikesh K Rajak <[email protected]>
5  * Copyright (C) 2022 SUSE LLC Andrea Cervesato <[email protected]>
6  */
7 
8 #ifndef COMMON_H
9 #define COMMON_H
10 
11 #include <stdlib.h>
12 #include "tst_test.h"
13 #include "lapi/syscalls.h"
14 #include "lapi/sched.h"
15 
16 enum {
17 	T_CLONE,
18 	T_UNSHARE,
19 	T_NONE,
20 };
21 
get_clone_unshare_enum(const char * str_op)22 static inline int get_clone_unshare_enum(const char *str_op)
23 {
24 	int use_clone;
25 
26 	use_clone = T_NONE;
27 
28 	if (!str_op || !strcmp(str_op, "none"))
29 		use_clone = T_NONE;
30 	else if (!strcmp(str_op, "clone"))
31 		use_clone = T_CLONE;
32 	else if (!strcmp(str_op, "unshare"))
33 		use_clone = T_UNSHARE;
34 	else
35 		tst_brk(TBROK, "Test execution mode <clone|unshare|none>");
36 
37 	return use_clone;
38 }
39 
clone_test(unsigned long clone_flags,void (* fn1)())40 static void clone_test(unsigned long clone_flags, void (*fn1)())
41 {
42 	const struct tst_clone_args clone_args = {
43 		.flags = clone_flags,
44 		.exit_signal = SIGCHLD,
45 	};
46 	int pid;
47 
48 	pid = SAFE_CLONE(&clone_args);
49 	if (!pid) {
50 		fn1();
51 		exit(0);
52 	}
53 }
54 
unshare_test(unsigned long clone_flags,void (* fn1)())55 static void unshare_test(unsigned long clone_flags, void (*fn1)())
56 {
57 	int pid;
58 
59 	pid = SAFE_FORK();
60 	if (!pid) {
61 		SAFE_UNSHARE(clone_flags);
62 
63 		fn1();
64 		exit(0);
65 	}
66 }
67 
plain_test(void (* fn1)())68 static void plain_test(void (*fn1)())
69 {
70 	int pid;
71 
72 	pid = SAFE_FORK();
73 	if (!pid) {
74 		fn1();
75 		exit(0);
76 	}
77 }
78 
clone_unshare_test(int use_clone,unsigned long clone_flags,void (* fn1)())79 static void clone_unshare_test(int use_clone, unsigned long clone_flags, void (*fn1)())
80 {
81 	switch (use_clone) {
82 	case T_NONE:
83 		plain_test(fn1);
84 	break;
85 	case T_CLONE:
86 		clone_test(clone_flags, fn1);
87 	break;
88 	case T_UNSHARE:
89 		unshare_test(clone_flags, fn1);
90 	break;
91 	default:
92 		tst_brk(TBROK, "%s: bad use_clone option: %d", __FUNCTION__, use_clone);
93 	break;
94 	}
95 }
96 
97 #endif
98