os_dir.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: os_dir.c,v 11.8 2000/06/27 17:29:52 sue Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #if HAVE_DIRENT_H
  14. # include <dirent.h>
  15. # define NAMLEN(dirent) strlen((dirent)->d_name)
  16. #else
  17. # define dirent direct
  18. # define NAMLEN(dirent) (dirent)->d_namlen
  19. # if HAVE_SYS_NDIR_H
  20. #  include <sys/ndir.h>
  21. # endif
  22. # if HAVE_SYS_DIR_H
  23. #  include <sys/dir.h>
  24. # endif
  25. # if HAVE_NDIR_H
  26. #  include <ndir.h>
  27. # endif
  28. #endif
  29. #endif
  30. #include "db_int.h"
  31. #include "os_jump.h"
  32. /*
  33.  * __os_dirlist --
  34.  * Return a list of the files in a directory.
  35.  *
  36.  * PUBLIC: int __os_dirlist __P((DB_ENV *, const char *, char ***, int *));
  37.  */
  38. int
  39. __os_dirlist(dbenv, dir, namesp, cntp)
  40. DB_ENV *dbenv;
  41. const char *dir;
  42. char ***namesp;
  43. int *cntp;
  44. {
  45. struct dirent *dp;
  46. DIR *dirp;
  47. int arraysz, cnt, ret;
  48. char **names;
  49. if (__db_jump.j_dirlist != NULL)
  50. return (__db_jump.j_dirlist(dir, namesp, cntp));
  51. #ifdef HAVE_VXWORKS
  52. if ((dirp = opendir((char *)dir)) == NULL)
  53. #else
  54. if ((dirp = opendir(dir)) == NULL)
  55. #endif
  56. return (__os_get_errno());
  57. names = NULL;
  58. for (arraysz = cnt = 0; (dp = readdir(dirp)) != NULL; ++cnt) {
  59. if (cnt >= arraysz) {
  60. arraysz += 100;
  61. if ((ret = __os_realloc(dbenv,
  62.     arraysz * sizeof(names[0]), NULL, &names)) != 0)
  63. goto nomem;
  64. }
  65. if ((ret = __os_strdup(dbenv, dp->d_name, &names[cnt])) != 0)
  66. goto nomem;
  67. }
  68. (void)closedir(dirp);
  69. *namesp = names;
  70. *cntp = cnt;
  71. return (0);
  72. nomem: if (names != NULL)
  73. __os_dirfree(names, cnt);
  74. if (dirp != NULL)
  75. (void)closedir(dirp);
  76. return (ret);
  77. }
  78. /*
  79.  * __os_dirfree --
  80.  * Free the list of files.
  81.  *
  82.  * PUBLIC: void __os_dirfree __P((char **, int));
  83.  */
  84. void
  85. __os_dirfree(names, cnt)
  86. char **names;
  87. int cnt;
  88. {
  89. if (__db_jump.j_dirfree != NULL)
  90. __db_jump.j_dirfree(names, cnt);
  91. else {
  92. while (cnt > 0)
  93. __os_free(names[--cnt], 0);
  94. __os_free(names, 0);
  95. }
  96. }