1f08c3bdfSopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
2f08c3bdfSopenharmony_ci/*
3f08c3bdfSopenharmony_ci * Copyright (c) 2019 Petr Vorel <petr.vorel@gmail.com>
4f08c3bdfSopenharmony_ci */
5f08c3bdfSopenharmony_ci
6f08c3bdfSopenharmony_ci#ifndef SETDOMAINNAME_H__
7f08c3bdfSopenharmony_ci#define SETDOMAINNAME_H__
8f08c3bdfSopenharmony_ci
9f08c3bdfSopenharmony_ci#include <string.h>
10f08c3bdfSopenharmony_ci#include "tst_test.h"
11f08c3bdfSopenharmony_ci#include "lapi/utsname.h"
12f08c3bdfSopenharmony_ci#include "lapi/syscalls.h"
13f08c3bdfSopenharmony_ci
14f08c3bdfSopenharmony_ci#define TST_VALID_DOMAIN_NAME "test_dom"
15f08c3bdfSopenharmony_ci
16f08c3bdfSopenharmony_ci#ifdef TEST_SETHOSTNAME
17f08c3bdfSopenharmony_ci# define GET_SYSCALL gethostname
18f08c3bdfSopenharmony_ci# define SET_SYSCALL sethostname
19f08c3bdfSopenharmony_ci# define SYSCALL_NAME "hostname"
20f08c3bdfSopenharmony_ci# define SYSCALL_NR __NR_sethostname
21f08c3bdfSopenharmony_ci#else
22f08c3bdfSopenharmony_ci# define GET_SYSCALL getdomainname
23f08c3bdfSopenharmony_ci# define SET_SYSCALL setdomainname
24f08c3bdfSopenharmony_ci# define SYSCALL_NAME "domainname"
25f08c3bdfSopenharmony_ci# define SYSCALL_NR __NR_setdomainname
26f08c3bdfSopenharmony_ci#endif
27f08c3bdfSopenharmony_ci
28f08c3bdfSopenharmony_cistatic char backup[_UTSNAME_DOMAIN_LENGTH];
29f08c3bdfSopenharmony_ci
30f08c3bdfSopenharmony_ci#define TEST_VARIANTS 2
31f08c3bdfSopenharmony_ci
32f08c3bdfSopenharmony_cistatic void setdomainname_info(void)
33f08c3bdfSopenharmony_ci{
34f08c3bdfSopenharmony_ci	switch (tst_variant) {
35f08c3bdfSopenharmony_ci	case 0:
36f08c3bdfSopenharmony_ci		tst_res(TINFO, "Testing libc set" SYSCALL_NAME "()");
37f08c3bdfSopenharmony_ci		break;
38f08c3bdfSopenharmony_ci	case 1:
39f08c3bdfSopenharmony_ci		tst_res(TINFO, "Testing __NR_set" SYSCALL_NAME " syscall");
40f08c3bdfSopenharmony_ci		break;
41f08c3bdfSopenharmony_ci	}
42f08c3bdfSopenharmony_ci}
43f08c3bdfSopenharmony_ci
44f08c3bdfSopenharmony_cistatic int do_setdomainname(char *new, size_t len)
45f08c3bdfSopenharmony_ci{
46f08c3bdfSopenharmony_ci	switch (tst_variant) {
47f08c3bdfSopenharmony_ci	case 0:
48f08c3bdfSopenharmony_ci		return SET_SYSCALL(new, len);
49f08c3bdfSopenharmony_ci	break;
50f08c3bdfSopenharmony_ci	case 1:
51f08c3bdfSopenharmony_ci		return tst_syscall(SYSCALL_NR, new, len);
52f08c3bdfSopenharmony_ci	}
53f08c3bdfSopenharmony_ci
54f08c3bdfSopenharmony_ci	return -1;
55f08c3bdfSopenharmony_ci}
56f08c3bdfSopenharmony_ci
57f08c3bdfSopenharmony_cistatic void setup(void)
58f08c3bdfSopenharmony_ci{
59f08c3bdfSopenharmony_ci	setdomainname_info();
60f08c3bdfSopenharmony_ci	if ((GET_SYSCALL(backup, sizeof(backup))) < 0)
61f08c3bdfSopenharmony_ci		tst_brk(TBROK | TERRNO, "get" SYSCALL_NAME "() failed");
62f08c3bdfSopenharmony_ci}
63f08c3bdfSopenharmony_ci
64f08c3bdfSopenharmony_cistatic void cleanup(void)
65f08c3bdfSopenharmony_ci{
66f08c3bdfSopenharmony_ci	if ((SET_SYSCALL(backup, strlen(backup))) < 0)
67f08c3bdfSopenharmony_ci		tst_res(TWARN | TERRNO, "set" SYSCALL_NAME "() failed ('%s')", backup);
68f08c3bdfSopenharmony_ci}
69f08c3bdfSopenharmony_ci
70f08c3bdfSopenharmony_ci#endif /* SETDOMAINNAME_H__ */
71