diff options
author | unknown <monty@hundin.mysql.fi> | 2002-05-16 16:32:51 +0300 |
---|---|---|
committer | unknown <monty@hundin.mysql.fi> | 2002-05-16 16:32:51 +0300 |
commit | d2b95cd7ab5b3ed450af572e9c77cd11d3c420ba (patch) | |
tree | 145820cb9685468167f09ba07a59a1f61ca640cf /mysys/my_gethostbyname.c | |
parent | eba5ec8b4bceabab302462db850882f715a7b040 (diff) | |
download | mariadb-git-d2b95cd7ab5b3ed450af572e9c77cd11d3c420ba.tar.gz |
New my_gethostbyname_r() handling
Changed some status variable names
Fix bug in GRANT ... PASSWORD string
Docs/manual.texi:
Update of variable names
include/my_net.h:
New my_gethostbyname_r() handling
include/my_pthread.h:
New my_gethostbyname_r() handling
libmysql/Makefile.shared:
New my_gethostbyname_r() handling
libmysql/libmysql.c:
New my_gethostbyname_r() handling
mysys/Makefile.am:
New my_gethostbyname_r() handling
mysys/my_pthread.c:
New my_gethostbyname_r() handling
mysys/my_thr_init.c:
New my_gethostbyname_r() handling
sql/hostname.cc:
New my_gethostbyname_r() handling
sql/mini_client.cc:
New my_gethostbyname_r() handling
sql/mysqld.cc:
change some status variable names
sql/sql_acl.cc:
Fix bug in GRANT ... PASSWORD string
Diffstat (limited to 'mysys/my_gethostbyname.c')
-rw-r--r-- | mysys/my_gethostbyname.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/mysys/my_gethostbyname.c b/mysys/my_gethostbyname.c new file mode 100644 index 00000000000..19381734e83 --- /dev/null +++ b/mysys/my_gethostbyname.c @@ -0,0 +1,119 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA */ + +/* Thread safe version of gethostbyname_r() */ + +#include "mysys_priv.h" +#include "my_pthread.h" +#include <assert.h> +#include <my_net.h> +#if !defined(MSDOS) && !defined(__WIN__) +#include <netdb.h> +#endif + +/* This file is not needed if my_gethostbyname_r is a macro */ +#if !defined(my_gethostbyname_r) + +#ifndef THREAD +#define pthread_mutex_lock(A) +#define pthread_mutex_unlock(A) +#endif + +/* + Emulate SOLARIS style calls, not because it's better, but just to make the + usage of getbostbyname_r simpler. +*/ + +#if defined(HAVE_GETHOSTBYNAME_R) + +#if defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE) + +struct hostent *my_gethostbyname_r(const char *name, + struct hostent *result, char *buffer, + int buflen, int *h_errnop) +{ + struct hostent *hp; + dbug_assert((size_t) buflen >= sizeof(*result)); + if (gethostbyname_r(name,result, buffer, (size_t) buflen, &hp, h_errnop)) + return 0; + return hp; +} + +#elif defined(HAVE_GETHOSTBYNAME_R_RETURN_INT) + +struct hostent *my_gethostbyname_r(const char *name, + struct hostent *result, char *buffer, + int buflen, int *h_errnop) +{ + dbug_assert(buflen >= sizeof(struct hostent_data)); + if (gethostbyname_r(name,result,(struct hostent_data *) buffer) == -1) + { + *h_errnop= errno; + return 0; + } + return result; +} + +#else + +/* gethostbyname_r with similar interface as gethostbyname() */ + +struct hostent *my_gethostbyname_r(const char *name, + struct hostent *result, char *buffer, + int buflen, int *h_errnop) +{ + struct hostent *hp; + dbug_assert(buflen >= sizeof(struct hostent_data)); + hp= gethostbyname_r(name,result,(struct hostent_data *) buffer); + *h_errnop= errno; + return hp; +} +#endif /* GLIBC2_STYLE_GETHOSTBYNAME_R */ + +#else /* !HAVE_GETHOSTBYNAME_R */ + +#ifdef THREAD +extern pthread_mutex_t LOCK_gethostbyname_r; +#endif + +/* + No gethostbyname_r() function exists. + In this case we have to keep a mutex over the call to ensure that no + other thread is going to reuse the internal memory. + + The user is responsible to call my_gethostbyname_r_free() when he + is finished with the structure. +*/ + +struct hostent *my_gethostbyname_r(const char *name, + struct hostent *result, char *buffer, + int buflen, int *h_errnop) +{ + struct hostent *hp; + pthread_mutex_lock(&LOCK_gethostbyname_r); + hp= gethostbyname(name); + *h_errnop= h_errno; + return hp; +} + +void my_gethostbyname_r_free() +{ + pthread_mutex_unlock(&LOCK_gethostbyname_r); +} + +#endif /* !HAVE_GETHOSTBYNAME_R */ +#endif /* !my_gethostbyname_r */ |