xref: /aosp_15_r20/external/ltp/testcases/kernel/containers/utsname/utsname02.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2023 SUSE LLC Andrea Cervesato <[email protected]>
4  */
5 
6 /*\
7  * [Description]
8  *
9  * Clone two plain processes, change hostname in the first one then check if
10  * hostaname has changed inside the second one as well.
11  */
12 
13 #define _GNU_SOURCE
14 
15 #include "tst_test.h"
16 
17 #define HOSTNAME "LTP_HOSTNAME"
18 
19 static char *hostname1;
20 static char *hostname2;
21 static char originalhost[HOST_NAME_MAX];
22 
reset_hostname(void)23 static void reset_hostname(void)
24 {
25 	SAFE_SETHOSTNAME(originalhost, strlen(originalhost));
26 }
27 
run(void)28 static void run(void)
29 {
30 	memset(hostname1, 0, HOST_NAME_MAX);
31 	memset(hostname2, 0, HOST_NAME_MAX);
32 
33 	if (!SAFE_FORK()) {
34 		SAFE_SETHOSTNAME(HOSTNAME, strlen(HOSTNAME));
35 		SAFE_GETHOSTNAME(hostname1, HOST_NAME_MAX);
36 
37 		TST_CHECKPOINT_WAKE(0);
38 		return;
39 	}
40 
41 	if (!SAFE_FORK()) {
42 		TST_CHECKPOINT_WAIT(0);
43 
44 		SAFE_GETHOSTNAME(hostname2, HOST_NAME_MAX);
45 		return;
46 	}
47 
48 	tst_reap_children();
49 
50 	TST_EXP_PASS(strcmp(hostname1, HOSTNAME));
51 	TST_EXP_PASS(strcmp(hostname2, HOSTNAME));
52 
53 	reset_hostname();
54 }
55 
setup(void)56 static void setup(void)
57 {
58 	hostname1 = SAFE_MMAP(NULL, HOST_NAME_MAX, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
59 	hostname2 = SAFE_MMAP(NULL, HOST_NAME_MAX, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
60 
61 	memset(originalhost, 0, HOST_NAME_MAX);
62 
63 	SAFE_GETHOSTNAME(originalhost, HOST_NAME_MAX);
64 }
65 
cleanup(void)66 static void cleanup(void)
67 {
68 	SAFE_MUNMAP(hostname1, HOST_NAME_MAX);
69 	SAFE_MUNMAP(hostname2, HOST_NAME_MAX);
70 
71 	reset_hostname();
72 }
73 
74 static struct tst_test test = {
75 	.test_all = run,
76 	.setup = setup,
77 	.cleanup = cleanup,
78 	.needs_root = 1,
79 	.forks_child = 1,
80 	.needs_checkpoints = 1,
81 };
82