1150956Sbrooks/*
2150956Sbrooks * Copyright (C) 2005 Brooks Davis. All rights reserved.
3150956Sbrooks *
4150956Sbrooks * Redistribution and use in source and binary forms, with or without
5150956Sbrooks * modification, are permitted provided that the following conditions
6150956Sbrooks * are met:
7150956Sbrooks * 1. Redistributions of source code must retain the above copyright
8150956Sbrooks *    notice, this list of conditions and the following disclaimer.
9150956Sbrooks * 2. Redistributions in binary form must reproduce the above copyright
10150956Sbrooks *    notice, this list of conditions and the following disclaimer in the
11150956Sbrooks *    documentation and/or other materials provided with the distribution.
12150956Sbrooks *
13150956Sbrooks * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14150956Sbrooks * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15150956Sbrooks * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16150956Sbrooks * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
17150956Sbrooks * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18150956Sbrooks * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19150956Sbrooks * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20150956Sbrooks * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21150956Sbrooks * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22150956Sbrooks * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23150956Sbrooks * SUCH DAMAGE.
24150956Sbrooks */
25150956Sbrooks
26150956Sbrooks#include <sys/cdefs.h>
27150956Sbrooks__FBSDID("$FreeBSD$");
28150956Sbrooks
29150956Sbrooks#include <sys/types.h>
30150956Sbrooks#include <sys/param.h>
31150956Sbrooks#include <errno.h>
32150956Sbrooks#include <libutil.h>
33150956Sbrooks#include <stdio.h>
34150956Sbrooks#include <stdlib.h>
35150956Sbrooks#include <string.h>
36150956Sbrooks#include <unistd.h>
37150956Sbrooks
38150956Sbrooks#define TESTDOMAIN ""
39150956Sbrooks#define TESTHOST "testhost"
40150956Sbrooks#define TESTFQDN "testhost" TESTDOMAIN
41150956Sbrooks
42150956Sbrooksint failures = 0;
43150956Sbrooksint tests = 0;
44150956Sbrooks
45150956Sbrooks/*
46150956Sbrooks * Evily override gethostname(3) so trimdomain always gets the same result.
47150956Sbrooks * This makes the tests much easier to write and less likely to fail on
48150956Sbrooks * oddly configured systems.
49150956Sbrooks */
50199211Sdesint
51199211Sdesgethostname(char *name, size_t namelen)
52150956Sbrooks{
53150956Sbrooks	if (strlcpy(name, TESTFQDN, namelen) > namelen) {
54150956Sbrooks		errno = ENAMETOOLONG;
55150956Sbrooks		return (-1);
56150956Sbrooks	}
57150956Sbrooks	return (0);
58150956Sbrooks}
59150956Sbrooks
60150956Sbrooksvoid
61150956Sbrookstestit(const char *input, int hostsize, const char *output, const char *test)
62150956Sbrooks{
63150956Sbrooks	char *testhost;
64150956Sbrooks	const char *expected = (output == NULL) ? input : output;
65150956Sbrooks
66150956Sbrooks	testhost = strdup(input);
67199211Sdes	trimdomain(testhost, hostsize < 0 ? (int)strlen(testhost) : hostsize);
68150956Sbrooks	tests++;
69150956Sbrooks	if (strcmp(testhost, expected) != 0) {
70150956Sbrooks		printf("not ok %d - %s\n", tests, test);
71150956Sbrooks		printf("# %s -> %s (expected %s)\n", input, testhost, expected);
72150956Sbrooks	} else
73150956Sbrooks		printf("ok %d - %s\n", tests, test);
74150956Sbrooks	free(testhost);
75150956Sbrooks	return;
76150956Sbrooks}
77150956Sbrooks
78150956Sbrooksint
79199211Sdesmain(void)
80150956Sbrooks{
81150956Sbrooks
82150956Sbrooks	printf("1..5\n");
83150956Sbrooks
84150956Sbrooks	testit(TESTFQDN, -1, TESTHOST, "self");
85150956Sbrooks	testit("XXX" TESTDOMAIN, -1, "XXX", "different host, same domain");
86150956Sbrooks	testit("XXX" TESTDOMAIN, 1, NULL, "short hostsize");
87150956Sbrooks	testit("bogus.example.net", -1, NULL, "arbitrary host");
88150956Sbrooks	testit("XXX." TESTFQDN, -1, NULL, "domain is local hostname");
89150956Sbrooks
90150956Sbrooks	return (0);
91150956Sbrooks}
92