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