Update from db-2.3.12.
[kopensolaris-gnu/glibc.git] / db2 / os / os_dir.c
1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 1997
5  *      Sleepycat Software.  All rights reserved.
6  */
7
8 #include "config.h"
9
10 #ifndef lint
11 static const char sccsid[] = "@(#)os_dir.c      10.13 (Sleepycat) 10/28/97";
12 #endif /* not lint */
13
14 #ifndef NO_SYSTEM_INCLUDES
15 #include <sys/types.h>
16
17 #if HAVE_DIRENT_H
18 # include <dirent.h>
19 # define NAMLEN(dirent) strlen((dirent)->d_name)
20 #else
21 # define dirent direct
22 # define NAMLEN(dirent) (dirent)->d_namlen
23 # if HAVE_SYS_NDIR_H
24 #  include <sys/ndir.h>
25 # endif
26 # if HAVE_SYS_DIR_H
27 #  include <sys/dir.h>
28 # endif
29 # if HAVE_NDIR_H
30 #  include <ndir.h>
31 # endif
32 #endif
33
34 #include <errno.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <unistd.h>
38 #endif
39
40 #include "db_int.h"
41 #include "common_ext.h"
42
43 /*
44  * __os_dirlist --
45  *      Return a list of the files in a directory.
46  *
47  * PUBLIC: int __os_dirlist __P((const char *, char ***, int *));
48  */
49 int
50 __os_dirlist(dir, namesp, cntp)
51         const char *dir;
52         char ***namesp;
53         int *cntp;
54 {
55         struct dirent *dp;
56         DIR *dirp;
57         int arraysz, cnt;
58         char **names;
59
60         if ((dirp = opendir(dir)) == NULL)
61                 return (errno);
62         names = NULL;
63         for (arraysz = cnt = 0; (dp = readdir(dirp)) != NULL; ++cnt) {
64                 if (cnt >= arraysz) {
65                         arraysz += 100;
66                         names = (char **)(names == NULL ?
67                             __db_malloc(arraysz * sizeof(names[0])) :
68                             __db_realloc(names, arraysz * sizeof(names[0])));
69                         if (names == NULL)
70                                 goto nomem;
71                 }
72                 if ((names[cnt] = (char *)__db_strdup(dp->d_name)) == NULL)
73                         goto nomem;
74         }
75         (void)closedir(dirp);
76
77         *namesp = names;
78         *cntp = cnt;
79         return (0);
80
81 nomem:  if (names != NULL)
82                 __os_dirfree(names, cnt);
83         return (ENOMEM);
84 }
85
86 /*
87  * __os_dirfree --
88  *      Free the list of files.
89  *
90  * PUBLIC: void __os_dirfree __P((char **, int));
91  */
92 void
93 __os_dirfree(names, cnt)
94         char **names;
95         int cnt;
96 {
97         while (cnt > 0)
98                 __db_free(names[--cnt]);
99         __db_free(names);
100 }