my_gethostbyname.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. /* Thread safe version of gethostbyname_r() */
  18. #include "mysys_priv.h"
  19. #if !defined(MSDOS) && !defined(__WIN__)
  20. #include <netdb.h>
  21. #endif
  22. #include <my_net.h>
  23. /* This file is not needed if my_gethostbyname_r is a macro */
  24. #if !defined(my_gethostbyname_r)
  25. /*
  26.   Emulate SOLARIS style calls, not because it's better, but just to make the
  27.   usage of getbostbyname_r simpler.
  28. */
  29. #if defined(HAVE_GETHOSTBYNAME_R)
  30. #if defined(HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE)
  31. struct hostent *my_gethostbyname_r(const char *name,
  32.    struct hostent *result, char *buffer,
  33.    int buflen, int *h_errnop)
  34. {
  35.   struct hostent *hp;
  36.   DBUG_ASSERT((size_t) buflen >= sizeof(*result));
  37.   if (gethostbyname_r(name,result, buffer, (size_t) buflen, &hp, h_errnop))
  38.     return 0;
  39.   return hp;
  40. }
  41. #elif defined(HAVE_GETHOSTBYNAME_R_RETURN_INT)
  42. struct hostent *my_gethostbyname_r(const char *name,
  43.    struct hostent *result, char *buffer,
  44.    int buflen, int *h_errnop)
  45. {
  46.   if (gethostbyname_r(name,result,(struct hostent_data *) buffer) == -1)
  47.   {
  48.     *h_errnop= errno;
  49.     return 0;
  50.   }
  51.   return result;
  52. }
  53. #else
  54. /* gethostbyname_r with similar interface as gethostbyname() */
  55. struct hostent *my_gethostbyname_r(const char *name,
  56.    struct hostent *result, char *buffer,
  57.    int buflen, int *h_errnop)
  58. {
  59.   struct hostent *hp;
  60.   DBUG_ASSERT(buflen >= sizeof(struct hostent_data));
  61.   hp= gethostbyname_r(name,result,(struct hostent_data *) buffer);
  62.   *h_errnop= errno;
  63.   return hp;
  64. }
  65. #endif /* GLIBC2_STYLE_GETHOSTBYNAME_R */
  66. #else /* !HAVE_GETHOSTBYNAME_R */
  67. #ifdef THREAD
  68. extern pthread_mutex_t LOCK_gethostbyname_r;
  69. #endif
  70. /*
  71.   No gethostbyname_r() function exists.
  72.   In this case we have to keep a mutex over the call to ensure that no
  73.   other thread is going to reuse the internal memory.
  74.   The user is responsible to call my_gethostbyname_r_free() when he
  75.   is finished with the structure.
  76. */
  77. struct hostent *my_gethostbyname_r(const char *name,
  78.    struct hostent *result, char *buffer,
  79.    int buflen, int *h_errnop)
  80. {
  81.   struct hostent *hp;
  82.   pthread_mutex_lock(&LOCK_gethostbyname_r);
  83.   hp= gethostbyname(name);
  84.   *h_errnop= h_errno;
  85.   return hp;
  86. }
  87. void my_gethostbyname_r_free()
  88. {
  89.   pthread_mutex_unlock(&LOCK_gethostbyname_r);  
  90. }
  91. #endif /* !HAVE_GETHOSTBYNAME_R */
  92. #endif /* !my_gethostbyname_r */