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

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** irix.c Some functions missing in SGI Irix.
  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. #if defined(__sgi)
  20. #include <netdb.h>
  21. #include <pwd.h>
  22. #include <shadow.h>
  23. #include <thread.h>
  24. static char *copy_str(char *str, char **buf, int *size)
  25. {
  26.     char *start;
  27.     if (str == NULL)
  28. return NULL;
  29.     
  30.     start = *buf;
  31.     
  32.     while (*size > 1 && *str)
  33.     {
  34. **buf = *str++;
  35. ++*buf;
  36. --*size;
  37.     }
  38.     if (*size > 1)
  39.     {
  40. **buf = '';
  41. ++*buf;
  42. --*size;
  43.     }
  44.     else
  45. return NULL;
  46.     return start;
  47. }
  48. static char **copy_strarr(char **strarr, char **buf, int *size)
  49. {
  50.     char **start;
  51.     int arrsize, i, len;
  52.     
  53.     if (strarr == NULL)
  54. return NULL;
  55.     for (arrsize = 0; strarr[arrsize]; arrsize++)
  56. ;
  57.     len = arrsize * sizeof(char *);
  58.     /* Make sure the pointers are aligned on a nice 4-byte boundary */
  59.     while ( (((unsigned long) (*buf)) & 3) && (*size > 1) )
  60.     {
  61. ++*buf;
  62. --*size;
  63.     }
  64.     if (*size < len)
  65. return NULL;
  66.     start = (char **) *buf;
  67.     *size -= len;
  68.     *buf += len;
  69.     for (i = 0; i < arrsize; i++)
  70. start[i] = copy_str(strarr[i], buf, size);
  71.     return start;
  72. }
  73.      
  74. static mutex_t gethost_lock;
  75. struct hostent *gethostbyname_r(const char *name,
  76. struct hostent *res,
  77. char *buf,
  78. int bufsize,
  79. int *h_errnop)
  80. {
  81.     struct hostent *hp;
  82.     
  83.     mutex_lock(&gethost_lock);
  84.     hp = gethostbyname(name);
  85.     if (h_errnop)
  86. *h_errnop = h_errno;
  87.     if (hp == NULL)
  88. goto End;
  89.     res->h_name = copy_str(hp->h_name, &buf, &bufsize);
  90.     res->h_aliases = copy_strarr(hp->h_aliases, &buf, &bufsize);
  91.     res->h_addrtype = hp->h_addrtype;
  92.     res->h_length = hp->h_length;
  93.     res->h_addr_list = copy_strarr(hp->h_addr_list, &buf, &bufsize);
  94.     hp = res;
  95.     
  96.   End:
  97.     mutex_unlock(&gethost_lock);
  98.     return hp;
  99. }
  100. struct hostent *gethostbyaddr_r(const char *addr,
  101. int length, int type,
  102. struct hostent *res,
  103. char *buf,
  104. int bufsize,
  105. int *h_errnop)
  106. {
  107.     struct hostent *hp;
  108.     
  109.     mutex_lock(&gethost_lock);
  110.     hp = gethostbyaddr(addr, length, type);
  111.     if (h_errnop)
  112. *h_errnop = h_errno;
  113.     if (hp == NULL)
  114. goto End;
  115.     res->h_name = copy_str(hp->h_name, &buf, &bufsize);
  116.     res->h_aliases = copy_strarr(hp->h_aliases, &buf, &bufsize);
  117.     res->h_addrtype = hp->h_addrtype;
  118.     res->h_length = hp->h_length;
  119.     res->h_addr_list = copy_strarr(hp->h_addr_list, &buf, &bufsize);
  120.     hp = res;
  121.     
  122.   End:
  123.     mutex_unlock(&gethost_lock);
  124.     return hp;
  125. }
  126. static mutex_t getserv_lock;
  127. struct servent *getservbyname_r(const char *name,
  128. const char *proto,
  129. struct servent *res,
  130. char *buf,
  131. int bufsize)
  132. {
  133.     struct servent *sp;
  134.     
  135.     mutex_lock(&getserv_lock);
  136.     sp = getservbyname(name, proto);
  137.     if (sp == NULL)
  138. goto End;
  139.     res->s_name = copy_str(sp->s_name, &buf, &bufsize);
  140.     res->s_aliases = copy_strarr(sp->s_aliases, &buf, &bufsize);
  141.     res->s_port = sp->s_port;
  142.     res->s_proto = copy_str(sp->s_proto, &buf, &bufsize);
  143.     
  144.     sp = res;
  145.     
  146.   End:
  147.     mutex_unlock(&getserv_lock);
  148.     return sp;
  149. }
  150. #ifndef _POSIX1C
  151. /* 
  152.  *  For Irix 6.2 this is already defined 
  153.  *
  154.  */
  155. static mutex_t getpw_lock;
  156. struct passwd *getpwnam_r(const char *name,
  157.   struct passwd *res,
  158.   char *buf,
  159.   int bufsize)
  160. {
  161.     struct passwd *pwp;
  162.     mutex_lock(&getpw_lock);
  163.     pwp = getpwnam(name);
  164.     if (pwp == NULL)
  165. goto End;
  166.     res->pw_name = copy_str(pwp->pw_name, &buf, &bufsize);
  167.     res->pw_passwd = copy_str(pwp->pw_passwd, &buf, &bufsize);
  168.     res->pw_uid = pwp->pw_uid;
  169.     res->pw_gid = pwp->pw_gid;
  170.     res->pw_age = copy_str(pwp->pw_age, &buf, &bufsize);
  171.     res->pw_comment = copy_str(pwp->pw_comment, &buf, &bufsize);
  172.     res->pw_gecos = copy_str(pwp->pw_gecos, &buf, &bufsize);
  173.     res->pw_dir = copy_str(pwp->pw_dir, &buf, &bufsize);
  174.     res->pw_shell = copy_str(pwp->pw_shell, &buf, &bufsize);
  175.     pwp = res;
  176.   End:
  177.     mutex_unlock(&getpw_lock);
  178.     return pwp;
  179. }
  180. #endif 
  181. static mutex_t getsp_lock;
  182. struct spwd *getspnam_r(const char *name,
  183. struct spwd *res,
  184. char *buf,
  185. int bufsize)
  186. {
  187.     struct spwd *sp;
  188.     mutex_lock(&getsp_lock);
  189.     sp = getspnam(name);
  190.     if (sp == NULL)
  191. goto End;
  192.     res->sp_namp = copy_str(sp->sp_namp, &buf, &bufsize);
  193.     res->sp_pwdp = copy_str(sp->sp_pwdp, &buf, &bufsize);
  194.     res->sp_lstchg = sp->sp_lstchg;
  195.     res->sp_min = sp->sp_min;
  196.     res->sp_max = sp->sp_max;
  197.     res->sp_warn = sp->sp_warn;
  198.     res->sp_inact = sp->sp_inact;
  199.     res->sp_expire = sp->sp_expire;
  200.     res->sp_flag = sp->sp_flag;
  201.     sp = res;
  202.   End:
  203.     mutex_unlock(&getsp_lock);
  204.     return sp;
  205. }
  206. #else
  207. static int dummy;
  208. #endif