xref: /netbsd-src/tests/lib/libc/gen/t_sethostname.c (revision 010e9a3d31c545db0b76b6c0417482a61c0bcff2)
1*010e9a3dSjoerg /* $NetBSD: t_sethostname.c,v 1.3 2012/03/25 08:17:54 joerg Exp $ */
22fc2edcdSjruoho 
32fc2edcdSjruoho /*-
42fc2edcdSjruoho  * Copyright (c) 2011 The NetBSD Foundation, Inc.
52fc2edcdSjruoho  * All rights reserved.
62fc2edcdSjruoho  *
72fc2edcdSjruoho  * This code is derived from software contributed to The NetBSD Foundation
82fc2edcdSjruoho  * by Jukka Ruohonen.
92fc2edcdSjruoho  *
102fc2edcdSjruoho  * Redistribution and use in source and binary forms, with or without
112fc2edcdSjruoho  * modification, are permitted provided that the following conditions
122fc2edcdSjruoho  * are met:
132fc2edcdSjruoho  * 1. Redistributions of source code must retain the above copyright
142fc2edcdSjruoho  *    notice, this list of conditions and the following disclaimer.
152fc2edcdSjruoho  * 2. Redistributions in binary form must reproduce the above copyright
162fc2edcdSjruoho  *    notice, this list of conditions and the following disclaimer in the
172fc2edcdSjruoho  *    documentation and/or other materials provided with the distribution.
182fc2edcdSjruoho  *
192fc2edcdSjruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
202fc2edcdSjruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
212fc2edcdSjruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
222fc2edcdSjruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
232fc2edcdSjruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
242fc2edcdSjruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
252fc2edcdSjruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
262fc2edcdSjruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
272fc2edcdSjruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
282fc2edcdSjruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
292fc2edcdSjruoho  * POSSIBILITY OF SUCH DAMAGE.
302fc2edcdSjruoho  */
312fc2edcdSjruoho #include <sys/cdefs.h>
32*010e9a3dSjoerg __RCSID("$NetBSD: t_sethostname.c,v 1.3 2012/03/25 08:17:54 joerg Exp $");
332fc2edcdSjruoho 
342fc2edcdSjruoho #include <sys/param.h>
352fc2edcdSjruoho 
362fc2edcdSjruoho #include <atf-c.h>
372fc2edcdSjruoho #include <errno.h>
382fc2edcdSjruoho #include <string.h>
392fc2edcdSjruoho #include <unistd.h>
402fc2edcdSjruoho 
412fc2edcdSjruoho static char host[MAXHOSTNAMELEN];
422fc2edcdSjruoho 
432fc2edcdSjruoho static const char hosts[][MAXHOSTNAMELEN] = {
442fc2edcdSjruoho 	"1234567890",
452fc2edcdSjruoho 	"abcdefghijklmnopqrst",
46*010e9a3dSjoerg 	"!#\xa4%&/(..xasS812=!=!(I(!;X;;X.as.dasa=?;,..<>|**^\xa8",
472fc2edcdSjruoho 	"--------------------------------------------------------------------"
482fc2edcdSjruoho };
492fc2edcdSjruoho 
502fc2edcdSjruoho ATF_TC_WITH_CLEANUP(sethostname_basic);
ATF_TC_HEAD(sethostname_basic,tc)512fc2edcdSjruoho ATF_TC_HEAD(sethostname_basic, tc)
522fc2edcdSjruoho {
532fc2edcdSjruoho 	atf_tc_set_md_var(tc, "descr", "A basic test of sethostname(3)");
542fc2edcdSjruoho 	atf_tc_set_md_var(tc, "require.user", "root");
552fc2edcdSjruoho }
562fc2edcdSjruoho 
ATF_TC_BODY(sethostname_basic,tc)572fc2edcdSjruoho ATF_TC_BODY(sethostname_basic, tc)
582fc2edcdSjruoho {
592fc2edcdSjruoho 	char name[MAXHOSTNAMELEN];
602fc2edcdSjruoho 	size_t i;
612fc2edcdSjruoho 
622fc2edcdSjruoho 	for (i = 0; i < __arraycount(hosts); i++) {
632fc2edcdSjruoho 
642fc2edcdSjruoho 		(void)memset(name, 0, sizeof(name));
652fc2edcdSjruoho 
662fc2edcdSjruoho 		ATF_REQUIRE(sethostname(hosts[i], sizeof(hosts[i])) == 0);
672fc2edcdSjruoho 		ATF_REQUIRE(gethostname(name, sizeof(name)) == 0);
682fc2edcdSjruoho 		ATF_REQUIRE(strcmp(hosts[i], name) == 0);
692fc2edcdSjruoho 	}
70577c48bdSjruoho 
71577c48bdSjruoho 	(void)sethostname(host, sizeof(host));
722fc2edcdSjruoho }
732fc2edcdSjruoho 
ATF_TC_CLEANUP(sethostname_basic,tc)742fc2edcdSjruoho ATF_TC_CLEANUP(sethostname_basic, tc)
752fc2edcdSjruoho {
762fc2edcdSjruoho 	(void)sethostname(host, sizeof(host));
772fc2edcdSjruoho }
782fc2edcdSjruoho 
792fc2edcdSjruoho ATF_TC_WITH_CLEANUP(sethostname_limit);
ATF_TC_HEAD(sethostname_limit,tc)802fc2edcdSjruoho ATF_TC_HEAD(sethostname_limit, tc)
812fc2edcdSjruoho {
822fc2edcdSjruoho 	atf_tc_set_md_var(tc, "descr", "Too long host name errors out?");
832fc2edcdSjruoho 	atf_tc_set_md_var(tc, "require.user", "root");
842fc2edcdSjruoho }
852fc2edcdSjruoho 
ATF_TC_BODY(sethostname_limit,tc)862fc2edcdSjruoho ATF_TC_BODY(sethostname_limit, tc)
872fc2edcdSjruoho {
882fc2edcdSjruoho 	char name[MAXHOSTNAMELEN + 1];
892fc2edcdSjruoho 
902fc2edcdSjruoho 	(void)memset(name, 0, sizeof(name));
912fc2edcdSjruoho 
922fc2edcdSjruoho 	ATF_REQUIRE(sethostname(name, sizeof(name)) == -1);
932fc2edcdSjruoho }
942fc2edcdSjruoho 
ATF_TC_CLEANUP(sethostname_limit,tc)952fc2edcdSjruoho ATF_TC_CLEANUP(sethostname_limit, tc)
962fc2edcdSjruoho {
972fc2edcdSjruoho 	(void)sethostname(host, sizeof(host));
982fc2edcdSjruoho }
992fc2edcdSjruoho 
1002fc2edcdSjruoho ATF_TC_WITH_CLEANUP(sethostname_perm);
ATF_TC_HEAD(sethostname_perm,tc)1012fc2edcdSjruoho ATF_TC_HEAD(sethostname_perm, tc)
1022fc2edcdSjruoho {
1032fc2edcdSjruoho 	atf_tc_set_md_var(tc, "descr", "Can normal user set the host name?");
1042fc2edcdSjruoho 	atf_tc_set_md_var(tc, "require.user", "unprivileged");
1052fc2edcdSjruoho }
1062fc2edcdSjruoho 
ATF_TC_BODY(sethostname_perm,tc)1072fc2edcdSjruoho ATF_TC_BODY(sethostname_perm, tc)
1082fc2edcdSjruoho {
1092fc2edcdSjruoho 
1102fc2edcdSjruoho 	errno = 0;
1112fc2edcdSjruoho 
1122fc2edcdSjruoho 	ATF_REQUIRE_ERRNO(EPERM, sethostname(host, sizeof(host)) == -1);
1132fc2edcdSjruoho }
1142fc2edcdSjruoho 
ATF_TC_CLEANUP(sethostname_perm,tc)1152fc2edcdSjruoho ATF_TC_CLEANUP(sethostname_perm, tc)
1162fc2edcdSjruoho {
1172fc2edcdSjruoho 	(void)sethostname(host, sizeof(host));
1182fc2edcdSjruoho }
1192fc2edcdSjruoho 
ATF_TP_ADD_TCS(tp)1202fc2edcdSjruoho ATF_TP_ADD_TCS(tp)
1212fc2edcdSjruoho {
1222fc2edcdSjruoho 
1232fc2edcdSjruoho 	(void)memset(host, 0, sizeof(host));
1242fc2edcdSjruoho 
1252fc2edcdSjruoho 	ATF_REQUIRE(gethostname(host, sizeof(host)) == 0);
1262fc2edcdSjruoho 
1272fc2edcdSjruoho 	ATF_TP_ADD_TC(tp, sethostname_basic);
1282fc2edcdSjruoho 	ATF_TP_ADD_TC(tp, sethostname_limit);
1292fc2edcdSjruoho 	ATF_TP_ADD_TC(tp, sethostname_perm);
1302fc2edcdSjruoho 
1312fc2edcdSjruoho 	return atf_no_error();
1322fc2edcdSjruoho }
133