Fix uninitialised variable (was causing problems on SPARC apparently)
[platform/upstream/net-tools.git] / hostname.c
1 /*
2  * hostname     This file contains an implementation of the command
3  *              that maintains the hostname and the domainname. It
4  *              is also used to show the FQDN and the IP-Addresses.
5  *
6  * Usage:       hostname [-d|-f|-s|-a|-i|-y]
7  *              hostname [-h|-V]
8  *              hostname {name|-F file}
9  *              dnsdmoainname   
10  *              nisdomainname {name|-F file}
11  *
12  * Version:     hostname 1.96 (1996-02-18)
13  *
14  * Author:      Peter Tobias <tobias@et-inf.fho-emden.de>
15  *
16  * Changes:
17  *      {1.90}  Peter Tobias :          Added -a and -i options.
18  *      {1.91}  Bernd Eckenfels :       -v,-V rewritten, long_opts 
19  *                                      (major rewrite), usage.
20  *960120 {1.95} Bernd Eckenfels :       -y/nisdomainname - support for get/
21  *                                      setdomainname added 
22  *960218 {1.96} Bernd Eckenfels :       netinet/in.h added
23  *
24  *              This program is free software; you can redistribute it
25  *              and/or  modify it under  the terms of  the GNU General
26  *              Public  License as  published  by  the  Free  Software
27  *              Foundation;  either  version 2 of the License, or  (at
28  *              your option) any later version.
29  */
30 #include <stdio.h>
31 #include <unistd.h>
32 #include <getopt.h>
33 #include <string.h>
34 #include <netdb.h>
35 #include <errno.h>
36 #include <sys/param.h>
37 #include <netinet/in.h>
38 #include <arpa/inet.h>
39 #include "config.h"
40 #include "version.h"
41 #include "net-locale.h"
42
43 char *Release = RELEASE,
44      *Version = "hostname 1.96 (1996-02-18)";
45      
46 static char *program_name;
47 static int  opt_v;
48
49 static void sethname(char *);
50 static void setdname(char *);
51 static void showhname(char *, int);
52 static void usage(void);
53 static void version(void);
54 static void setfilename(char *,int);
55
56 #define SETHOST         1
57 #define SETDOMAIN       2
58
59 static void sethname(char *hname)
60 {
61         if (opt_v)
62                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_set, "Setting hostname to `%s'\n"),
63                         hname);
64         if(sethostname(hname, strlen(hname))) {
65                 switch(errno) {
66                         case EPERM:
67                                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_root,
68                                                            "%s: you must be root to change the host name\n"), program_name);
69                                 break;
70                         case EINVAL:
71                                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_toolong,
72                                                            "%s: name too long\n"), program_name);
73                                 break;
74                         default:
75                 }
76                 NLS_CATCLOSE(catfd)
77                 exit(1);
78         };
79 }
80
81 static void setdname(char *dname)
82 {
83         if (opt_v)
84                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_dset, "Setting domainname to `%s'\n"),
85                         dname);
86         if(setdomainname(dname, strlen(dname))) {
87                 switch(errno) {
88                         case EPERM:
89                                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_dname_root,
90                                                            "%s: you must be root to change the domain name\n"), program_name);
91                                 break;
92                         case EINVAL:
93                                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_dname_toolong,
94                                                            "%s: name too long\n"), program_name);
95                                 break;
96                         default:
97                 }
98                 NLS_CATCLOSE(catfd)
99                 exit(1);
100         };
101 }
102
103 static void showhname(char *hname, int c)
104 {
105         struct hostent *hp;
106         register char *p,**alias;
107         struct in_addr **ip;
108         
109         if (opt_v)
110                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_res, "Resolving `%s' ...\n"),hname);
111         if (!(hp = gethostbyname(hname))) {
112                 herror(program_name);
113                 NLS_CATCLOSE(catfd)
114                 exit(1);
115         }
116
117         if (opt_v) { 
118                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_fnd, "Result: h_name=`%s'\n"),
119                         hp->h_name);
120                         
121                 alias=hp->h_aliases;
122                 while(alias[0])
123                         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_ali, "Result: h_aliases=`%s'\n"),
124                                 *alias++);
125                                 
126                 ip=(struct in_addr **)hp->h_addr_list;
127                 while(ip[0])
128                         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_ipn, "Result: h_addr_list=`%s'\n"),
129                                 inet_ntoa(**ip++));
130         }
131
132         if (!(p = strchr(hp->h_name, '.')) && (c == 'd')) return;
133
134         switch(c) {
135                 case 'a':
136                         while (hp->h_aliases[0])
137                                 printf("%s ", *hp->h_aliases++);
138                         printf("\n");
139                         break;
140                 case 'i':
141                         while (hp->h_addr_list[0])
142                                 printf("%s ", inet_ntoa(*(struct in_addr *) * hp->h_addr_list++));
143                         printf("\n");
144                         break;
145                 case 'd':
146                         printf("%s\n", ++p);
147                         break;
148                 case 'f':
149                         printf("%s\n", hp->h_name);
150                         break;
151                 case 's':
152                         if (p != NULL) *p = '\0';
153                         printf("%s\n", hp->h_name);
154                         break;
155                 default:
156         }
157 }
158
159 static void setfilename(char * name,int what)
160 {               
161   register FILE *fd;
162   register char *p;
163   char fline[MAXHOSTNAMELEN];
164
165   if ((fd = fopen(name, "r")) != NULL) {
166         while (fgets(fline, sizeof(fline), fd) != NULL) {
167                 if ((p = index(fline, '\n')) != NULL)
168                         *p = '\0';
169                         if (opt_v) fprintf(stderr, ">> %s\n", fline);
170                         if (fline[0] == '#')
171                                 continue;
172                         if (what == SETHOST) {
173                                 sethname(fline);
174                         } else {
175                                 setdname(fline);
176                         }
177         }
178         (void) fclose(fd);
179   } else {
180         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_cant_open, "%s: can't open `%s'\n"),
181                         program_name, optarg);
182         NLS_CATCLOSE(catfd)
183         exit(1);
184   }
185 }
186
187 static void version(void)
188 {
189         fprintf(stderr,"%s\n%s\n",Release,Version);
190         NLS_CATCLOSE(catfd)
191         exit(-1);
192 }
193
194 static void usage(void)
195 {
196         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage1, 
197                 "Usage: hostname [-v] {hostname|-F file}      set hostname (from file)\n"));
198         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage2, 
199                 "       domainname [-v] {nisdomain|-F file}   set NIS domainname (from file)\n"));
200         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage3, 
201                 "       hostname [-v] [-d|-f|-s|-a|-i|-y]     display formated name\n"));
202         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage4, 
203                 "       hostname [-v]                         display hostname\n\n"));
204         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage5, 
205                 "       hostname -V|--version|-h|--help       print info and exit\n\n"));
206         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage6, 
207                 "    dnsdomainname=hostname -d, {yp,nis,}domainname=hostname -y\n\n"));
208         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage7, 
209                 "    -s, --short           short host name\n"));
210         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage8, 
211                 "    -a, --alias           alias names\n"));
212         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage9, 
213                 "    -i, --ip-address      addresses for the hostname\n"));
214         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage10, 
215                 "    -f, --fqdn, --long    long host name (FQDN)\n"));
216         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage11, 
217                 "    -d, --domain          DNS domain name\n"));
218         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage12, 
219                 "    -y, --yp, --nis       NIS/YP domainname\n"));
220         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage13, 
221                 "    -F, --file            read hostname or nis domainname from given File\n\n"));
222         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage14, 
223                 "   This comand can get or set the hostname or the NIS domainname. You can\n"));
224         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage15, 
225                 "   also get the DNS domain or the FQDN (fully qualified domain name).\n"));
226         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage16, 
227                 "   Unless you are using bind or NIS for host lookups you can change the\n"));
228         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage17, 
229                 "   FQDN (Fully Qualified Domain Name) and the DNS domain name (which is\n"));
230         fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage18, 
231                 "   part of the FQDN) in the /etc/hosts file.\n"));
232         NLS_CATCLOSE(catfd)
233         exit(-1);
234 }
235
236
237 int main(int argc, char **argv)
238 {
239         int c;
240         char type='\0';
241         int option_index = 0;
242         int what = 0;
243         char myname[MAXHOSTNAMELEN+1] = { 0 };
244         char *file=NULL;
245
246         static const struct option long_options[] =
247         {
248                 {"domain", no_argument, 0, 'd'},
249                 {"file", required_argument, 0, 'F'},
250                 {"fqdn", no_argument, 0, 'f'},
251                 {"help", no_argument, 0, 'h'},
252                 {"long", no_argument, 0, 'f'},
253                 {"short", no_argument, 0, 's'},
254                 {"version", no_argument, 0, 'V'},
255                 {"verbose", no_argument, 0, 'v'},
256                 {"alias", no_argument, 0, 'a'},
257                 {"ip-address", no_argument, 0, 'i'},
258                 {"nis", no_argument, 0, 'y'},
259                 {"yp", no_argument, 0, 'y'},
260                 {0, 0, 0, 0}
261         };
262
263 #if NLS
264         setlocale (LC_MESSAGES, "");
265         catfd = catopen ("nettools", MCLoadBySet);
266 #endif
267
268         program_name = (rindex(argv[0], '/')) ? rindex(argv[0], '/') + 1 : argv[0];
269
270         if (!strcmp(program_name,"ypdomainname") || 
271             !strcmp(program_name,"domainname")   || 
272             !strcmp(program_name,"nisdomainname"))
273                 what = 3;
274         if (!strcmp(program_name,"dnsdomainname"))
275                 what = 2;
276         
277         while((c = getopt_long(argc, argv, "adfF:h?isVvy", long_options, &option_index)) != EOF)
278         switch(c)
279         {
280                 case 'd':
281                         what = 2;
282                         break;
283                 case 'a':
284                 case 'f':
285                 case 'i':
286                 case 's':
287                         what = 1;
288                         type=c;
289                         break;
290                 case 'y':
291                         what = 3;
292                         break;
293                 case 'F':
294                         file=optarg;                                            
295                         break;
296                 case 'v':
297                         opt_v++;
298                         break;
299                 case 'V':
300                         version();
301                 case '?':
302                 case 'h':
303                 default:
304                         usage();
305
306         };
307
308
309         switch(what) {
310                 case 2:
311                         if (file || (optind < argc)) {
312                                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_nodns1,
313                                            "%s: You can't change the DNS domain name with this command\n"), program_name);
314                                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_nodns2,
315                                            "\nUnless you are using bind or NIS for host lookups you can change the DNS\n"));
316                                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_nodns3,
317                                            "domain name (which is part of the FQDN) in the /etc/hosts file.\n"));
318                                 NLS_CATCLOSE(catfd)
319                                 exit(1);
320                         }
321                         type='d';                       
322                         /* NOBREAK */
323                 case 0:
324                         if (file) {
325                                 setfilename(file,SETHOST);
326                                 break;
327                         }
328                         if (optind < argc) {
329                                 sethname(argv[optind]);
330                                 break;
331                         }
332                 case 1:
333                         gethostname(myname, sizeof(myname));
334                         if (opt_v)
335                                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_get, 
336                                         "gethostname()=`%s'\n"),myname);
337                         if (!type)
338                                 printf("%s\n",myname);
339                         else
340                                 showhname(myname,type);
341                         break;
342                 case 3:
343                         if (file) {
344                                 setfilename(file,SETDOMAIN);
345                                 break;
346                         }
347                         if (optind < argc) {
348                                 setdname(argv[optind]);
349                                 break;
350                         }
351                         getdomainname(myname,sizeof(myname));
352                         if (opt_v)
353                                 fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_dget, 
354                                         "getdomainname()=`%s'\n"),myname);
355                         printf("%s\n",myname);
356                         break;
357         }
358         NLS_CATCLOSE(catfd)
359         exit(0);
360 }