resetting manifest requested domain to floor
[platform/upstream/db4.git] / os_brew / os_dir.c
1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 1997-2009 Oracle.  All rights reserved.
5  *
6  * $Id$
7  */
8
9 #include "db_config.h"
10
11 #include "db_int.h"
12
13 /*
14  * __os_dirlist --
15  *      Return a list of the files in a directory.
16  */
17 int
18 __os_dirlist(env, dir, returndir, namesp, cntp)
19         ENV *env;
20         const char *dir;
21         int returndir, *cntp;
22         char ***namesp;
23 {
24         FileInfo fi;
25         IFileMgr *pIFileMgr;
26         int arraysz, cnt, ret;
27         char *filename, *p, **names;
28
29         FILE_MANAGER_CREATE(env, pIFileMgr, ret);
30         if (ret != 0)
31                 return (ret);
32
33         if ((ret = IFILEMGR_EnumInit(pIFileMgr, dir, FALSE)) != SUCCESS) {
34                 IFILEMGR_Release(pIFileMgr);
35                 __db_syserr(env, ret, "IFILEMGR_EnumInit");
36                 return (__os_posix_err(ret));
37         }
38
39         names = NULL;
40         arraysz = cnt = 0;
41         while (IFILEMGR_EnumNext(pIFileMgr, &fi) != FALSE) {
42                 if (++cnt >= arraysz) {
43                         arraysz += 100;
44                         if ((ret = __os_realloc(env,
45                             (u_int)arraysz * sizeof(char *), &names)) != 0)
46                                 goto nomem;
47                 }
48                 for (filename = fi.szName;
49                     (p = strchr(filename, '\\')) != NULL; filename = p + 1)
50                         ;
51                 for (; (p = strchr(filename, '/')) != NULL; filename = p + 1)
52                         ;
53                 if ((ret = __os_strdup(env, filename, &names[cnt - 1])) != 0)
54                         goto nomem;
55         }
56         IFILEMGR_Release(pIFileMgr);
57
58         *namesp = names;
59         *cntp = cnt;
60         return (ret);
61
62 nomem:  if (names != NULL)
63                 __os_dirfree(env, names, cnt);
64         IFILEMGR_Release(pIFileMgr);
65
66         COMPQUIET(returndir, 0);
67
68         return (ret);
69 }
70
71 /*
72  * __os_dirfree --
73  *      Free the list of files.
74  */
75 void
76 __os_dirfree(env, names, cnt)
77         ENV *env;
78         char **names;
79         int cnt;
80 {
81         while (cnt > 0)
82                 __os_free(env, names[--cnt]);
83         __os_free(env, names);
84 }