os_dir.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997-2002
  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.14 2002/07/12 18:56:50 bostic 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. /*
  32.  * __os_dirlist --
  33.  * Return a list of the files in a directory.
  34.  *
  35.  * PUBLIC: int __os_dirlist __P((DB_ENV *, const char *, char ***, int *));
  36.  */
  37. int
  38. __os_dirlist(dbenv, dir, namesp, cntp)
  39. DB_ENV *dbenv;
  40. const char *dir;
  41. char ***namesp;
  42. int *cntp;
  43. {
  44. struct dirent *dp;
  45. DIR *dirp;
  46. int arraysz, cnt, ret;
  47. char **names;
  48. if (DB_GLOBAL(j_dirlist) != NULL)
  49. return (DB_GLOBAL(j_dirlist)(dir, namesp, cntp));
  50. #ifdef HAVE_VXWORKS
  51. if ((dirp = opendir((char *)dir)) == NULL)
  52. #else
  53. if ((dirp = opendir(dir)) == NULL)
  54. #endif
  55. return (__os_get_errno());
  56. names = NULL;
  57. for (arraysz = cnt = 0; (dp = readdir(dirp)) != NULL; ++cnt) {
  58. if (cnt >= arraysz) {
  59. arraysz += 100;
  60. if ((ret = __os_realloc(dbenv,
  61.     arraysz * sizeof(names[0]), &names)) != 0)
  62. goto nomem;
  63. }
  64. if ((ret = __os_strdup(dbenv, dp->d_name, &names[cnt])) != 0)
  65. goto nomem;
  66. }
  67. (void)closedir(dirp);
  68. *namesp = names;
  69. *cntp = cnt;
  70. return (0);
  71. nomem: if (names != NULL)
  72. __os_dirfree(dbenv, names, cnt);
  73. if (dirp != NULL)
  74. (void)closedir(dirp);
  75. return (ret);
  76. }
  77. /*
  78.  * __os_dirfree --
  79.  * Free the list of files.
  80.  *
  81.  * PUBLIC: void __os_dirfree __P((DB_ENV *, char **, int));
  82.  */
  83. void
  84. __os_dirfree(dbenv, names, cnt)
  85. DB_ENV *dbenv;
  86. char **names;
  87. int cnt;
  88. {
  89. if (DB_GLOBAL(j_dirfree) != NULL)
  90. DB_GLOBAL(j_dirfree)(names, cnt);
  91. else {
  92. while (cnt > 0)
  93. __os_free(dbenv, names[--cnt]);
  94. __os_free(dbenv, names);
  95. }
  96. }