diff options
author | Phil Blundell <philb@gnu.org> | 1998-01-08 09:54:43 +0000 |
---|---|---|
committer | Phil Blundell <philb@gnu.org> | 1998-01-08 09:54:43 +0000 |
commit | 1ef3bd3bd1a104a99567cfa90485c89f7edcb812 (patch) | |
tree | f28676e85584644332eb204068cada3fd05a0ac3 /hostname.c | |
download | net-tools-1ef3bd3bd1a104a99567cfa90485c89f7edcb812.tar.gz net-tools-1ef3bd3bd1a104a99567cfa90485c89f7edcb812.tar.bz2 net-tools-1ef3bd3bd1a104a99567cfa90485c89f7edcb812.zip |
Initial revision
Diffstat (limited to 'hostname.c')
-rw-r--r-- | hostname.c | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/hostname.c b/hostname.c new file mode 100644 index 0000000..1a344a3 --- /dev/null +++ b/hostname.c @@ -0,0 +1,360 @@ +/* + * 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 <tobias@et-inf.fho-emden.de> + * + * 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 <stdio.h> +#include <unistd.h> +#include <getopt.h> +#include <string.h> +#include <netdb.h> +#include <errno.h> +#include <sys/param.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#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); +} |