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 */ 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