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