t_setdomainname.c revision 276478
1219820Sjeff/* $NetBSD: t_setdomainname.c,v 1.2 2012/03/25 08:17:54 joerg Exp $ */
2219820Sjeff
3219820Sjeff/*-
4219820Sjeff * Copyright (c) 2011 The NetBSD Foundation, Inc.
5219820Sjeff * All rights reserved.
6219820Sjeff *
7219820Sjeff * This code is derived from software contributed to The NetBSD Foundation
8219820Sjeff * by Jukka Ruohonen.
9219820Sjeff *
10219820Sjeff * Redistribution and use in source and binary forms, with or without
11219820Sjeff * modification, are permitted provided that the following conditions
12219820Sjeff * are met:
13219820Sjeff * 1. Redistributions of source code must retain the above copyright
14219820Sjeff *    notice, this list of conditions and the following disclaimer.
15219820Sjeff * 2. Redistributions in binary form must reproduce the above copyright
16219820Sjeff *    notice, this list of conditions and the following disclaimer in the
17219820Sjeff *    documentation and/or other materials provided with the distribution.
18219820Sjeff *
19219820Sjeff * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20219820Sjeff * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21219820Sjeff * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22219820Sjeff * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23219820Sjeff * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24219820Sjeff * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25219820Sjeff * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26219820Sjeff * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27219820Sjeff * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28219820Sjeff * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29219820Sjeff * POSSIBILITY OF SUCH DAMAGE.
30219820Sjeff */
31219820Sjeff#include <sys/cdefs.h>
32219820Sjeff__RCSID("$NetBSD: t_setdomainname.c,v 1.2 2012/03/25 08:17:54 joerg Exp $");
33219820Sjeff
34219820Sjeff#include <sys/param.h>
35219820Sjeff
36219820Sjeff#include <atf-c.h>
37219820Sjeff#include <errno.h>
38219820Sjeff#include <string.h>
39271127Shselasky#include <unistd.h>
40219820Sjeff
41219820Sjeffstatic char domain[MAXHOSTNAMELEN];
42255932Salfred
43219820Sjeffstatic const char domains[][MAXHOSTNAMELEN] = {
44219820Sjeff	"1234567890",
45219820Sjeff	"abcdefghijklmnopqrst",
46219820Sjeff	"!#\xa4%&/(..xasS812=!=!(I(!;X;;X.as.dasa=?;,..<>|**^\xa8",
47219820Sjeff	"--------------------------------------------------------------------"
48219820Sjeff};
49219820Sjeff
50219820SjeffATF_TC_WITH_CLEANUP(setdomainname_basic);
51219820SjeffATF_TC_HEAD(setdomainname_basic, tc)
52219820Sjeff{
53219820Sjeff	atf_tc_set_md_var(tc, "descr", "A basic test of setdomainname(3)");
54219820Sjeff	atf_tc_set_md_var(tc, "require.user", "root");
55219820Sjeff}
56219820Sjeff
57219820SjeffATF_TC_BODY(setdomainname_basic, tc)
58219820Sjeff{
59219820Sjeff	char name[MAXHOSTNAMELEN];
60219820Sjeff	size_t i;
61219820Sjeff
62219820Sjeff	for (i = 0; i < __arraycount(domains); i++) {
63219820Sjeff
64219820Sjeff		(void)memset(name, 0, sizeof(name));
65219820Sjeff
66219820Sjeff#ifdef __FreeBSD__
67219820Sjeff		/*
68219820Sjeff		 * Sanity checks to ensure that the wrong invariant isn't being
69219820Sjeff		 * tested for per PR # 181127
70219820Sjeff		 */
71219820Sjeff		ATF_REQUIRE_EQ(sizeof(domains[i]), MAXHOSTNAMELEN);
72219820Sjeff		ATF_REQUIRE_EQ(sizeof(name), MAXHOSTNAMELEN);
73219820Sjeff
74219820Sjeff		ATF_REQUIRE(setdomainname(domains[i],sizeof(domains[i]) -  1) == 0);
75219820Sjeff		ATF_REQUIRE(getdomainname(name, sizeof(name) - 1) == 0);
76219820Sjeff#else
77219820Sjeff		ATF_REQUIRE(setdomainname(domains[i],sizeof(domains[i])) == 0);
78219820Sjeff		ATF_REQUIRE(getdomainname(name, sizeof(name)) == 0);
79219820Sjeff#endif
80219820Sjeff		ATF_REQUIRE(strcmp(domains[i], name) == 0);
81219820Sjeff	}
82219820Sjeff
83219820Sjeff	(void)setdomainname(domain, sizeof(domain));
84219820Sjeff}
85219820Sjeff
86219820SjeffATF_TC_CLEANUP(setdomainname_basic, tc)
87219820Sjeff{
88219820Sjeff	(void)setdomainname(domain, sizeof(domain));
89219820Sjeff}
90219820Sjeff
91219820SjeffATF_TC_WITH_CLEANUP(setdomainname_limit);
92219820SjeffATF_TC_HEAD(setdomainname_limit, tc)
93219820Sjeff{
94219820Sjeff	atf_tc_set_md_var(tc, "descr", "Too long domain name errors out?");
95219820Sjeff	atf_tc_set_md_var(tc, "require.user", "root");
96219820Sjeff}
97219820Sjeff
98219820SjeffATF_TC_BODY(setdomainname_limit, tc)
99219820Sjeff{
100219820Sjeff	char name[MAXHOSTNAMELEN + 1];
101219820Sjeff
102219820Sjeff	(void)memset(name, 0, sizeof(name));
103219820Sjeff
104219820Sjeff#ifdef __FreeBSD__
105219820Sjeff	ATF_REQUIRE(setdomainname(name, MAXHOSTNAMELEN - 1 ) == 0);
106219820Sjeff	ATF_REQUIRE(setdomainname(name, MAXHOSTNAMELEN) == -1);
107219820Sjeff#endif
108255932Salfred	ATF_REQUIRE(setdomainname(name, sizeof(name)) == -1);
109219820Sjeff}
110219820Sjeff
111219820SjeffATF_TC_CLEANUP(setdomainname_limit, tc)
112219820Sjeff{
113219820Sjeff	(void)setdomainname(domain, sizeof(domain));
114219820Sjeff}
115219820Sjeff
116219820SjeffATF_TC_WITH_CLEANUP(setdomainname_perm);
117219820SjeffATF_TC_HEAD(setdomainname_perm, tc)
118219820Sjeff{
119219820Sjeff	atf_tc_set_md_var(tc, "descr", "Can normal user set the domain name?");
120219820Sjeff	atf_tc_set_md_var(tc, "require.user", "unprivileged");
121219820Sjeff}
122219820Sjeff
123219820SjeffATF_TC_BODY(setdomainname_perm, tc)
124219820Sjeff{
125219820Sjeff
126219820Sjeff	errno = 0;
127219820Sjeff
128219820Sjeff	ATF_REQUIRE_ERRNO(EPERM, setdomainname(domain, sizeof(domain)) == -1);
129219820Sjeff}
130219820Sjeff
131219820SjeffATF_TC_CLEANUP(setdomainname_perm, tc)
132219820Sjeff{
133219820Sjeff	(void)setdomainname(domain, sizeof(domain));
134219820Sjeff}
135219820Sjeff
136219820SjeffATF_TP_ADD_TCS(tp)
137219820Sjeff{
138219820Sjeff
139219820Sjeff	(void)memset(domain, 0, sizeof(domain));
140219820Sjeff
141219820Sjeff	ATF_REQUIRE(getdomainname(domain, sizeof(domain)) == 0);
142219820Sjeff
143219820Sjeff	ATF_TP_ADD_TC(tp, setdomainname_basic);
144219820Sjeff	ATF_TP_ADD_TC(tp, setdomainname_limit);
145219820Sjeff	ATF_TP_ADD_TC(tp, setdomainname_perm);
146219820Sjeff
147219820Sjeff	return atf_no_error();
148219820Sjeff}
149219820Sjeff