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

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** readdir.c
  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. #include <stdio.h>
  20. #include <errno.h>
  21. #include <fcntl.h>
  22. #include <limits.h>
  23. #include <stdlib.h>
  24. #include <sys/types.h>
  25. #include <dirent.h>
  26. #include <syslog.h>
  27. #include "phttpd.h"
  28. S_DIR *s_opendir(const char *path)
  29. {
  30.     S_DIR *cb;
  31. #ifdef USE_GETDENTS
  32.     int fd;
  33.     fd = s_open(path, O_RDONLY);
  34.     if (fd < 0)
  35. return NULL;
  36.     
  37.     cb = s_malloc(sizeof(S_DIR));
  38.     cb->fd = fd;
  39.     return cb;
  40. #else
  41.     DIR *dp;
  42.     while ((dp = opendir(path)) == NULL && errno == EINTR)
  43.       ;
  44.     
  45.     cb = s_malloc(sizeof(S_DIR));
  46.     cb->dp = dp;
  47.     return cb;
  48. #endif
  49. }
  50. struct dirent *s_readdir(S_DIR *dp)
  51. {
  52. #ifdef USE_GETDENTS
  53.     struct dirent *rdep;
  54.     int len;
  55.     
  56.     if (dp->len == 0)
  57.     {
  58. while ((dp->len = getdents(dp->fd,
  59.   (struct dirent *) dp->buf,
  60.   sizeof(dp->buf))) < 0 && errno == EINTR)
  61.     ;
  62. dp->dep = (struct dirent *) dp->buf;
  63.     }
  64.     if (dp->len <= 0)
  65. return NULL;
  66.     len = strlen(dp->dep->d_name);
  67.     rdep = s_malloc(sizeof(struct dirent) + len);
  68.     *rdep = *(dp->dep);
  69.     
  70.     s_strcpy(rdep->d_name, len+1, dp->dep->d_name);
  71.     rdep->d_reclen = sizeof(struct dirent) + len;
  72.     
  73.     dp->len -= dp->dep->d_reclen;
  74.     dp->dep = (struct dirent *) (((char *) dp->dep) + dp->dep->d_reclen);
  75.     return rdep;
  76. #else
  77.     struct dirent *dep;
  78.     while (readdir_r(dp->dp, &dp->deb, &dep) < 0 && errno == EINTR)
  79.       ;
  80.     return dep;
  81. #endif
  82. }
  83. void s_closedir(S_DIR *dp)
  84. {
  85. #ifdef USE_GETDENTS
  86.     s_close(dp->fd);
  87.     s_free(dp);
  88. #else
  89.     while (closedir(dp->dp) < 0 && errno == EINTR)
  90.       ;
  91.     s_free(dp);
  92. #endif
  93. }