($canonhost,$aliases,$addrtype,$length,@addrs) = gethostbyname($canonhost);
die "couldn't get canonical hostname\n" if !($canonhost && @addrs);
-($canonhost) = gethostbyaddr($addrs[0],$addrtype);
-die "couldn't get canonical hostname\n" if (!$canonhost);
+($canonhost2) = gethostbyaddr($addrs[0],$addrtype);
+if ($canonhost2) { $canonhost = $canonhost2; }
for (@princs) {
s/xCANONHOSTx/$canonhost/g;
$hostname = $ARGV[0];
}
-if (! (($type,$addr) = (gethostbyname($hostname))[2,4])) {
+if (! (($name,$type,$addr) = (gethostbyname($hostname))[0,2,4])) {
print STDERR "No such host: $hostname\n";
exit(1);
}
if (! ($qualname = (gethostbyaddr($addr,$type))[0])) {
- print STDERR "No address information for host $hostname\n";
- exit(1);
+ $qualname = $name;
}
$qualname =~ tr/A-Z/a-z/; # lowercase our name for keytab use.
* domain name, then the resolve library is broken.
*
* Warning: It is possible to fool this program into thinking everything is
- * alright byt a clever use of /etc/hosts - but this is better than nothing.
+ * alright by a clever use of /etc/hosts - but this is better than nothing.
*
* Usage:
* resolve [hostname]
char **argv;
{
char myname[MAXHOSTNAMELEN+1];
- char *ptr;
+ char *ptr, *fqdn;
struct in_addr addrcopy;
struct hostent *host;
int quiet = 0;
exit(2);
}
+ fqdn = strdup(host->h_name);
+ if (fqdn == NULL) {
+ perror("strdup");
+ exit(2);
+ }
+
ptr = host->h_addr_list[0];
#define UC(a) (((int)a)&0xff)
if (!quiet)
memcpy(&addrcopy.s_addr, ptr, 4);
/* Convert back to full name */
- if((host = gethostbyaddr(&addrcopy.s_addr, 4, AF_INET)) == NULL) {
- fprintf(stderr, "Error looking up IP address - fatal\n");
- exit(2);
+ if ((host = gethostbyaddr(&addrcopy.s_addr, 4, AF_INET)) == NULL) {
+ if (!quiet)
+ fprintf(stderr, "Error looking up IP address\n");
+ } else {
+ free(fqdn);
+ fqdn = strdup(host->h_name);
+ if (fqdn == NULL) {
+ perror("strdup");
+ exit (2);
+ }
}
if (quiet)
- printf("%s\n", host->h_name);
+ printf("%s\n", fqdn);
else
- printf("FQDN: %s\n", host->h_name);
+ printf("FQDN: %s\n", fqdn);
/*
* The host name must have at least one '.' in the name, and
* if there is only one '.', it must not be at the end of the
* string. (i.e., "foo." is not a FQDN)
*/
- ptr = strchr(host->h_name, '.');
+ ptr = strchr(fqdn, '.');
if (ptr == NULL || ptr[1] == '\0') {
fprintf(stderr,
"\nResolve library did not return a "