1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * University Copyright- Copyright (c) 1982, 1986, 1988
24 * The Regents of the University of California
25 * All Rights Reserved
26 *
27 * University Acknowledgment- Portions of this document are derived from
28 * software developed by the University of California, Berkeley, and its
29 * contributors.
30 */
31
32/*
33 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
34 * Use is subject to license terms.
35 */
36
37/* Portions Copyright 2007 Jeremy Teo */
38/* Portions Copyright 2006 Stephen P. Potter */
39
40#include <unistd.h>
41#include <stdio.h>
42#include <string.h>
43#include <locale.h>
44#include <libgen.h>
45#include <stdlib.h>
46#include <errno.h>
47#include <netdb.h>
48
49#ifndef	TEXT_DOMAIN		/* should be defined by cc -D */
50#define	TEXT_DOMAIN "SYS_TEST"	/* use this only if it wasn't */
51#endif
52
53static char *progname;
54
55static void
56usage(void)
57{
58	(void) fprintf(stderr, gettext("usage: %s [-s] [system_name]\n"),
59	    basename(progname));
60	exit(1);
61}
62
63int
64main(int argc, char *argv[])
65{
66	char	*nodename = NULL;
67	char    c_hostname[MAXHOSTNAMELEN];
68	int	optlet;
69	int	sflag = 0;
70	char	*optstring = "s";
71
72	(void) setlocale(LC_ALL, "");
73	(void) textdomain(TEXT_DOMAIN);
74
75	progname = argv[0];
76
77	opterr = 0;
78	while ((optlet = getopt(argc, argv, optstring)) != -1) {
79		switch (optlet) {
80		case 's':
81			sflag = 1;
82			break;
83		case '?':
84			usage();
85			break;
86		}
87	}
88
89	/*
90	 * if called with no arguments, just print out the hostname/nodename
91	 */
92	if (argc <= optind) {
93		if (gethostname(c_hostname, sizeof (c_hostname)) < 0) {
94			(void) fprintf(stderr,
95			    gettext("%s: unable to obtain hostname\n"),
96			    basename(progname));
97			exit(1);
98		} else {
99			if (sflag)
100				c_hostname[strcspn(c_hostname, ".")] = '\0';
101			(void) fprintf(stdout, "%s\n", c_hostname);
102		}
103	} else {
104		/*
105		 * if called with an argument,
106		 * we have to try to set the new hostname/nodename
107		 */
108		if (argc > optind + 1)
109			usage();	/* too many arguments */
110
111		nodename = argv[optind];
112		if (sethostname(nodename, strlen(nodename)) < 0) {
113			int err = errno;
114			(void) fprintf(stderr,
115			    gettext("%s: error in setting name: %s\n"),
116			    basename(progname), strerror(err));
117			exit(1);
118		}
119	}
120	return (0);
121}
122