4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-01-19 12:59:21 +08:00

Use dup_ent rather than specific dup_*_ptr functions throughout.

* (gen_ent): Delete.
(dup_ent): Subsume gen_ent functionality.
(dup_host_ptr): Delete.
(dup_proto_ptr): Ditto.
(dup_servent_ptr): Ditto.
* net.cc (gen_ent): Invert sense of null check so that debug output makes
sense.
This commit is contained in:
Christopher Faylor 2003-08-31 23:16:34 +00:00
parent edf16a29fc
commit a3de4e19b4
2 changed files with 45 additions and 36 deletions

View File

@ -1,3 +1,17 @@
2003-08-31 Christopher Faylor <cgf@redhat.com>
Use dup_ent rather than specific dup_*_ptr functions throughout.
* (gen_ent): Delete.
(dup_ent): Subsume gen_ent functionality.
(dup_host_ptr): Delete.
(dup_proto_ptr): Ditto.
(dup_servent_ptr): Ditto.
2003-08-31 Christopher Faylor <cgf@redhat.com>
* net.cc (gen_ent): Invert sense of null check so that debug output
makes sense.
2003-08-31 Christopher Faylor <cgf@redhat.com> 2003-08-31 Christopher Faylor <cgf@redhat.com>
* net.cc (free_char_list): Delete. * net.cc (free_char_list): Delete.

View File

@ -396,11 +396,6 @@ strlen_round (const char *s)
return DWORD_round (strlen (s) + 1); return DWORD_round (strlen (s) + 1);
} }
enum struct_type
{
is_protoent, is_servent, is_hostent
};
#pragma pack(push,2) #pragma pack(push,2)
struct pservent struct pservent
{ {
@ -424,6 +419,13 @@ struct unionent
}; };
}; };
enum struct_type
{
is_hostent, is_protoent, is_servent
};
static const char *entnames[] = {"host", "proto", "serv"};
/* Generic "dup a {host,proto,serv}ent structure" function. /* Generic "dup a {host,proto,serv}ent structure" function.
This is complicated because we need to be able to free the This is complicated because we need to be able to free the
structure at any point and we can't rely on the pointer contents structure at any point and we can't rely on the pointer contents
@ -438,9 +440,18 @@ static void *
#else #else
static inline void * static inline void *
#endif #endif
dup_ent (void *src0, struct_type type) dup_ent (void *old, void *src0, struct_type type)
{ {
if (old)
{
debug_printf ("freeing old %sent structure(%s) %p\n", entnames[type],
((unionent *) old)->name, old);
free (old);
}
unionent *src = (unionent *) src0; unionent *src = (unionent *) src0;
debug_printf ("duping %sent \"%s\", %p", entnames[type],
src ? src->name : "<null!>", src);
/* Find the size of the raw structure minus any character strings, etc. */ /* Find the size of the raw structure minus any character strings, etc. */
int sz, struct_sz; int sz, struct_sz;
@ -565,29 +576,10 @@ dup_ent (void *src0, struct_type type)
/* Sanity check that we did our bookkeeping correctly. */ /* Sanity check that we did our bookkeeping correctly. */
assert ((dp - (char *) dst) == sz); assert ((dp - (char *) dst) == sz);
} }
debug_printf ("duped %sent \"%s\", %p", entnames[type], dst ? dst->name : "<null!>", dst);
return dst; return dst;
} }
/* Generic macro to build a dup_{host,proto,serv}ent_ptr function.
The *ent buffers are allocated by dup_ent as contiguous storage.
Frees any previously exiting `old' storage, as well. */
#define gen_ent(x, p) \
static x * \
dup_##x##_ptr (x *old, x *src) \
{ \
if (old) \
{ \
debug_printf ("freeing %s", old->p##_name); \
free (old); \
} \
debug_printf ("%s", src ? "<null!>" : src->p##_name); \
x *dst = (x *) dup_ent (src, is_##x); \
debug_printf ("copied %s", dst ? "<null!>" : dst->p##_name); \
return dst; \
} \
gen_ent (protoent, p)
#ifdef _MT_SAFE #ifdef _MT_SAFE
#define protoent_buf _reent_winsup ()->_protoent_buf #define protoent_buf _reent_winsup ()->_protoent_buf
#else #else
@ -600,7 +592,8 @@ cygwin_getprotobyname (const char *p)
{ {
if (check_null_str_errno (p)) if (check_null_str_errno (p))
return NULL; return NULL;
protoent_buf = dup_protoent_ptr (protoent_buf, getprotobyname (p)); protoent_buf = (protoent *) dup_ent (protoent_buf, getprotobyname (p),
is_protoent);
if (!protoent_buf) if (!protoent_buf)
set_winsock_errno (); set_winsock_errno ();
@ -612,7 +605,8 @@ cygwin_getprotobyname (const char *p)
extern "C" struct protoent * extern "C" struct protoent *
cygwin_getprotobynumber (int number) cygwin_getprotobynumber (int number)
{ {
protoent_buf = dup_protoent_ptr (protoent_buf, getprotobynumber (number)); protoent_buf = (protoent *) dup_ent (protoent_buf, getprotobynumber (number),
is_protoent);
if (!protoent_buf) if (!protoent_buf)
set_winsock_errno (); set_winsock_errno ();
@ -942,8 +936,6 @@ cygwin_connect (int fd, const struct sockaddr *name, int namelen)
return res; return res;
} }
gen_ent (servent, s)
#ifdef _MT_SAFE #ifdef _MT_SAFE
#define servent_buf _reent_winsup ()->_servent_buf #define servent_buf _reent_winsup ()->_servent_buf
#else #else
@ -960,7 +952,8 @@ cygwin_getservbyname (const char *name, const char *proto)
|| (proto != NULL && check_null_str_errno (proto))) || (proto != NULL && check_null_str_errno (proto)))
return NULL; return NULL;
servent_buf = dup_servent_ptr (servent_buf, getservbyname (name, proto)); servent_buf = (servent *) dup_ent (servent_buf, getservbyname (name, proto),
is_servent);
if (!servent_buf) if (!servent_buf)
set_winsock_errno (); set_winsock_errno ();
@ -977,7 +970,8 @@ cygwin_getservbyport (int port, const char *proto)
if (proto != NULL && check_null_str_errno (proto)) if (proto != NULL && check_null_str_errno (proto))
return NULL; return NULL;
servent_buf = dup_servent_ptr (servent_buf, getservbyport (port, proto)); servent_buf = (servent *) dup_ent (servent_buf, getservbyport (port, proto),
is_servent);
if (!servent_buf) if (!servent_buf)
set_winsock_errno (); set_winsock_errno ();
@ -1008,8 +1002,6 @@ cygwin_gethostname (char *name, size_t len)
return 0; return 0;
} }
gen_ent (hostent, h)
#ifdef _MT_SAFE #ifdef _MT_SAFE
#define hostent_buf _reent_winsup ()->_hostent_buf #define hostent_buf _reent_winsup ()->_hostent_buf
#else #else
@ -1048,7 +1040,8 @@ cygwin_gethostbyname (const char *name)
return &tmp; return &tmp;
} }
hostent_buf = dup_hostent_ptr (hostent_buf, gethostbyname (name)); hostent_buf = (hostent *) dup_ent (hostent_buf, gethostbyname (name),
is_hostent);
if (!hostent_buf) if (!hostent_buf)
{ {
set_winsock_errno (); set_winsock_errno ();
@ -1071,7 +1064,9 @@ cygwin_gethostbyaddr (const char *addr, int len, int type)
if (__check_invalid_read_ptr_errno (addr, len)) if (__check_invalid_read_ptr_errno (addr, len))
return NULL; return NULL;
hostent_buf = dup_hostent_ptr (hostent_buf, gethostbyaddr (addr, len, type)); hostent_buf = (hostent *) dup_ent (hostent_buf,
gethostbyaddr (addr, len, type),
is_hostent);
if (!hostent_buf) if (!hostent_buf)
{ {
set_winsock_errno (); set_winsock_errno ();