/* * hostname This file contains an implementation of the command * that maintains the hostname and the domainname. It * is also used to show the FQDN and the IP-Addresses. * * Usage: hostname [-d|-f|-s|-a|-i|-y] * hostname [-h|-V] * hostname {name|-F file} * dnsdmoainname * nisdomainname {name|-F file} * * Version: hostname 1.96 (1996-02-18) * * Author: Peter Tobias * * Changes: * {1.90} Peter Tobias : Added -a and -i options. * {1.91} Bernd Eckenfels : -v,-V rewritten, long_opts * (major rewrite), usage. *960120 {1.95} Bernd Eckenfels : -y/nisdomainname - support for get/ * setdomainname added *960218 {1.96} Bernd Eckenfels : netinet/in.h added * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software * Foundation; either version 2 of the License, or (at * your option) any later version. */ #include #include #include #include #include #include #include #include #include #include "config.h" #include "version.h" #include "net-locale.h" char *Release = RELEASE, *Version = "hostname 1.96 (1996-02-18)"; static char *program_name; static int opt_v; static void sethname(char *); static void setdname(char *); static void showhname(char *, int); static void usage(void); static void version(void); static void setfilename(char *,int); #define SETHOST 1 #define SETDOMAIN 2 static void sethname(char *hname) { if (opt_v) fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_set, "Setting hostname to `%s'\n"), hname); if(sethostname(hname, strlen(hname))) { switch(errno) { case EPERM: fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_root, "%s: you must be root to change the host name\n"), program_name); break; case EINVAL: fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_toolong, "%s: name too long\n"), program_name); break; default: } NLS_CATCLOSE(catfd) exit(1); }; } static void setdname(char *dname) { if (opt_v) fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_dset, "Setting domainname to `%s'\n"), dname); if(setdomainname(dname, strlen(dname))) { switch(errno) { case EPERM: fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_dname_root, "%s: you must be root to change the domain name\n"), program_name); break; case EINVAL: fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_dname_toolong, "%s: name too long\n"), program_name); break; default: } NLS_CATCLOSE(catfd) exit(1); }; } static void showhname(char *hname, int c) { struct hostent *hp; register char *p,**alias; struct in_addr **ip; if (opt_v) fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_res, "Resolving `%s' ...\n"),hname); if (!(hp = gethostbyname(hname))) { herror(program_name); NLS_CATCLOSE(catfd) exit(1); } if (opt_v) { fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_fnd, "Result: h_name=`%s'\n"), hp->h_name); alias=hp->h_aliases; while(alias[0]) fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_ali, "Result: h_aliases=`%s'\n"), *alias++); ip=(struct in_addr **)hp->h_addr_list; while(ip[0]) fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_ipn, "Result: h_addr_list=`%s'\n"), inet_ntoa(**ip++)); } if (!(p = strchr(hp->h_name, '.')) && (c == 'd')) return; switch(c) { case 'a': while (hp->h_aliases[0]) printf("%s ", *hp->h_aliases++); printf("\n"); break; case 'i': while (hp->h_addr_list[0]) printf("%s ", inet_ntoa(*(struct in_addr *) * hp->h_addr_list++)); printf("\n"); break; case 'd': printf("%s\n", ++p); break; case 'f': printf("%s\n", hp->h_name); break; case 's': if (p != NULL) *p = '\0'; printf("%s\n", hp->h_name); break; default: } } static void setfilename(char * name,int what) { register FILE *fd; register char *p; char fline[MAXHOSTNAMELEN]; if ((fd = fopen(name, "r")) != NULL) { while (fgets(fline, sizeof(fline), fd) != NULL) { if ((p = index(fline, '\n')) != NULL) *p = '\0'; if (opt_v) fprintf(stderr, ">> %s\n", fline); if (fline[0] == '#') continue; if (what == SETHOST) { sethname(fline); } else { setdname(fline); } } (void) fclose(fd); } else { fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_cant_open, "%s: can't open `%s'\n"), program_name, optarg); NLS_CATCLOSE(catfd) exit(1); } } static void version(void) { fprintf(stderr,"%s\n%s\n",Release,Version); NLS_CATCLOSE(catfd) exit(-1); } static void usage(void) { fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage1, "Usage: hostname [-v] {hostname|-F file} set hostname (from file)\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage2, " domainname [-v] {nisdomain|-F file} set NIS domainname (from file)\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage3, " hostname [-v] [-d|-f|-s|-a|-i|-y] display formated name\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage4, " hostname [-v] display hostname\n\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage5, " hostname -V|--version|-h|--help print info and exit\n\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage6, " dnsdomainname=hostname -d, {yp,nis,}domainname=hostname -y\n\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage7, " -s, --short short host name\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage8, " -a, --alias alias names\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage9, " -i, --ip-address addresses for the hostname\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage10, " -f, --fqdn, --long long host name (FQDN)\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage11, " -d, --domain DNS domain name\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage12, " -y, --yp, --nis NIS/YP domainname\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage13, " -F, --file read hostname or nis domainname from given File\n\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage14, " This comand can get or set the hostname or the NIS domainname. You can\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage15, " also get the DNS domain or the FQDN (fully qualified domain name).\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage16, " Unless you are using bind or NIS for host lookups you can change the\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage17, " FQDN (Fully Qualified Domain Name) and the DNS domain name (which is\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_usage18, " part of the FQDN) in the /etc/hosts file.\n")); NLS_CATCLOSE(catfd) exit(-1); } int main(int argc, char **argv) { int c; char type='\0'; int option_index = 0; int what = 0; char myname[MAXHOSTNAMELEN+1]; char *file=NULL; static const struct option long_options[] = { {"domain", no_argument, 0, 'd'}, {"file", required_argument, 0, 'F'}, {"fqdn", no_argument, 0, 'f'}, {"help", no_argument, 0, 'h'}, {"long", no_argument, 0, 'f'}, {"short", no_argument, 0, 's'}, {"version", no_argument, 0, 'V'}, {"verbose", no_argument, 0, 'v'}, {"alias", no_argument, 0, 'a'}, {"ip-address", no_argument, 0, 'i'}, {"nis", no_argument, 0, 'y'}, {"yp", no_argument, 0, 'y'}, {0, 0, 0, 0} }; #if NLS setlocale (LC_MESSAGES, ""); catfd = catopen ("nettools", MCLoadBySet); #endif program_name = (rindex(argv[0], '/')) ? rindex(argv[0], '/') + 1 : argv[0]; if (!strcmp(program_name,"ypdomainname") || !strcmp(program_name,"domainname") || !strcmp(program_name,"nisdomainname")) what = 3; if (!strcmp(program_name,"dnsdomainname")) what = 2; while((c = getopt_long(argc, argv, "adfF:h?isVvy", long_options, &option_index)) != EOF) switch(c) { case 'd': what = 2; break; case 'a': case 'f': case 'i': case 's': what = 1; type=c; break; case 'y': what = 3; break; case 'F': file=optarg; break; case 'v': opt_v++; break; case 'V': version(); case '?': case 'h': default: usage(); }; switch(what) { case 2: if (file || (optind < argc)) { fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_nodns1, "%s: You can't change the DNS domain name with this command\n"), program_name); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_nodns2, "\nUnless you are using bind or NIS for host lookups you can change the DNS\n")); fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_nodns3, "domain name (which is part of the FQDN) in the /etc/hosts file.\n")); NLS_CATCLOSE(catfd) exit(1); } type='d'; /* NOBREAK */ case 0: if (file) { setfilename(file,SETHOST); break; } if (optind < argc) { sethname(argv[optind]); break; } case 1: gethostname(myname, sizeof(myname)); if (opt_v) fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_get, "gethostname()=`%s'\n"),myname); if (!type) printf("%s\n",myname); else showhname(myname,type); break; case 3: if (file) { setfilename(file,SETDOMAIN); break; } if (optind < argc) { setdname(argv[optind]); break; } getdomainname(myname,sizeof(myname)); if (opt_v) fprintf(stderr,NLS_CATGETS(catfd, hostnameSet, hostname_verb_dget, "getdomainname()=`%s'\n"),myname); printf("%s\n",myname); break; } NLS_CATCLOSE(catfd) exit(0); }