1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
1998-11-20  Ulrich Drepper  <drepper@cygnus.com>

	* aclocal.m4 (LIBC_PROG_BINUTILS): Also add AR and RANLIB using the
	same method.
	* configure.in: Don't define AR and RANLIB here.

	* inet/gethstbyad_r.c: Define NEED__RES_HCONV and POSTPROCESS for
	host name res_hconf code.
	* inet/gethstbynm_r.c: Likewise.
	* nss/getXXbyYY_r.c: Include resolv/res_hconf.h if NEED__RES_HCONF
	is defined.  Call res_hconf_init if necessary.  If POSTPROCESS is
	defined execute the code.
	* resolv/Makefile (routines): Add res_hconf.
	(headers): Add res_hconf.h.
	* resolv/res_hconf.c: Pretty print.
	* resolv/res_hconf.h: Likewise.

1998-11-20  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/generic/bits/byteswap.h: Fix typos in non-GCC
	definitions.  Reported by Scott Bambrough <scottb@corelcomputer.com>.

1998-11-20 1998  Andreas Schwab  <schwab@issan.cs.uni-dortmund.de>

	* math/libm-test.c: Raise some epsilons a bit.

1998-11-20  Andreas Schwab  <schwab@issan.cs.uni-dortmund.de>

	* Makeconfig ($(common-objpfx)sysd-sorted): Fix portability problems.

1998-11-20  Ulrich Drepper  <drepper@cygnus.com>

	* Makefile (distribute): Add scripts/gen-sorted.awk.
This commit is contained in:
Ulrich Drepper
1998-11-20 17:27:07 +00:00
parent bece5ca7c1
commit 5edb938769
19 changed files with 446 additions and 377 deletions

View File

@ -23,9 +23,9 @@ subdir := resolv
headers := resolv.h netdb.h arpa/nameser.h sys/bitypes.h
distribute := ../conf/portability.h mapv4v6addr.h mapv4v6hostent.h \
Banner
Banner res_hconf.h
routines := herror inet_addr inet_ntop inet_pton nsap_addr res_init
routines := herror inet_addr inet_ntop inet_pton nsap_addr res_init res_hconf
tests = tst-aton

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
/* Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by David Mosberger (davidm@azstarnet.com).
The GNU C Library is free software; you can redistribute it and/or
@ -32,6 +32,7 @@ to the original implementation:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <net/if.h>
#include "res_hconf.h"
@ -46,19 +47,21 @@ to the original implementation:
#define ENV_MULTI "RESOLV_MULTI"
#define ENV_REORDER "RESOLV_REORDER"
static const char * arg_service_list (const char *, int, const char *,
unsigned);
static const char * arg_trimdomain_list (const char *, int, const char *,
unsigned);
static const char * arg_spoof (const char *, int, const char *, unsigned);
static const char * arg_bool (const char *, int, const char *, unsigned);
static const char *arg_service_list (const char *, int, const char *,
unsigned int);
static const char *arg_trimdomain_list (const char *, int, const char *,
unsigned int);
static const char *arg_spoof (const char *, int, const char *, unsigned int);
static const char *arg_bool (const char *, int, const char *, unsigned int);
static struct cmd {
const char * name;
const char * (*parse_args)(const char * filename, int line_num,
const char * args, unsigned arg);
unsigned arg;;
} cmd[] = {
static struct cmd
{
const char *name;
const char *(*parse_args) (const char * filename, int line_num,
const char * args, unsigned int arg);
unsigned int arg;
} cmd[] =
{
{"order", arg_service_list, 0},
{"trim", arg_trimdomain_list, 0},
{"spoof", arg_spoof, 0},
@ -68,10 +71,12 @@ static struct cmd {
{"reorder", arg_bool, HCONF_FLAG_REORDER}
};
/* Structure containing the state. */
struct hconf _res_hconf;
/* Skip white space. */
static const char *
skip_ws (const char * str)
skip_ws (const char *str)
{
while (isspace (*str)) ++str;
return str;
@ -80,29 +85,32 @@ skip_ws (const char * str)
/* Skip until whitespace, comma, end of line, or comment character. */
static const char *
skip_string (const char * str)
skip_string (const char *str)
{
while (*str && !isspace (*str) && *str != '#' && *str != ',') ++str;
while (*str && !isspace (*str) && *str != '#' && *str != ',')
++str;
return str;
}
static const char *
arg_service_list (const char * fname, int line_num, const char * args,
unsigned arg)
arg_service_list (const char *fname, int line_num, const char *args,
unsigned int arg)
{
enum Name_Service service;
const char * start;
const char *start;
size_t len;
int i;
static struct {
const char * name;
enum Name_Service service;
} svcs[] = {
{"bind", SERVICE_BIND},
{"hosts", SERVICE_HOSTS},
{"nis", SERVICE_NIS},
};
static struct
{
const char * name;
enum Name_Service service;
} svcs[] =
{
{"bind", SERVICE_BIND},
{"hosts", SERVICE_HOSTS},
{"nis", SERVICE_NIS},
};
do
{
@ -113,7 +121,7 @@ arg_service_list (const char * fname, int line_num, const char * args,
service = SERVICE_NONE;
for (i = 0; i < sizeof (svcs) / sizeof (svcs[0]); ++i)
{
if (strncasecmp (start, svcs[i].name, len) == 0
if (__strncasecmp (start, svcs[i].name, len) == 0
&& len == strlen (svcs[i].name))
{
service = svcs[i].service;
@ -137,7 +145,9 @@ arg_service_list (const char * fname, int line_num, const char * args,
args = skip_ws (args);
switch (*args)
{
case ',': case ';': case ':':
case ',':
case ';':
case ':':
args = skip_ws (++args);
if (!*args || *args == '#')
{
@ -156,8 +166,8 @@ arg_service_list (const char * fname, int line_num, const char * args,
static const char *
arg_trimdomain_list (const char * fname, int line_num, const char * args,
unsigned flag)
arg_trimdomain_list (const char *fname, int line_num, const char *args,
unsigned int flag)
{
const char * start;
size_t len;
@ -176,7 +186,7 @@ arg_trimdomain_list (const char * fname, int line_num, const char * args,
return 0;
}
_res_hconf.trimdomain[_res_hconf.num_trimdomains++] =
strndup (start, len);
__strndup (start, len);
args = skip_ws (args);
switch (*args)
{
@ -199,21 +209,21 @@ arg_trimdomain_list (const char * fname, int line_num, const char * args,
static const char *
arg_spoof (const char * fname, int line_num, const char * args, unsigned flag)
arg_spoof (const char *fname, int line_num, const char *args, unsigned flag)
{
const char * start = args;
const char *start = args;
size_t len;
args = skip_string (args);
len = args - start;
if (len == 3 && strncasecmp (start, "off", len) == 0)
if (len == 3 && __strncasecmp (start, "off", len) == 0)
_res_hconf.flags &= ~(HCONF_FLAG_SPOOF | HCONF_FLAG_SPOOFALERT);
else
{
_res_hconf.flags |= (HCONF_FLAG_SPOOF | HCONF_FLAG_SPOOFALERT);
if ((len == 6 && strncasecmp (start, "nowarn", len) == 0)
|| !(len == 4 && strncasecmp (start, "warn", len) == 0))
if ((len == 6 && __strncasecmp (start, "nowarn", len) == 0)
|| !(len == 4 && __strncasecmp (start, "warn", len) == 0))
_res_hconf.flags &= ~HCONF_FLAG_SPOOFALERT;
}
return args;
@ -221,14 +231,14 @@ arg_spoof (const char * fname, int line_num, const char * args, unsigned flag)
static const char *
arg_bool (const char * fname, int line_num, const char * args, unsigned flag)
arg_bool (const char *fname, int line_num, const char *args, unsigned flag)
{
if (strncasecmp (args, "on", 2) == 0)
if (__strncasecmp (args, "on", 2) == 0)
{
args += 2;
_res_hconf.flags |= flag;
}
else if (strncasecmp (args, "off", 3) == 0)
else if (__strncasecmp (args, "off", 3) == 0)
{
args += 3;
_res_hconf.flags &= ~flag;
@ -244,10 +254,10 @@ arg_bool (const char * fname, int line_num, const char * args, unsigned flag)
static void
parse_line (const char * fname, int line_num, const char * str)
parse_line (const char *fname, int line_num, const char *str)
{
const char * start;
struct cmd * c = 0;
const char *start;
struct cmd *c = 0;
size_t len;
int i;
@ -268,7 +278,7 @@ parse_line (const char * fname, int line_num, const char * str)
break;
}
}
if (!c)
if (c == NULL)
{
fprintf (stderr, "%s: line %d: bad command `%s'\n",
fname, line_num, start);
@ -300,15 +310,18 @@ parse_line (const char * fname, int line_num, const char * str)
void
_res_hconf_init (void)
{
const char * hconf_name;
const char *hconf_name;
int line_num = 0;
char buf[256], * end, * envval;
FILE * fp;
char buf[256], *end, *envval;
FILE *fp;
memset (&_res_hconf, 0, sizeof (_res_hconf));
if (_res_hconf.initialized)
return;
memset (&_res_hconf, '\0', sizeof (_res_hconf));
hconf_name = getenv (ENV_HOSTCONF);
if (!hconf_name)
if (hconf_name == NULL)
hconf_name = _PATH_HOSTCONF;
fp = fopen (hconf_name, "r");
@ -317,7 +330,7 @@ _res_hconf_init (void)
_res_hconf.service[_res_hconf.num_services++] = SERVICE_BIND;
else
{
while (fgets (buf, sizeof (buf), fp))
while (fgets_unlocked (buf, sizeof (buf), fp))
{
++line_num;
end = strchr (buf, '\n');
@ -357,6 +370,8 @@ _res_hconf_init (void)
_res_hconf.num_trimdomains = 0;
arg_trimdomain_list (ENV_TRIM_OVERR, 1, envval, 0);
}
_res_hconf.initialized = 1;
}
@ -365,19 +380,22 @@ _res_hconf_init (void)
Otherwise, nothing is changed. */
void
_res_hconf_reorder_addrs (struct hostent * hp)
_res_hconf_reorder_addrs (struct hostent *hp)
{
#if defined (SIOCGIFCONF) && defined (SIOCGIFNETMASK)
#if defined SIOCGIFCONF && defined SIOCGIFNETMASK
static int num_ifs = -1; /* number of interfaces */
static struct netaddr {
static struct netaddr
{
int addrtype;
union {
struct {
union
{
struct
{
u_int32_t addr;
u_int32_t mask;
} ipv4
} u;
} * ifaddrs;
} *ifaddrs;
if (hp->h_addrtype != AF_INET)
return; /* can't deal with anything but IPv4 for now... */
@ -385,7 +403,7 @@ _res_hconf_reorder_addrs (struct hostent * hp)
if (num_ifs <= 0)
{
struct ifconf ifs;
struct ifreq * ifr;
struct ifreq *ifr;
size_t size, num;
int sd;
@ -393,7 +411,7 @@ _res_hconf_reorder_addrs (struct hostent * hp)
num_ifs = 0;
sd = socket (AF_INET, SOCK_DGRAM, 0);
sd = __socket (AF_INET, SOCK_DGRAM, 0);
if (sd < 0)
return;
@ -404,18 +422,20 @@ _res_hconf_reorder_addrs (struct hostent * hp)
interfaces, not memory */
size = 0;
ifs.ifc_buf = 0;
do {
size += 4 * sizeof (struct ifreq);
ifs.ifc_buf = realloc (ifs.ifs_buf, size);
if (!ifs.ifc_buf)
{
close (sd);
return;
}
ifs.ifc_len = size;
if (ioctl (sd, SIOCGIFCONF, &ifs) < 0)
goto cleanup;
} while (size - ifs.ifc_len < sizeof (struct ifreq));
do
{
size += 4 * sizeof (struct ifreq);
ifs.ifc_buf = realloc (ifs.ifs_buf, size);
if (ifs.ifc_buf == NULL)
{
close (sd);
return;
}
ifs.ifc_len = size;
if (__ioctl (sd, SIOCGIFCONF, &ifs) < 0)
goto cleanup;
}
while (size - ifs.ifc_len < sizeof (struct ifreq));
num = ifs.ifc_len / sizeof (struct ifreq);
@ -424,21 +444,22 @@ _res_hconf_reorder_addrs (struct hostent * hp)
goto cleanup;
ifr = ifs.ifc_req;
for (i = 0; i < num; ++i) {
if (ifr->ifr_addr.sa_family != AF_INET)
continue;
ifaddrs[num_ifs].addrtype = AF_INET;
for (i = 0; i < num; ++i)
{
if (ifr->ifr_addr.sa_family != AF_INET)
continue;
ifaddrs[num_ifs].addrtype = AF_INET;
memcpy (&ifaddrs[num_ifs].u.ipv4.addr,
&((struct sockaddr_in *)ifr->ifr_addr)->sin_addr, 4);
memcpy (&ifaddrs[num_ifs].u.ipv4.addr,
&((struct sockaddr_in *)ifr->ifr_addr)->sin_addr, 4);
if (ioctl (sd, SIOCGIFNETMASK, if) < 0)
continue;
memcpy (&ifaddrs[num_ifs].u.ipv4.mask,
((struct sockaddr_in *)ifr->ifr_mask)->sin_addr, 4);
if (__ioctl (sd, SIOCGIFNETMASK, if) < 0)
continue;
memcpy (&ifaddrs[num_ifs].u.ipv4.mask,
((struct sockaddr_in *)ifr->ifr_mask)->sin_addr, 4);
++num_ifs; /* now we're committed to this entry */
}
++num_ifs; /* now we're committed to this entry */
}
/* just keep enough memory to hold all the interfaces we want: */
ifaddrs = realloc (ifaddrs, num_ifs * sizeof (ifaddrs[0]));
@ -462,9 +483,9 @@ _res_hconf_reorder_addrs (struct hostent * hp)
if (((h_addr->s_addr ^ if_addr) & if_netmask) == 0)
{
void * tmp;
void *tmp;
tmp = hp->h_addr_list[i];
tmp = hp->h_addr_list[i];
hp->h_addr_list[i] = hp->h_addr_list[0];
hp->h_addr_list[0] = tmp;
return;
@ -481,20 +502,20 @@ _res_hconf_reorder_addrs (struct hostent * hp)
same domainname could be trimmed multiple times. I believe this
was unintentional. */
void
_res_hconf_trim_domain (char * hostname)
_res_hconf_trim_domain (char *hostname)
{
size_t hostname_len, trim_len;
int i;
hostname_len = strlen(hostname);
hostname_len = strlen (hostname);
for (i = 0; i < _res_hconf.num_trimdomains; ++i)
{
const char * trim = _res_hconf.trimdomain[i];
const char *trim = _res_hconf.trimdomain[i];
trim_len = strlen(trim);
trim_len = strlen (trim);
if (hostname_len > trim_len
&& strcasecmp(&hostname[hostname_len - trim_len], trim) == 0)
&& __strcasecmp (&hostname[hostname_len - trim_len], trim) == 0)
{
hostname[hostname_len - trim_len] = '\0';
break;
@ -506,7 +527,7 @@ _res_hconf_trim_domain (char * hostname)
/* Trim all hostnames/aliases in HP according to the trimdomain list.
Notice that HP is modified inplace! */
void
_res_hconf_trim_domains (struct hostent * hp)
_res_hconf_trim_domains (struct hostent *hp)
{
int i;
@ -517,32 +538,3 @@ _res_hconf_trim_domains (struct hostent * hp)
for (i = 0; hp->h_aliases[i]; ++i)
_res_hconf_trim_domain (hp->h_aliases[i]);
}
#if 0
struct hostent *
_hconf_gethostent (void)
{
}
struct hostent *
_hconf_gethostbyname (const char * name)
{
}
struct hostent *
_hconf_gethostbyaddr (const char * addr, int len, int type)
{
}
struct hostent *
_hconf_gethtbyname (const char * name)
{
}
#endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
/* Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by David Mosberger (davidm@azstarnet.com).
The GNU C Library is free software; you can redistribute it and/or
@ -23,28 +23,32 @@
#define TRIMDOMAINS_MAX 4
enum Name_Service {
enum Name_Service
{
SERVICE_NONE = 0,
SERVICE_BIND, SERVICE_HOSTS, SERVICE_NIS,
SERVICE_MAX
};
struct hconf {
int num_services;
enum Name_Service service[SERVICE_MAX];
int num_trimdomains;
const char * trimdomain[TRIMDOMAINS_MAX];
unsigned flags;
struct hconf
{
int initialized;
int num_services;
enum Name_Service service[SERVICE_MAX];
int num_trimdomains;
const char *trimdomain[TRIMDOMAINS_MAX];
unsigned int flags;
# define HCONF_FLAG_INITED (1 << 0) /* initialized? */
# define HCONF_FLAG_SPOOF (1 << 1) /* refuse spoofed addresses */
# define HCONF_FLAG_SPOOFALERT (1 << 2) /* syslog warning of spoofed */
# define HCONF_FLAG_REORDER (1 << 3) /* list best address first */
# define HCONF_FLAG_MULTI (1 << 4) /* see comments for gethtbyname() */
} _res_hconf;
};
extern struct hconf _res_hconf;
extern void _res_hconf_init (void);
extern void _res_hconf_trim_domain (char * domain);
extern void _res_hconf_trim_domains (struct hostent * hp);
extern void _res_hconf_reorder_addrs (struct hostent * hp);
extern void _res_hconf_init (void);
extern void _res_hconf_trim_domain (char *domain);
extern void _res_hconf_trim_domains (struct hostent *hp);
extern void _res_hconf_reorder_addrs (struct hostent *hp);
#endif /* _RES_HCONF_H_ */