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