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