Home | History | Annotate | Line # | Download | only in gen
      1 /* $NetBSD: t_setdomainname.c,v 1.2 2012/03/25 08:17:54 joerg Exp $ */
      2 
      3 /*-
      4  * Copyright (c) 2011 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Jukka Ruohonen.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 #include <sys/cdefs.h>
     32 __RCSID("$NetBSD: t_setdomainname.c,v 1.2 2012/03/25 08:17:54 joerg Exp $");
     33 
     34 #include <sys/param.h>
     35 
     36 #include <atf-c.h>
     37 #include <errno.h>
     38 #include <string.h>
     39 #include <unistd.h>
     40 
     41 static char domain[MAXHOSTNAMELEN];
     42 
     43 static const char domains[][MAXHOSTNAMELEN] = {
     44 	"1234567890",
     45 	"abcdefghijklmnopqrst",
     46 	"!#\xa4%&/(..xasS812=!=!(I(!;X;;X.as.dasa=?;,..<>|**^\xa8",
     47 	"--------------------------------------------------------------------"
     48 };
     49 
     50 ATF_TC_WITH_CLEANUP(setdomainname_basic);
     51 ATF_TC_HEAD(setdomainname_basic, tc)
     52 {
     53 	atf_tc_set_md_var(tc, "descr", "A basic test of setdomainname(3)");
     54 	atf_tc_set_md_var(tc, "require.user", "root");
     55 }
     56 
     57 ATF_TC_BODY(setdomainname_basic, tc)
     58 {
     59 	char name[MAXHOSTNAMELEN];
     60 	size_t i;
     61 
     62 	for (i = 0; i < __arraycount(domains); i++) {
     63 
     64 		(void)memset(name, 0, sizeof(name));
     65 
     66 		ATF_REQUIRE(setdomainname(domains[i],sizeof(domains[i])) == 0);
     67 		ATF_REQUIRE(getdomainname(name, sizeof(name)) == 0);
     68 		ATF_REQUIRE(strcmp(domains[i], name) == 0);
     69 	}
     70 
     71 	(void)setdomainname(domain, sizeof(domain));
     72 }
     73 
     74 ATF_TC_CLEANUP(setdomainname_basic, tc)
     75 {
     76 	(void)setdomainname(domain, sizeof(domain));
     77 }
     78 
     79 ATF_TC_WITH_CLEANUP(setdomainname_limit);
     80 ATF_TC_HEAD(setdomainname_limit, tc)
     81 {
     82 	atf_tc_set_md_var(tc, "descr", "Too long domain name errors out?");
     83 	atf_tc_set_md_var(tc, "require.user", "root");
     84 }
     85 
     86 ATF_TC_BODY(setdomainname_limit, tc)
     87 {
     88 	char name[MAXHOSTNAMELEN + 1];
     89 
     90 	(void)memset(name, 0, sizeof(name));
     91 
     92 	ATF_REQUIRE(setdomainname(name, sizeof(name)) == -1);
     93 }
     94 
     95 ATF_TC_CLEANUP(setdomainname_limit, tc)
     96 {
     97 	(void)setdomainname(domain, sizeof(domain));
     98 }
     99 
    100 ATF_TC_WITH_CLEANUP(setdomainname_perm);
    101 ATF_TC_HEAD(setdomainname_perm, tc)
    102 {
    103 	atf_tc_set_md_var(tc, "descr", "Can normal user set the domain name?");
    104 	atf_tc_set_md_var(tc, "require.user", "unprivileged");
    105 }
    106 
    107 ATF_TC_BODY(setdomainname_perm, tc)
    108 {
    109 
    110 	errno = 0;
    111 
    112 	ATF_REQUIRE_ERRNO(EPERM, setdomainname(domain, sizeof(domain)) == -1);
    113 }
    114 
    115 ATF_TC_CLEANUP(setdomainname_perm, tc)
    116 {
    117 	(void)setdomainname(domain, sizeof(domain));
    118 }
    119 
    120 ATF_TP_ADD_TCS(tp)
    121 {
    122 
    123 	(void)memset(domain, 0, sizeof(domain));
    124 
    125 	ATF_REQUIRE(getdomainname(domain, sizeof(domain)) == 0);
    126 
    127 	ATF_TP_ADD_TC(tp, setdomainname_basic);
    128 	ATF_TP_ADD_TC(tp, setdomainname_limit);
    129 	ATF_TP_ADD_TC(tp, setdomainname_perm);
    130 
    131 	return atf_no_error();
    132 }
    133