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

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** unixware.c Some functions missing in UnixWare.
  3. **
  4. ** Copyright (c) 1995 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 UNIXWARE
  20. #include <netdb.h>
  21. #include <synch.h>
  22. #include <pwd.h>
  23. #include <grp.h>
  24. #include <shadow.h>
  25. int strcasecmp(char *s1, char *s2)
  26. {
  27.     int d = 0;
  28.     unsigned char c1, c2;
  29.     
  30.     do
  31.     {
  32. c1 = islower(*s1) ? toupper(*s1) : *s1; 
  33. c2 = islower(*s2) ? toupper(*s2) : *s2;
  34. ++s1;
  35. ++s2;
  36.     } while ((d = c1 - c2) == 0 && c1 != '' && c2 != '');
  37.     return d;
  38. }
  39. int madvise(void *addr, int len, int advice)
  40. {
  41.     return 0;
  42. }
  43. static char *copy_str(char *str, char **buf, int *size)
  44. {
  45.     char *start;
  46.     if (str == NULL)
  47. return NULL;
  48.     
  49.     start = *buf;
  50.     
  51.     while (*size > 1 && *str)
  52.     {
  53. **buf = *str++;
  54. ++*buf;
  55. --*size;
  56.     }
  57.     if (*size > 1)
  58.     {
  59. **buf = '';
  60. ++*buf;
  61. --*size;
  62.     }
  63.     else
  64. return NULL;
  65.     return start;
  66. }
  67. static char **copy_strarr(char **strarr, char **buf, int *size)
  68. {
  69.     char **start;
  70.     int arrsize, i, len;
  71.     
  72.     if (strarr == NULL)
  73. return NULL;
  74.     for (arrsize = 0; strarr[arrsize]; arrsize++)
  75. ;
  76.     len = arrsize * sizeof(char *);
  77.     /* Make sure the pointers are aligned on a nice 4-byte boundary */
  78.     while ( (((unsigned long) (*buf)) & 3) && (*size > 1) )
  79.     {
  80. ++*buf;
  81. --*size;
  82.     }
  83.     if (*size < len)
  84. return NULL;
  85.     start = (char **) *buf;
  86.     *size -= len;
  87.     *buf += len;
  88.     for (i = 0; i < arrsize; i++)
  89. start[i] = copy_str(strarr[i], buf, size);
  90.     return start;
  91. }
  92.      
  93. static mutex_t gethost_lock;
  94. struct hostent *gethostbyname_r(const char *name,
  95. struct hostent *res,
  96. char *buf,
  97. int bufsize,
  98. int *h_errnop)
  99. {
  100.     struct hostent *hp;
  101.     
  102.     mutex_lock(&gethost_lock);
  103.     hp = gethostbyname(name);
  104.     if (h_errnop)
  105. *h_errnop = h_errno;
  106.     if (hp == NULL)
  107. goto End;
  108.     res->h_name = copy_str(hp->h_name, &buf, &bufsize);
  109.     res->h_aliases = copy_strarr(hp->h_aliases, &buf, &bufsize);
  110.     res->h_addrtype = hp->h_addrtype;
  111.     res->h_length = hp->h_length;
  112.     res->h_addr_list = copy_strarr(hp->h_addr_list, &buf, &bufsize);
  113.     hp = res;
  114.     
  115.   End:
  116.     mutex_unlock(&gethost_lock);
  117.     return hp;
  118. }
  119. struct hostent *gethostbyaddr_r(const char *addr,
  120. int length, int type,
  121. struct hostent *res,
  122. char *buf,
  123. int bufsize,
  124. int *h_errnop)
  125. {
  126.     struct hostent *hp;
  127.     
  128.     mutex_lock(&gethost_lock);
  129.     hp = gethostbyaddr(addr, length, type);
  130.     if (h_errnop)
  131. *h_errnop = h_errno;
  132.     if (hp == NULL)
  133. goto End;
  134.     res->h_name = copy_str(hp->h_name, &buf, &bufsize);
  135.     res->h_aliases = copy_strarr(hp->h_aliases, &buf, &bufsize);
  136.     res->h_addrtype = hp->h_addrtype;
  137.     res->h_length = hp->h_length;
  138.     res->h_addr_list = copy_strarr(hp->h_addr_list, &buf, &bufsize);
  139.     hp = res;
  140.     
  141.   End:
  142.     mutex_unlock(&gethost_lock);
  143.     return hp;
  144. }
  145. static mutex_t getpw_lock;
  146. struct passwd *getpwnam_r(const char *name,
  147.   struct passwd *res,
  148.   char *buf,
  149.   int bufsize)
  150. {
  151.     struct passwd *pwp;
  152.     mutex_lock(&getpw_lock);
  153.     pwp = getpwnam(name);
  154.     if (pwp == NULL)
  155. goto End;
  156.     res->pw_name = copy_str(pwp->pw_name, &buf, &bufsize);
  157.     res->pw_passwd = copy_str(pwp->pw_passwd, &buf, &bufsize);
  158.     res->pw_uid = pwp->pw_uid;
  159.     res->pw_gid = pwp->pw_gid;
  160.     res->pw_age = copy_str(pwp->pw_age, &buf, &bufsize);
  161.     res->pw_comment = copy_str(pwp->pw_comment, &buf, &bufsize);
  162.     res->pw_gecos = copy_str(pwp->pw_gecos, &buf, &bufsize);
  163.     res->pw_dir = copy_str(pwp->pw_dir, &buf, &bufsize);
  164.     res->pw_shell = copy_str(pwp->pw_shell, &buf, &bufsize);
  165.     pwp = res;
  166.   End:
  167.     mutex_unlock(&getpw_lock);
  168.     return pwp;
  169. }
  170. struct passwd *getpwuid_r(uid_t uid,
  171.   struct passwd *res,
  172.   char *buf,
  173.   int bufsize)
  174. {
  175.     struct passwd *pwp;
  176.     mutex_lock(&getpw_lock);
  177.     pwp = getpwuid(uid);
  178.     if (pwp == NULL)
  179. goto End;
  180.     res->pw_name = copy_str(pwp->pw_name, &buf, &bufsize);
  181.     res->pw_passwd = copy_str(pwp->pw_passwd, &buf, &bufsize);
  182.     res->pw_uid = pwp->pw_uid;
  183.     res->pw_gid = pwp->pw_gid;
  184.     res->pw_age = copy_str(pwp->pw_age, &buf, &bufsize);
  185.     res->pw_comment = copy_str(pwp->pw_comment, &buf, &bufsize);
  186.     res->pw_gecos = copy_str(pwp->pw_gecos, &buf, &bufsize);
  187.     res->pw_dir = copy_str(pwp->pw_dir, &buf, &bufsize);
  188.     res->pw_shell = copy_str(pwp->pw_shell, &buf, &bufsize);
  189.     pwp = res;
  190.   End:
  191.     mutex_unlock(&getpw_lock);
  192.     return pwp;
  193. }
  194. static mutex_t getgr_lock;
  195. struct group *getgrnam_r(const char *name,
  196.   struct group *res,
  197.   char *buf,
  198.   int bufsize)
  199. {
  200.     struct group *grp;
  201.     mutex_lock(&getgr_lock);
  202.     grp = getgrnam(name);
  203.     if (grp == NULL)
  204. goto End;
  205.     res->gr_name = copy_str(grp->gr_name, &buf, &bufsize);
  206.     res->gr_passwd = copy_str(grp->gr_passwd, &buf, &bufsize);
  207.     res->gr_gid = grp->gr_gid;
  208.     res->gr_mem = copy_strarr(grp->gr_mem, &buf, &bufsize);
  209.     
  210.     grp = res;
  211.   End:
  212.     mutex_unlock(&getgr_lock);
  213.     return grp;
  214. }
  215. struct group *getgrgid_r(gid_t gid,
  216.  struct group *res,
  217.  char *buf,
  218.  int bufsize)
  219. {
  220.     struct group *grp;
  221.     mutex_lock(&getgr_lock);
  222.     grp = getgrgid(gid);
  223.     if (grp == NULL)
  224. goto End;
  225.     res->gr_name = copy_str(grp->gr_name, &buf, &bufsize);
  226.     res->gr_passwd = copy_str(grp->gr_passwd, &buf, &bufsize);
  227.     res->gr_gid = grp->gr_gid;
  228.     res->gr_mem = copy_strarr(grp->gr_mem, &buf, &bufsize);
  229.     
  230.     grp = res;
  231.   End:
  232.     mutex_unlock(&getgr_lock);
  233.     return grp;
  234. }
  235. static mutex_t getsp_lock;
  236. struct spwd *getspnam_r(const char *name,
  237. struct spwd *res,
  238. char *buf,
  239. int bufsize)
  240. {
  241.     struct spwd *sp;
  242.     mutex_lock(&getsp_lock);
  243.     sp = getspnam(name);
  244.     if (sp == NULL)
  245. goto End;
  246.     res->sp_namp = copy_str(sp->sp_namp, &buf, &bufsize);
  247.     res->sp_pwdp = copy_str(sp->sp_pwdp, &buf, &bufsize);
  248.     res->sp_lstchg = sp->sp_lstchg;
  249.     res->sp_min = sp->sp_min;
  250.     res->sp_max = sp->sp_max;
  251.     res->sp_warn = sp->sp_warn;
  252.     res->sp_inact = sp->sp_inact;
  253.     res->sp_expire = sp->sp_expire;
  254.     res->sp_flag = sp->sp_flag;
  255.     sp = res;
  256.   End:
  257.     mutex_unlock(&getsp_lock);
  258.     return sp;
  259. }
  260.      
  261. static mutex_t getserv_lock;
  262. struct servent *getservbyname_r(const char *name,
  263. const char *proto,
  264. struct servent *res,
  265. char *buf,
  266. int bufsize)
  267. {
  268.     struct servent *sp;
  269.     
  270.     mutex_lock(&getserv_lock);
  271.     sp = getservbyname(name, proto);
  272.     if (sp == NULL)
  273. goto End;
  274.     res->s_name = copy_str(sp->s_name, &buf, &bufsize);
  275.     res->s_aliases = copy_strarr(sp->s_aliases, &buf, &bufsize);
  276.     res->s_port = sp->s_port;
  277.     res->s_proto = copy_str(sp->s_proto, &buf, &bufsize);
  278.     
  279.     sp = res;
  280.     
  281.   End:
  282.     mutex_unlock(&getserv_lock);
  283.     return sp;
  284. }
  285. #else
  286. static int dummy;
  287. #endif