PArtial Changelog update. I'm still on vacation (I'm at a campground
[oweals/busybox.git] / networking / hostname.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * $Id: hostname.c,v 1.30 2001/06/26 02:06:08 bug1 Exp $
4  * Mini hostname implementation for busybox
5  *
6  * Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
7  *
8  * adjusted by Erik Andersen <andersee@debian.org> to remove
9  * use of long options and GNU getopt.  Improved the usage info.
10  *
11  * 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
26 #include <errno.h>
27 #include <arpa/inet.h>
28 #include <netdb.h>
29 #include <unistd.h>
30 #include <string.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include "busybox.h"
34
35 static void do_sethostname(char *s, int isfile)
36 {
37         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)
45                                 error_msg_and_die("you must be root to change the hostname");
46                         else
47                                 perror_msg_and_die("sethostname");
48                 }
49         } else {
50                 f = xfopen(s, "r");
51                 fgets(buf, 255, f);
52 #ifdef BB_FEATURE_CLEAN_UP
53                 fclose(f);
54 #endif
55                 chomp(buf);
56                 do_sethostname(buf, 0);
57         }
58 }
59
60 int hostname_main(int argc, char **argv)
61 {
62         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;
69
70         if (argc < 1)
71                 show_usage();
72
73         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':
86                                 if (--argc == 0) {
87                                         show_usage();
88                                 }
89                                 filename = *(++argv);
90                                 break;
91                         case '-':
92                                 if (strcmp(++(*argv), "file") || --argc ==0 ) {
93                                         show_usage();
94                                 }
95                                 filename = *(++argv);
96                                 break;
97                         default:
98                                 show_usage();
99                         }
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;
116                         puts(buf);
117                 } else if (opt_domain) {
118                         s = strchr(buf, '.');
119                         puts(s ? s + 1 : "");
120                 } else if (opt_ip) {
121                         h = xgethostbyname(buf);
122                         puts(inet_ntoa(*(struct in_addr *) (h->h_addr)));
123                 } else {
124                         puts(buf);
125                 }
126         }
127         return(0);
128 }