blob: d878515097fc1afc0bd86375a41fb632cdbf0fea [file] [log] [blame]
Erik Andersene49d5ec2000-02-08 19:58:47 +00001/* vi: set sw=4 ts=4: */
Eric Andersen485b9551999-12-07 23:14:59 +00002/*
Glenn L McGrath78b0e372001-06-26 02:06:08 +00003 * $Id: hostname.c,v 1.30 2001/06/26 02:06:08 bug1 Exp $
Eric Andersen485b9551999-12-07 23:14:59 +00004 * Mini hostname implementation for busybox
5 *
6 * Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
7 *
Eric Andersend29edf31999-12-08 04:13:44 +00008 * adjusted by Erik Andersen <andersee@debian.org> to remove
9 * use of long options and GNU getopt. Improved the usage info.
10 *
Eric Andersen485b9551999-12-07 23:14:59 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 */
25
Eric Andersen485b9551999-12-07 23:14:59 +000026#include <errno.h>
Eric Andersen485b9551999-12-07 23:14:59 +000027#include <arpa/inet.h>
28#include <netdb.h>
29#include <unistd.h>
Eric Andersened3ef502001-01-27 08:24:39 +000030#include <string.h>
Eric Andersen485b9551999-12-07 23:14:59 +000031#include <stdio.h>
Eric Anderseneba8ed72001-03-09 14:36:42 +000032#include <stdlib.h>
Eric Andersene0c07572001-06-23 13:49:14 +000033#include "busybox.h"
Eric Andersen485b9551999-12-07 23:14:59 +000034
Eric Andersen3e6ff902001-03-09 21:24:12 +000035static void do_sethostname(char *s, int isfile)
Eric Andersen485b9551999-12-07 23:14:59 +000036{
Erik Andersene49d5ec2000-02-08 19:58:47 +000037 FILE *f;
38 char buf[255];
39
40 if (!s)
41 return;
42 if (!isfile) {
43 if (sethostname(s, strlen(s)) < 0) {
44 if (errno == EPERM)
Matt Kraaidd19c692001-01-31 19:00:21 +000045 error_msg_and_die("you must be root to change the hostname");
Erik Andersene49d5ec2000-02-08 19:58:47 +000046 else
Matt Kraaia9819b22000-12-22 01:48:07 +000047 perror_msg_and_die("sethostname");
Erik Andersene49d5ec2000-02-08 19:58:47 +000048 }
Eric Andersen485b9551999-12-07 23:14:59 +000049 } else {
Matt Kraaibbaef662000-09-27 02:43:35 +000050 f = xfopen(s, "r");
51 fgets(buf, 255, f);
Glenn L McGrath78b0e372001-06-26 02:06:08 +000052#ifdef BB_FEATURE_CLEAN_UP
Matt Kraaibbaef662000-09-27 02:43:35 +000053 fclose(f);
Glenn L McGrath78b0e372001-06-26 02:06:08 +000054#endif
Matt Kraai05e782d2001-02-01 16:49:30 +000055 chomp(buf);
Glenn L McGrath78b0e372001-06-26 02:06:08 +000056 do_sethostname(buf, 0);
Eric Andersen485b9551999-12-07 23:14:59 +000057 }
Eric Andersen485b9551999-12-07 23:14:59 +000058}
59
60int hostname_main(int argc, char **argv)
61{
Erik Andersene49d5ec2000-02-08 19:58:47 +000062 int opt_short = 0;
63 int opt_domain = 0;
64 int opt_ip = 0;
65 struct hostent *h;
66 char *filename = NULL;
67 char buf[255];
68 char *s = NULL;
Eric Andersen485b9551999-12-07 23:14:59 +000069
Erik Andersene49d5ec2000-02-08 19:58:47 +000070 if (argc < 1)
Eric Andersen67991cf2001-02-14 21:23:06 +000071 show_usage();
Eric Andersen485b9551999-12-07 23:14:59 +000072
Erik Andersene49d5ec2000-02-08 19:58:47 +000073 while (--argc > 0 && **(++argv) == '-') {
74 while (*(++(*argv))) {
75 switch (**argv) {
76 case 's':
77 opt_short = 1;
78 break;
79 case 'i':
80 opt_ip = 1;
81 break;
82 case 'd':
83 opt_domain = 1;
84 break;
85 case 'F':
Erik Andersene49d5ec2000-02-08 19:58:47 +000086 if (--argc == 0) {
Eric Andersen67991cf2001-02-14 21:23:06 +000087 show_usage();
Erik Andersene49d5ec2000-02-08 19:58:47 +000088 }
89 filename = *(++argv);
90 break;
Eric Andersen0d5835a2000-10-12 22:30:31 +000091 case '-':
92 if (strcmp(++(*argv), "file") || --argc ==0 ) {
Eric Andersen67991cf2001-02-14 21:23:06 +000093 show_usage();
Eric Andersen0d5835a2000-10-12 22:30:31 +000094 }
95 filename = *(++argv);
96 break;
Erik Andersene49d5ec2000-02-08 19:58:47 +000097 default:
Eric Andersen67991cf2001-02-14 21:23:06 +000098 show_usage();
Erik Andersene49d5ec2000-02-08 19:58:47 +000099 }
100 if (filename != NULL)
101 break;
102 }
103 }
104
105 if (argc >= 1) {
106 do_sethostname(*argv, 0);
107 } else if (filename != NULL) {
108 do_sethostname(filename, 1);
109 } else {
110 gethostname(buf, 255);
111 if (opt_short) {
112 s = strchr(buf, '.');
113 if (!s)
114 s = buf;
115 *s = 0;
Matt Kraai59df6f72001-05-16 14:21:09 +0000116 puts(buf);
Erik Andersene49d5ec2000-02-08 19:58:47 +0000117 } else if (opt_domain) {
118 s = strchr(buf, '.');
Matt Kraai59df6f72001-05-16 14:21:09 +0000119 puts(s ? s + 1 : "");
Erik Andersene49d5ec2000-02-08 19:58:47 +0000120 } else if (opt_ip) {
Matt Kraaic55b8d42001-05-16 15:40:51 +0000121 h = xgethostbyname(buf);
Matt Kraai59df6f72001-05-16 14:21:09 +0000122 puts(inet_ntoa(*(struct in_addr *) (h->h_addr)));
Erik Andersene49d5ec2000-02-08 19:58:47 +0000123 } else {
Matt Kraai59df6f72001-05-16 14:21:09 +0000124 puts(buf);
Erik Andersene49d5ec2000-02-08 19:58:47 +0000125 }
126 }
Eric Andersenb6106152000-06-19 17:25:40 +0000127 return(0);
Eric Andersen485b9551999-12-07 23:14:59 +0000128}