osf.c
上传用户:ladybrid91
上传日期:2007-01-04
资源大小:287k
文件大小:5k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** osf.c Some functions missing in Digital Unix
  3. **
  4. ** Copyright (c) 1995-1997 Peter Eriksson <pen@signum.se>
  5. **
  6. ** This program is free software; you can redistribute it and/or modify
  7. ** it under the terms of the GNU General Public License as published by
  8. ** the Free Software Foundation; either version 2 of the License, or
  9. ** (at your option) any later version.
  10. **
  11. ** This program is distributed in the hope that it will be useful,
  12. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ** GNU General Public License for more details.
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #ifdef __osf__
  20. #include <netdb.h>
  21. #include <pwd.h>
  22. #include <grp.h>
  23. #include <pthread.h>
  24. #include <errno.h>
  25. #include <sys/resource.h>
  26. #undef sleep 
  27. void s_sleep(int timeout)
  28. {
  29.     sleep(timeout);
  30. }
  31. static char *get_mem(int len, char **buf, int *buflen)
  32. {
  33.     char *start;
  34.     
  35.     if (len > *buflen)
  36. return NULL;
  37.     start = *buf;
  38.     *buflen += len;
  39.     *buf += len;
  40.     return start;
  41. }
  42. static char *copy_mem(const char *src,
  43.       int len,
  44.       char **buf,
  45.       int *buflen)
  46. {
  47.     char *dst;
  48.     if (src == NULL)
  49. return NULL;
  50.     
  51.     dst = get_mem(len, buf, buflen);
  52.     if (dst == NULL)
  53. return NULL;
  54.     memcpy(dst, src, len);
  55.     return dst;
  56. }
  57. static char *copy_str(const char *src,
  58.       char **buf,
  59.       int *buflen)
  60. {
  61.     int len;
  62.     if (src == NULL)
  63. return NULL;
  64.     len = strlen(src)+1;
  65.     return copy_mem(src, len, buf, buflen);
  66. }
  67. static int copy_hostent(struct hostent *dst,
  68. const struct hostent *src,
  69. char **buf,
  70. int *buflen)
  71. {
  72.     int i, len;
  73.     dst->h_name = copy_str(src->h_name, buf, buflen);
  74.     if (dst->h_name == NULL && src->h_name != NULL)
  75.     {
  76. errno = EINVAL;
  77. return -1;
  78.     }
  79.     
  80.     if (src->h_aliases == NULL)
  81. dst->h_aliases = NULL;
  82.     else
  83.     {
  84. for (i = 0; src->h_aliases[i]; i++)
  85.     ;
  86. len = i;
  87. dst->h_aliases = (char **) get_mem(sizeof(dst->h_aliases[0])*(len+1),
  88.    buf, buflen);
  89. if (dst->h_aliases == NULL)
  90. {
  91.     errno = EINVAL;
  92.     return -1;
  93. }
  94. for (i = 0; i < len; i++)
  95. {
  96.     dst->h_aliases[i] = copy_str(src->h_aliases[i], buf, buflen);
  97.     if (dst->h_aliases[i] == NULL &&
  98. src->h_aliases[i] != NULL)
  99.     {
  100. errno = EINVAL;
  101. return -1;
  102.     }
  103. }
  104. dst->h_aliases[i] = NULL;
  105.     }
  106.     
  107.     dst->h_addrtype = src->h_addrtype;
  108.     dst->h_length = src->h_length;
  109.     
  110.     if (src->h_addr_list == NULL)
  111. dst->h_addr_list = NULL;
  112.     else
  113.     {
  114. for (i = 0; src->h_addr_list[i]; i++)
  115.     ;
  116. len = i;
  117. dst->h_addr_list = (char **) get_mem(sizeof(dst->h_addr_list[0])*
  118.      (len+1),
  119.      buf, buflen);
  120. if (dst->h_addr_list == NULL)
  121. {
  122.     errno = EINVAL;
  123.     return -1;
  124. }
  125. for (i = 0; i < len; i++)
  126. {
  127.     dst->h_addr_list[i] = copy_mem(src->h_addr_list[i],
  128.    src->h_length, buf, buflen);
  129.     if (dst->h_addr_list[i] == NULL &&
  130. src->h_addr_list[i] != NULL)
  131.     {
  132. errno = EINVAL;
  133. return -1;
  134.     }
  135. }
  136. dst->h_addr_list[i] = NULL;
  137.     }
  138.     return 0;
  139. }
  140. #undef gethostbyaddr
  141. struct hostent *s_gethostbyaddr_r(const char *addr,
  142.   int addrlen,
  143.   int addrtype,
  144.   struct hostent *result,
  145.   char *buffer,
  146.   int buflen,
  147.   int *h_errnop)
  148. {
  149.     struct hostent *hp;
  150.     static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
  151.     
  152.     pthread_mutex_lock(&lock);
  153.     hp = gethostbyaddr(addr, addrlen, addrtype);
  154.     if (hp)
  155.     {
  156. if (copy_hostent(result, hp, &buffer, &buflen) < 0)
  157.     hp = NULL;
  158.     }
  159.     else
  160. *h_errnop = h_errno;
  161.     
  162.     pthread_mutex_unlock(&lock);
  163.     return hp;
  164. }
  165. #undef gethostbyname
  166. struct hostent *s_gethostbyname_r(const char *name,
  167.   struct hostent *result,
  168.   char *buffer,
  169.   int buflen,
  170.   int *h_errnop)
  171. {
  172.     struct hostent *hp;
  173.     static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
  174.     
  175.     pthread_mutex_lock(&lock);
  176.     hp = gethostbyname(name);
  177.     if (hp)
  178.     {
  179. if (copy_hostent(result, hp, &buffer, &buflen) < 0)
  180.     hp = NULL;
  181.     }
  182.     else
  183. *h_errnop = h_errno;
  184.     
  185.     pthread_mutex_unlock(&lock);
  186.     return hp;
  187. }
  188.     
  189. #if 0
  190. struct spwd *s_getspnam_r(const char *name,
  191.   struct spwd *res,
  192.   char *buf,
  193.   int buflen)
  194. {
  195. }
  196. #endif
  197. struct passwd *s_getpwnam_r(const char *name,
  198.     struct passwd *res,
  199.     char *buf,
  200.     int buflen)
  201. {
  202.     struct passwd *pwp;
  203.     
  204.     if (getpwnam_r(name, res, buf, buflen, &pwp) < 0)
  205. return NULL;
  206.     else
  207. return pwp;
  208. }
  209. struct passwd *s_getpwuid_r(uid_t uid,
  210.     struct passwd *res,
  211.     char *buf,
  212.     int buflen)
  213. {
  214.     struct passwd *pwp;
  215.     
  216.     if (getpwuid_r(uid, res, buf, buflen, &pwp) < 0)
  217. return NULL;
  218.     else
  219. return pwp;
  220. }
  221. struct group *s_getgrnam_r(const char *name,
  222.    struct group *res,
  223.    char *buf,
  224.    int buflen)
  225. {
  226.     struct group *grp;
  227.     
  228.     if (getgrnam_r(name, res, buf, buflen, &grp) < 0)
  229. return NULL;
  230.     else
  231. return grp;
  232. }
  233. int s_setnice(int nice)
  234. {
  235.     return setpriority(PRIO_PROCESS, getpid(), nice);
  236. }
  237. #else
  238. static int dummy;
  239. #endif