1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
/*
* Copyright 1988 by Rayan S. Zachariassen, all rights reserved.
* This will be free software, but only when it is finished.
*/
/*
* Perhaps a single interface to discovering the real system name.
*/
#include "hostenv.h"
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#if defined(HAVE_RESOLVER)
#include <netdb.h>
#if !defined(EAI_AGAIN) || !defined(AI_NUMERICHOST)
# include "netdb6.h"
#endif
#include <netinet/in.h>
#endif
#ifdef HAVE_SYS_UTSNAME_H
#include <sys/utsname.h>
#endif
#include "libc.h"
int
getmyhostname(namebuf, len)
char *namebuf;
int len;
{
#ifdef HAVE_GETADDRINFO
/* VARIANT WITH getaddrinfo() IN ITS LIBC REQUIREMENTS */
struct addrinfo req, *ai;
int i, rc;
#ifdef HAVE_SYS_UTSNAME_H
struct utsname id;
extern int uname();
if (uname(&id) < 0)
return -1;
strncpy(namebuf, id.nodename, len);
namebuf[len - 1] = 0;
#else /* !HAVE_SYS_UTSNAME_H */
extern int gethostname();
if (gethostname(namebuf, len) < 0)
return -1;
#endif /* USE_UNAME */
ai = NULL;
memset(&req, 0, sizeof(req));
req.ai_socktype = SOCK_STREAM;
req.ai_protocol = IPPROTO_TCP;
req.ai_flags = AI_CANONNAME;
req.ai_family = 0;
for (i = 0; i < 5; ++i) {
rc = getaddrinfo(namebuf, "0", &req, &ai);
if (rc != EAI_AGAIN)
break; /* We try it again if we fail here with EAI_AGAIN */
}
if (ai != NULL) {
if (ai->ai_canonname)
strncpy(namebuf, ai->ai_canonname, len);
namebuf[len-1] = 0;
freeaddrinfo(ai);
}
#if 0
/* enable this code if for some reason your PTR name is primary */
{ /* XXX:XXX:XXX: FIX TO USE GETNAMEINFO() CALL! */
struct in_addr hpaddr;
if (hp != NULL)
memcpy(&hpaddr,hp->h_addr,hp->h_length);
if (hp != NULL
&& (hp = gethostbyaddr((void*)&hpaddr, hp->h_length,
hp->h_addrtype)) != NULL) {
strcpy(namebuf,hp->h_name);
} else
return 0; /* Hmm.. Didn't quite knack it ? */
}
#endif
return 0;
#else /* NOT HAVE_GETADDRINFO */
/* VARIANT WITHOUT getaddrinfo() IN ITS LIBC REQUIREMENTS */
struct hostent *hp;
int i, rc;
#ifdef HAVE_SYS_UTSNAME_H
struct utsname id;
extern int uname();
if (uname(&id) < 0)
return -1;
strncpy(namebuf, id.nodename, len);
namebuf[len - 1] = 0;
#else /* !HAVE_SYS_UTSNAME_H */
extern int gethostname();
if (gethostname(namebuf, len) < 0)
return -1;
#endif /* USE_UNAME */
for (i = 0; i < 5; ++i) {
hp = gethostbyname(namebuf);
if (hp)
break; /* We try it again if we fail here with EAI_AGAIN */
}
if (hp) {
if (hp->h_name)
strncpy(namebuf, hp->h_name, len);
namebuf[len-1] = 0;
}
#if 0
/* enable this code if for some reason your PTR name is primary */
{ /* XXX:XXX:XXX: FIX TO USE GETNAMEINFO() CALL! */
struct in_addr hpaddr;
if (hp != NULL)
memcpy(&hpaddr,hp->h_addr,hp->h_length);
if (hp != NULL
&& (hp = gethostbyaddr((void*)&hpaddr, hp->h_length,
hp->h_addrtype)) != NULL) {
strcpy(namebuf,hp->h_name);
} else
return 0; /* Hmm.. Didn't quite knack it ? */
}
#endif
return 0;
#endif
}
|