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

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** solaris.c SunOS 5/Solaris 2 specific code
  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. #include <stdio.h>
  20. #include <errno.h>
  21. #include <syslog.h>
  22. #include <string.h>
  23. #include <synch.h>
  24. #include <sys/mman.h>
  25. #include <netdb.h>
  26. #include <sys/types.h>
  27. #include <synch.h>
  28. #include "phttpd.h"
  29. #undef sleep 
  30. void s_sleep(int timeout)
  31. {
  32. #if 1
  33.     mutex_t mp;
  34.     cond_t  cv;
  35.     time_t bt;
  36.     timestruc_t ts;
  37.     
  38.     time(&bt);
  39.     bt += timeout;
  40.     ts.tv_sec = bt;
  41.     ts.tv_nsec = 0;
  42.     mutex_init(&mp, USYNC_THREAD, NULL);
  43.     mutex_lock(&mp);
  44.     while (cond_timedwait(&cv, &mp, &ts) < 0 && errno == EINTR)
  45. ;
  46. #else
  47.     /* There is a bug in Solaris 2.4's sleep() which causes
  48.        it to return random garbage if interrupted by some
  49.        signals - so we handle it by calling time() ourself */
  50.  
  51.     time_t start, now;
  52.     int len;
  53.     
  54.  
  55.     time(&start);
  56.     len = timeout;
  57.     
  58.     while (len > 0)
  59.     {
  60.         sleep(len);
  61.         time(&now);
  62.  
  63.         len = timeout - (now - start);
  64.     }
  65. #endif
  66. }
  67.  
  68. /* Workaround to fix problems with getXXXnam_r() not being
  69.    quite as MT-SAFE as the manual claims (problems in the NSS code) */
  70. static mutex_t nss_lock;
  71. struct hostent *s_gethostbyaddr_r(const char *addr,
  72.   int length,
  73.   int type,
  74.   struct hostent *result,
  75.   char *buffer,
  76.   int buflen,
  77.   int *h_errnop)
  78. {
  79.     struct hostent *hep;
  80.     
  81.     mutex_lock(&nss_lock);
  82.     if ( debug > 6 )
  83.     fprintf(stderr,"ERR-A-DNS: %lx (%d) %d -- %d %dn",*(long *)addr,length,*h_errnop,errno,buflen);
  84.     hep = gethostbyaddr_r(addr,
  85.   length,
  86.   AF_INET,
  87.   result,
  88.   buffer,
  89.   buflen,
  90.   h_errnop);
  91.     if ( debug > 6 )
  92.     fprintf(stderr,"ERR-B-DNS: %lx (%d) %d -- %dn",*(long *)addr,length,*h_errnop,errno);
  93.     mutex_unlock(&nss_lock);
  94.     return hep;
  95. }
  96.   
  97. struct hostent *s_gethostbyname_r(const char *name,
  98.   struct hostent *result,
  99.   char *buffer,
  100.   int buflen,
  101.   int *h_errnop)
  102. {
  103.     struct hostent *hep;
  104.     
  105.     mutex_lock(&nss_lock);
  106.     hep = gethostbyname_r(name, result, buffer, buflen, h_errnop);
  107. if ( debug > 6 )
  108.     fprintf(stderr,"ERR-DNS: %dn",*h_errnop);
  109.     mutex_unlock(&nss_lock);
  110.     return hep;
  111. }
  112.   
  113. struct spwd *s_getspnam_r(const char *name,
  114.   struct spwd *res,
  115.   char *buf,
  116.   int buflen)
  117. {
  118.     struct spwd *retval;
  119.     
  120.     mutex_lock(&nss_lock);
  121.     
  122.     retval = getspnam_r(name, res, buf, buflen);
  123.     mutex_unlock(&nss_lock);
  124.     return retval;
  125. }
  126. struct passwd *s_getpwnam_r(const char *name,
  127.   struct passwd *res,
  128.   char *buf,
  129.   int buflen)
  130. {
  131.     struct passwd *retval;
  132.     
  133.     mutex_lock(&nss_lock);
  134.     retval = getpwnam_r(name, res, buf, buflen);
  135.     mutex_unlock(&nss_lock);
  136.     return retval;
  137. }
  138. struct passwd *s_getpwuid_r(uid_t uid,
  139.     struct passwd *res,
  140.     char *buf,
  141.     int buflen)
  142. {
  143.     struct passwd *retval;
  144.     
  145.     mutex_lock(&nss_lock);
  146.     retval = getpwuid_r(uid, res, buf, buflen);
  147.     mutex_unlock(&nss_lock);
  148.     return retval;
  149. }
  150. struct group *s_getgrnam_r(const char *name,
  151.    struct group *res,
  152.    char *buf,
  153.    int buflen)
  154. {
  155.     struct group *retval;
  156.     
  157.     mutex_lock(&nss_lock);
  158.     retval = getgrnam_r(name, res, buf, buflen);
  159.     mutex_unlock(&nss_lock);
  160.     return retval;
  161. }
  162. int s_nice(int niceval)
  163. {
  164.     return nice(niceval);
  165. }