1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 1997,2008 Oracle.  All rights reserved.
5 *
6 * $Id: os_dir.c,v 1.9 2008/01/08 20:58:44 bostic Exp $
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 */
17int
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
62nomem:	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 */
75void
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}
85