1N/A/*-
1N/A * See the file LICENSE for redistribution information.
1N/A *
1N/A * Copyright (c) 1997, 1998
1N/A * Sleepycat Software. All rights reserved.
1N/A */
1N/A
1N/A#include "config.h"
1N/A
1N/A#ifndef lint
1N/Astatic const char sccsid[] = "@(#)os_dir.c 10.19 (Sleepycat) 10/12/98";
1N/A#endif /* not lint */
1N/A
1N/A#ifndef NO_SYSTEM_INCLUDES
1N/A#include <sys/types.h>
1N/A
1N/A#if HAVE_DIRENT_H
1N/A# include <dirent.h>
1N/A# define NAMLEN(dirent) strlen((dirent)->d_name)
1N/A#else
1N/A# define dirent direct
1N/A# define NAMLEN(dirent) (dirent)->d_namlen
1N/A# if HAVE_SYS_NDIR_H
1N/A# include <sys/ndir.h>
1N/A# endif
1N/A# if HAVE_SYS_DIR_H
1N/A# include <sys/dir.h>
1N/A# endif
1N/A# if HAVE_NDIR_H
1N/A# include <ndir.h>
1N/A# endif
1N/A#endif
1N/A
1N/A#include <errno.h>
1N/A#endif
1N/A
1N/A#include "db_int.h"
1N/A#include "os_jump.h"
1N/A
1N/A/*
1N/A * __os_dirlist --
1N/A * Return a list of the files in a directory.
1N/A *
1N/A * PUBLIC: int __os_dirlist __P((const char *, char ***, int *));
1N/A */
1N/Aint
1N/A__os_dirlist(dir, namesp, cntp)
1N/A const char *dir;
1N/A char ***namesp;
1N/A int *cntp;
1N/A{
1N/A struct dirent *dp;
1N/A DIR *dirp;
1N/A int arraysz, cnt, ret;
1N/A char **names;
1N/A
1N/A if (__db_jump.j_dirlist != NULL)
1N/A return (__db_jump.j_dirlist(dir, namesp, cntp));
1N/A
1N/A if ((dirp = opendir(dir)) == NULL)
1N/A return (errno);
1N/A names = NULL;
1N/A for (arraysz = cnt = 0; (dp = readdir(dirp)) != NULL; ++cnt) {
1N/A if (cnt >= arraysz) {
1N/A arraysz += 100;
1N/A if ((ret = __os_realloc(&names,
1N/A arraysz * sizeof(names[0]))) != 0)
1N/A goto nomem;
1N/A }
1N/A if ((ret = __os_strdup(dp->d_name, &names[cnt])) != 0)
1N/A goto nomem;
1N/A }
1N/A (void)closedir(dirp);
1N/A
1N/A *namesp = names;
1N/A *cntp = cnt;
1N/A return (0);
1N/A
1N/Anomem: if (names != NULL)
1N/A __os_dirfree(names, cnt);
1N/A return (ret);
1N/A}
1N/A
1N/A/*
1N/A * __os_dirfree --
1N/A * Free the list of files.
1N/A *
1N/A * PUBLIC: void __os_dirfree __P((char **, int));
1N/A */
1N/Avoid
1N/A__os_dirfree(names, cnt)
1N/A char **names;
1N/A int cnt;
1N/A{
1N/A if (__db_jump.j_dirfree != NULL)
1N/A __db_jump.j_dirfree(names, cnt);
1N/A
1N/A while (cnt > 0)
1N/A __os_free(names[--cnt], 0);
1N/A __os_free(names, 0);
1N/A}