|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 22430 (0x579e)
Types: TextFile
Names: »uk.src.patches«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦bfebc70e2⟧ »EurOpenD3/mail/sendmail-5.65b+IDA-1.4.3.tar.Z«
└─⟦f9e35cd84⟧
└─⟦this⟧ »sendmail/uk.extras/uk.src.patches«
*** /tmp/,RCSt1a05098 Thu Dec 20 23:05:54 1990
--- conf.h Thu Dec 20 23:05:11 1990
***************
*** 36,42 ****
# define MAXHOP 17 /* max value of HopCount */
# define MAXATOM 200 /* max atoms per address */
# define MAXMAILERS 25 /* maximum mailers known to system */
! # define MAXRWSETS 31 /* max # of sets of rewriting rules */
# define MAXPRIORITIES 25 /* max values for Precedence: field */
# define MAXTRUST 30 /* maximum number of trusted users */
# define MAXUSERENVIRON 40 /* max # of items in user environ */
--- 36,42 ----
# define MAXHOP 17 /* max value of HopCount */
# define MAXATOM 200 /* max atoms per address */
# define MAXMAILERS 25 /* maximum mailers known to system */
! # define MAXRWSETS 40 /* max # of sets of rewriting rules */
# define MAXPRIORITIES 25 /* max values for Precedence: field */
# define MAXTRUST 30 /* maximum number of trusted users */
# define MAXUSERENVIRON 40 /* max # of items in user environ */
***************
*** 95,101 ****
** malloc.c and getpwent.c are compiled with the sendmail source.
*/
# if !defined(NeXT) && !defined(_AIX) && !defined(apollo)
! # define _PATH_SENDMAILFC "/etc/sendmail.fc"
# endif /* !NeXT && !_AIX && !apollo */
/*
--- 95,101 ----
** malloc.c and getpwent.c are compiled with the sendmail source.
*/
# if !defined(NeXT) && !defined(_AIX) && !defined(apollo)
! # define _PATH_SENDMAILFC "/etc/sendmail.fc"
# endif /* !NeXT && !_AIX && !apollo */
/*
***************
*** 103,105 ****
--- 103,219 ----
** the daemon's pid.
*/
# define _PATH_SENDMAILPID "/etc/sendmail.pid"
+
+ /* Beginning of changes aimed at domain.c done by John Forrest,
+ Dept of Computation, UMIST - John.Forrest@umist.ac.uk */
+
+ /*
+ * If you define LOOK_FOR_LONGSYNONYMS, sendmail will try to spot
+ * situations where parent domains have synonyms in BIND.
+ * For example, with:
+ * manchester.ac.uk. CNAME man.ac.uk.
+ * computer-science.man.ac.uk CNAME cs.man.ac.uk.
+ *
+ * with this option set, given computer-science.manchester.ac.uk
+ * it will produce cs.man.ac.uk. Normally, no such synonym will
+ * be spotted. Note this is primarily intended for use in the UK,
+ * where such synonyms abound. It does take longer to spot a bad
+ * address, so if you don't need the functionality don't use it -
+ * comment out the next line - jf 12/90 */
+ #define LOOK_FOR_LONGSYNONYMS 1
+
+ /* An extension which allows one of the classes to be nominated
+ as known top domains. If an address ends with one of these to start
+ with, we assume it is fully expanded, and the only point of looking
+ up the name is to find synonyms. Note: this only affects getting
+ the canonical name using BIND. To enable the extension, define
+ TOP_DOMAIN_CLASS to the letter you wish to use. It is suggested
+ that class 't' be used - because this is lower case, no other cf rule
+ set should use this for another reason. However, as a safety
+ measure, the feature is only enabled if there is some data placed
+ in TOP_DOMAIN_CLASS.
+
+ By default, names are always searched for normally (if
+ NO_WILDCARD_MX) or not really searched for (! NO_WILDCARD_MX).
+ jf 12/90
+ */
+ #define TOP_DOMAIN_CLASS 't'
+
+ /*
+ * By default, during getcanonname, sendmail accesses BIND
+ * with the DEFNAMES and DNSRCH flags set. This means that
+ * partially defined names will be automatically resolved
+ * by BIND. [Note, if TOP_DOMAIN_CLASS is defined, there is
+ * a dot in the name, and the last element is in the
+ * top domain class, the search will take place with these
+ * bits reset.] If you prefer never to use DNSRCH in this
+ * situation, for some reason, uncomment the next line. The
+ * effect of this is that BIND only knows local and global
+ * names. The bits used are refered to as the "SEARCH bits".
+ * The disadvantage of this is that there are ambiguity
+ * problems if TOP_DOMAIN_CLASS is not kept up to date - there
+ * is a small possibility that what is really a full address
+ * from somewhere else will match a local address. Whether you
+ * feel this is a real possibility is a matter of opinion.
+ * John Forrest 12/90.
+ */
+ /* #define DONT_DNSRCH 1 */
+
+ /*
+ * if IGNORE_SELF_MX is defined, getcanonname fails if the
+ * found name has MX's where the best points to the current
+ * node. The reason for this ``trick'' is as follows:
+ *
+ * Host 'somecompany.com', which has a uucp node name of
+ * 'somecompany' arranges to have an MX record created,
+ * pointing to the localnmode as the best preference.
+ * At the same time, they make sure their uucp name is in
+ * the uucp maps.
+ *
+ * When any internet user sends mail to
+ * 'user@somecompany.com' it arrives at the localnode.
+ * Because the best preference MX is local, the TCP mailer
+ * is not selected. There is now a lookup of the PATHTABLE
+ * database. This contains a record:
+ *
+ * somecompany.com foo!bar!somecompany%s
+ *
+ * which was generated from the uucp maps, using the
+ * pathalias function.
+ *
+ * The big advantage of this is that whether to use the relay
+ * or not can be determined by ``samecompany'' - it is a
+ * question of changing the MX entry. The disadvantage is
+ * that you have to be able to cope with ALL local synonyms
+ * yourself - via PSEUDONUMS or via the DOMAINTABLE database.
+ * Otherwise, you may find yourself with bouncing mail.
+ * The alternative technique for routing is to use the
+ * MAILERTABLE to indicate different mailers are required
+ * for particular mail. This requires more local intervention,
+ * but doesn't have any of the problems associated with
+ * this option.
+ *
+ * Generally, if you don't relay or you are using non-IDA
+ * .cf files, it is best to leave the option commented out.
+ * Otherwise, it is up to you - it probably depends on
+ * how many nodes you relay to, and how frequently the
+ * information changes.
+ - John.Forrest@umist 11/90. This option selectively
+ enables code added by Paul Pomes. Comment derived
+ from mail by Neil Rickert. */
+ /* #define IGNORE_SELF_MX 1 */
+
+ /*
+ * There is always a problem of knowing what to do if
+ * the name server returns h_errno==TRY_AGAIN during getcanonname.
+ * By default, it will return FALSE, but if you define
+ * IGNORE_TRYAGAIN, it will return TRUE. Normally if the
+ * condition still persists, then it will be met again
+ * during getmxrs, and the mail will be requeued. However,
+ * if you use BIND to resolve names, there is always a possibility
+ * that the wrong action will occur. Probably best only to
+ * set this if BIND problems are common.
+ */
+ /* #define IGNORE_TRYAGAIN 1 */
+
+ /* end of jf domain.c changes */
*** /tmp/,RCSt1a05098 Thu Dec 20 23:05:59 1990
--- readcf.c Thu Dec 20 23:05:15 1990
***************
*** 177,182 ****
--- 177,188 ----
case 'C': /* word class */
case 'F': /* word class from file */
+ #if defined(TOP_DOMAIN_CLASS) && defined(NAMED_BIND) && defined(NO_WILDCARD_MX)
+ if (buf[1] == TOP_DOMAIN_CLASS) {
+ extern clear_topdomain;
+ clear_topdomain = FALSE;
+ }
+ #endif
/* read list of words from argument or file */
if (buf[0] == 'F')
{
*** /tmp/,RCSt1a05098 Thu Dec 20 23:06:04 1990
--- domain.c Thu Dec 20 23:05:20 1990
***************
*** 170,235 ****
return(nmx);
}
! /*
! ** Getcanonname() below is broken in the sense that it won't return
! ** unqualified local host names with their full domain extension,
! ** unless the argument is an alias.
**
! ** Since gethostbyname() calls the name server with bind 4.8,
! ** I don't see why this function would be needed at all. I've
! ** therefore restored the old code in maphostname() of daemon.c
! ** that uses gethostbyname(). If there's something I've missed,
! ** feel free to change maphostname() to again call getcanonname(),
! ** but also make sure that the latter will qualify the host with
! ** its full domain AND return a status code indicating if the host
! ** was found.
! **
! ** Lennart Lovstrand, Rank Xerox EuroPARC, 24-Aug-88
! **
! ** Unfortunately, just using gethostbyname won't do it. It queries for
! ** and returns only A Resource Records, so it will miss a host with only
! ** an MX record listed. If you're trying to deliver everything you can
! ** via the Internet, and deliver to only those hosts who are not in the
! ** domain name system at all by a "smart UUCP" mailer like smail, you
! ** will end up delivering more than you want to via that smart mailer.
! ** In that case, gethostbyname isn't enough.
! **
! ** Chet Ramey, Case Western Reserve University, 15-Sep-88
! **
! ** Changed to make it return FALSE on an error, TRUE if an answer was
! ** found (any answer is enough).
! **
! ** Chet Ramey, Case Western Reserve University, 16-Sep-88
! **
! ** In the case of a host with a MX record pointing at localhost,
! ** another routing method must be used. Examine any MX RRs returned.
! ** If the best one points to localhost, return FALSE.
! **
! ** Paul Pomes, University of Illinois, 10-Oct-88
*/
getcanonname(host, hbsize)
char *host;
int hbsize;
{
- extern int h_errno;
register u_char *eom, *cp;
! register int n;
HEADER *hp;
querybuf answer;
u_short type;
int first, ancount, qdcount, loopcnt;
char nbuf[PACKETSZ];
! u_short MailPreference = (u_short) -1;
char MailAgent[MAXNAME];
char MyName[MAXNAME];
char **MyAliases;
-
extern char **myhostname();
- MailAgent[0] = '\0';
-
loopcnt = 0;
loop:
/*
* Use query type of ANY if possible (NO_WILDCARD_MX), which will
* find types CNAME, A, and MX, and will cause all existing records
--- 170,320 ----
return(nmx);
}
! /* Getcanonname - try to find canonical names using the BIND name
! server. This is basically done by looking up entries and using
! the names found, or the CNAME values. If nothing is found then
! FALSE is returned. Note, that if the return value is FALSE,
! the host value is not necessarily valid - the code that calls
! getcanonname only uses host for TRUE results.
!
! The exact behaviour depends on the values of NO_WOLDCARD_MX,
! TOP_DOMAIN_CLASS, DONT_DNSRCH, LOOK_FOR_LONGSYNONYMS and
! IGNORE_SELF_MX - see conf.h for more details.
!
! This version, John.Forrest@umist.ac.uk December 90 */
!
! #ifndef NO_WILDCARD_MX
! /* if NO_WILDCARD_MX is undefined, we can only resolve full names. */
! # define is_full_name(host) (TRUE)
!
! #else
!
! #ifdef TOP_DOMAIN_CLASS
! clear_topdomain = TRUE;
! #endif /* TOP_DOMAIN_CLASS */
!
! static is_full_name (host)
! char *host;
! {
! char *top_dom;
!
! top_dom = rindex (host, '.');
! if (top_dom == NULL)
! return FALSE;
! top_dom += 1;
! if (*top_dom == '\0') /* name ends with "." */
! return TRUE;
! #if defined(TOP_DOMAIN_CLASS)
! {
! STAB *s;
! if (clear_topdomain) /* we know no top domains - have to */
! return TRUE; /* assume full for safety */
! /* is it in class TOP_DOMAIN_CLASS ? */
! s = stab (top_dom, ST_CLASS, ST_FIND);
! return (s != NULL && bitnset(TOP_DOMAIN_CLASS, s->s_class));
! }
! #else
! return FALSE;
! #endif /* TOP_DOMAIN_CLASS */
! }
!
! #endif /* !NO_WILDCARD_MX */
!
! #if defined(TOP_DOMAIN_CLASS) && defined(NO_WILDCARD_MX) && defined(LOG)
! # define CHECK_TOP 1
! #else
! # define CHECK_TOP 0
! #endif
!
! #if CHECK_TOP
!
! static check_top(host)
! char *host;
! {
! char *top_dom;
! STAB *s;
!
!
! if ((top_dom = rindex (host, '.')) == NULL) {
! syslog(LOG_WARNING, "Incomplete named found by BIND - %s",
! host);
! return;
! }
! if (clear_topdomain)
! return;
! top_dom += 1; /* skip over '.' */
! /* is it in class TOP_DOMAIN_CLASS ? */
! s = stab (top_dom, ST_CLASS, ST_FIND);
! if (s == NULL || ! bitnset(TOP_DOMAIN_CLASS, s->s_class))
! syslog (LOG_WARNING, "Unknown top domains %s in %s (returned from BIND)",
! top_dom, host);
! }
!
! #endif /* CHECK_TOP */
!
! #if defined(DONT_DNSRCH)
! # define SEARCH (RES_DEFNAMES)
! #else
! # define SEARCH (RES_DEFNAMES|RES_DNSRCH)
! #endif
!
! # if defined(IGNORE_SELF_MX)
! /* In the case of a host with a MX record pointing at localhost,
! ** another routing method must be used. Examine any MX RRs returned.
! ** If the best one points to localhost, return FALSE.
**
! ** Paul Pomes, University of Illinois, 10-Oct-88
*/
+
+ #define InitPreference 1000
+ # endif
+
getcanonname(host, hbsize)
char *host;
int hbsize;
{
register u_char *eom, *cp;
! register int n;
HEADER *hp;
querybuf answer;
u_short type;
int first, ancount, qdcount, loopcnt;
char nbuf[PACKETSZ];
! char *wanted_name;
! #ifdef LOOK_FOR_LONGSYNONYMS
! char name_stub [MAXNAME];
! char *temp;
! #endif
! int must_be_full;
! long keep_res_options;
! int search_failed;
! #ifdef IGNORE_SELF_MX
! u_short MailPreference;
char MailAgent[MAXNAME];
char MyName[MAXNAME];
char **MyAliases;
extern char **myhostname();
+ #endif
+ #ifdef LOOK_FOR_LONGSYNONYMS
+ # define no_stub() (*name_stub == '\0')
+ #else
+ # define no_stub() (TRUE)
+ #endif
loopcnt = 0;
+ must_be_full = is_full_name (host);
+ keep_res_options = _res.options;
loop:
+ wanted_name = host;
+ #ifdef IGNORE_SELF_MX
+ MailPreference = InitPreference;
+ MailAgent[0] = '\0';
+ #endif
+ #ifdef LOOK_FOR_LONGSYNONYMS
+ strcpy (name_stub, "");
+ while (strlen(wanted_name) > 0) {
+ #endif
+ search_failed = 0;
/*
* Use query type of ANY if possible (NO_WILDCARD_MX), which will
* find types CNAME, A, and MX, and will cause all existing records
***************
*** 238,303 ****
* searched, we can't use ANY; it would cause fully-qualified names
* to match as names in a local domain.
*/
! # ifndef NO_WILDCARD_MX
! _res.options &= ( ~RES_DEFNAMES & 0xffff ) ;
! # endif /* NO_WILDCARD_MX */
! n = res_search(host, C_IN, T_ANY, (char *)&answer, sizeof(answer));
! # ifndef NO_WILDCARD_MX
! _res.options |= RES_DEFNAMES ;
! # endif /* NO_WILDCARD_MX */
if (n < 0) {
- /*
- * If getcanonname() times out we don't really know whether
- * the name is good or bad. Give it the benefit of the doubt,
- * take it in and sort it out later using getmxrr().
- */
- if (h_errno == TRY_AGAIN)
- {
- if (tTd(8, 1))
- printf("getcanonname: res_search timed out (errno=%d, h_errno=%d)\n",
- errno, h_errno);
- return TRUE;
- }
if (tTd(8, 1))
printf("getcanonname: res_search failed (errno=%d, h_errno=%d)\n",
errno, h_errno);
!
! return FALSE;
}
! /* find first satisfactory answer */
! hp = (HEADER *)&answer;
! ancount = ntohs(hp->ancount);
! /* we don't care about errors here, only if we got an answer */
! if (ancount == 0) {
! if (tTd(8, 1))
! printf("rcode = %d, ancount=%d\n", hp->rcode, ancount);
! return FALSE;
}
! cp = (u_char *)&answer + sizeof(HEADER);
! eom = (u_char *)&answer + n;
! for (qdcount = ntohs(hp->qdcount); qdcount--; cp += n + QFIXEDSZ)
! if ((n = dn_skipname(cp, eom)) < 0)
return FALSE;
!
/*
* just in case someone puts a CNAME record after another record,
* check all records for CNAME; otherwise, just take the first
* name found.
*/
! for (first = 1; --ancount >= 0 && cp < eom; ) {
if ((n = dn_expand((char *)&answer, eom, cp, nbuf,
sizeof(nbuf))) < 0)
break;
! if (first) { /* XXX */
! (void)strncpy(host, nbuf, hbsize);
! host[hbsize - 1] = '\0';
first = 0;
}
cp += n;
GETSHORT(type, cp);
! cp += sizeof(u_short) + sizeof(u_long);
GETSHORT(n, cp);
if (type == T_CNAME) {
/*
--- 323,427 ----
* searched, we can't use ANY; it would cause fully-qualified names
* to match as names in a local domain.
*/
! if (must_be_full)
! _res.options &= ( ~SEARCH & 0xffff );
! else
! _res.options |= SEARCH;
! if (tTd(8, 1))
! printf ("getcanonname: looking for %s (%d %d %x)\n", wanted_name,
! no_stub(), must_be_full, _res.options); /* DEBUG */
! n = 0;
! if (! no_stub ()) {
! /* if this is true, we are just interested in CNAMES,
! but in BIND4.6 at least, a lookup for CNAME
! seems to produce "delayed" lookup, even with
! RES_RECURSE set. Thus, look on local server for
! CNAME, and if that fails do ANY normally */
! if (tTd(8, 2))
! printf ("getcanonname: looking for CNAME\n");
! _res.options &= ~ RES_RECURSE;
! n = res_search(wanted_name, C_IN,
! T_CNAME, (char *)&answer, sizeof(answer));
! _res.options |= RES_RECURSE;
! }
! if (n <= 0) {
! if (tTd(8, 2))
! printf ("getcanonname: looking for ANY\n");
! n = res_search(wanted_name, C_IN,
! T_ANY, (char *)&answer, sizeof(answer));
! }
! _res.options = keep_res_options;
if (n < 0) {
if (tTd(8, 1))
printf("getcanonname: res_search failed (errno=%d, h_errno=%d)\n",
errno, h_errno);
! if (h_errno == TRY_AGAIN) /* difficult to know what to do */
! #ifdef IGNORE_TRYAGAIN
! return TRUE;
! #else
! return FALSE;
! #endif
! search_failed ++;
}
! if (!search_failed) {
! /* find first satisfactory answer */
! hp = (HEADER *)&answer;
! ancount = ntohs(hp->ancount);
! /* we don't care about errors here, only if we got an answer */
! if (ancount == 0) {
! if (tTd(8, 1))
! printf("rcode = %d, ancount=%d\n", hp->rcode, ancount);
! search_failed ++;
! }
}
! if (!search_failed) {
! cp = (u_char *)&answer + sizeof(HEADER);
! eom = (u_char *)&answer + n;
! for (qdcount = ntohs(hp->qdcount); qdcount--; cp += n + QFIXEDSZ)
! if ((n = dn_skipname(cp, eom)) < 0)
! search_failed ++;
! }
! if (search_failed)
! # ifdef LOOK_FOR_LONGSYNONYMS
! {
! temp = index (wanted_name, '.');
! if (temp == NULL)
return FALSE;
! temp += 1;
! if (*temp == '\0')
! return FALSE;
! strncat (name_stub, wanted_name, temp - wanted_name);
! wanted_name = temp;
! continue;
! }
! # else
! return FALSE;
! # endif
/*
* just in case someone puts a CNAME record after another record,
* check all records for CNAME; otherwise, just take the first
* name found.
*/
! for (first = 1; --ancount >= 0 && cp < eom; cp += n) {
if ((n = dn_expand((char *)&answer, eom, cp, nbuf,
sizeof(nbuf))) < 0)
break;
! if (first) { /* XXX */
! /* if ! no_stub() we are only interested in CNAME ! */
! if (no_stub ()) {
! (void)strncpy(host, nbuf, hbsize);
! host[hbsize - 1] = '\0';
! #if CHECK_TOP
! check_top (host);
! #endif
! }
first = 0;
}
cp += n;
GETSHORT(type, cp);
! cp += sizeof(u_short) + sizeof(u_long);
GETSHORT(n, cp);
if (type == T_CNAME) {
/*
***************
*** 308,320 ****
if ((n = dn_expand((char *)&answer, eom, cp, nbuf,
sizeof(nbuf))) < 0)
break;
! /* cp += n; un-used -pbp */
(void)strncpy(host, nbuf, hbsize); /* XXX */
host[hbsize - 1] = '\0';
! if (++loopcnt > 8) /* never be more than 1 */
return FALSE;
goto loop;
}
else if (type == T_MX) {
/*
* Be sure that the best MX record doesn't point
--- 432,454 ----
if ((n = dn_expand((char *)&answer, eom, cp, nbuf,
sizeof(nbuf))) < 0)
break;
! #ifdef LOOK_FOR_LONGSYNONYMS
! host [0] = '\0';
! strncat (host, name_stub, hbsize);
! strncat (host, nbuf, hbsize - strlen (host));
! #else
(void)strncpy(host, nbuf, hbsize); /* XXX */
host[hbsize - 1] = '\0';
! #endif
! #if CHECK_TOP
! check_top (host);
! #endif
! must_be_full = 1; /* new name is bound to be full */
! if (++loopcnt > 8) /* never be more than 1 */
return FALSE;
goto loop;
}
+ #ifdef IGNORE_SELF_MX
else if (type == T_MX) {
/*
* Be sure that the best MX record doesn't point
***************
*** 328,334 ****
if ((n = dn_expand((char *)&answer, eom, cp, nbuf,
sizeof(nbuf))) < 0)
break;
- cp += n;
if (tTd(8, 1))
printf("getcanonname: MX host %s, preference %d\n",
nbuf, preference);
--- 462,467 ----
***************
*** 335,349 ****
if (preference < MailPreference) {
MailPreference = preference;
(void) strcpy(MailAgent, nbuf);
! }
}
! else
! cp += n;
}
/* test MailAgent against $j */
if (MailAgent[0] != '\0' && MyHostName != NULL &&
strcasecmp(MailAgent, MyHostName) == 0)
! return (FALSE);
/* test MailAgent against our DNS name and aliases */
if (MailAgent[0] != '\0' &&
--- 468,495 ----
if (preference < MailPreference) {
MailPreference = preference;
(void) strcpy(MailAgent, nbuf);
! }
}
! #endif /* IGNORE_SELF_MX */
}
+ #ifdef LOOK_FOR_LONGSYNONYMS
+ break;
+ }
+ #endif
+ if (tTd(8, 1))
+ #ifdef LOOK_FOR_LONGSYNONYMS
+ printf ("getcanonname: found stub='%s' host='%s'\n",
+ name_stub, host);
+ #else
+ printf ("getcanonname: found '%s'\n", host);
+ #endif
+ if (! no_stub())
+ return FALSE;
+ #ifdef IGNORE_SELF_MX
/* test MailAgent against $j */
if (MailAgent[0] != '\0' && MyHostName != NULL &&
strcasecmp(MailAgent, MyHostName) == 0)
! return FALSE;
/* test MailAgent against our DNS name and aliases */
if (MailAgent[0] != '\0' &&
***************
*** 353,362 ****
for (; *MyAliases != NULL; MyAliases++)
if (strcasecmp(MailAgent, *MyAliases) == 0)
return FALSE;
- return TRUE;
}
! else
! return TRUE;
}
#else /* !NAMED_BIND */
--- 499,507 ----
for (; *MyAliases != NULL; MyAliases++)
if (strcasecmp(MailAgent, *MyAliases) == 0)
return FALSE;
}
! #endif /* IGNORE_SELF_MX */
! return TRUE;
}
#else /* !NAMED_BIND */
***************
*** 371,382 ****
hp = gethostbyname(host);
if (hp == NULL)
! return;
if (strlen(hp->h_name) >= hbsize)
! return;
(void) strcpy(host, hp->h_name);
}
#endif /* !NAMED_BIND */
--- 516,529 ----
hp = gethostbyname(host);
if (hp == NULL)
! return FALSE;
if (strlen(hp->h_name) >= hbsize)
! return FALSE;
(void) strcpy(host, hp->h_name);
+
+ return TRUE;
}
#endif /* !NAMED_BIND */