- From: Rich Salz <rsalz@osf.org>
- Date: Wed, 4 Oct 1995 00:23:03 -0400
- To: mshapiro@ncsa.uiuc.edu
- Cc: http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com
>Is it known how to convert a non-fqdn to a fqdn in exactly the
>same way that gethostbyname() does it when it looks up the IP address?
Sadly, my experience is that there is nothing portable. I have a
library routine in my Usenet package and at times it just has to fall
back to a config file to get the domain.
Here's the current source, perhaps more useful for the commentary then
the code...
/* $Revision: 1.8 $
**
*/
#include <stdio.h>
#include <sys/types.h>
#include <netdb.h>
#include "configdata.h"
#include "paths.h"
#include "clibrary.h"
#include "libinn.h"
/*
** Get the fully-qualified domain name for this host.
*/
char *
GetFQDN()
{
static char buff[SMBUF];
struct hostent *hp;
char *p;
#if 0
/* See comments below. */
char temp[SMBUF + 2];
#endif /* 0 */
/* Return any old results. */
if (buff[0])
return buff;
/* Try gethostname. */
if (gethostname(buff, (int)sizeof buff) < 0)
return NULL;
if (strchr(buff, '.') != NULL)
return buff;
/* See if DNS (or /etc/hosts) gives us a full domain name. */
if ((hp = gethostbyname(buff)) == NULL)
return NULL;
#if 0
/* This code is a "feature" that allows multiple domains (NIS or
* DNS, I'm not sure) to work with a single INN server. However,
* it turns out to cause more problems for people, and they have to
* use hacks like __switch_gethostbyname, etc. So if you need this,
* turn it on, but don't complain to me. */
if (strchr(hp->h_name, '.') == NULL) {
/* Try to force DNS lookup if NIS/whatever gets in the way. */
(void)strncpy(temp, buff, sizeof buff);
(void)strcat(temp, ".");
hp = gethostbyname(temp);
}
#endif /* 0 */
if (hp != NULL && strchr(hp->h_name, '.') != NULL) {
if (strlen(hp->h_name) < sizeof buff - 1)
return strcpy(buff, hp->h_name);
/* Doesn't fit; make sure we don't return bad data next time. */
buff[0] = '\0';
return hp->h_name;
}
/* Get the domain name config parameter and append it. */
if ((p = GetFileConfigValue(_CONF_DOMAIN)) == NULL || *p == '\0')
return NULL;
if (strlen(buff) + 1 + strlen(p) > sizeof buff - 1)
/* Doesn't fit. */
return NULL;
(void)strcat(buff, ".");
(void)strcat(buff, p);
return buff;
}
Received on Tuesday, 3 October 1995 21:26:21 UTC