⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_dir.c

📁 File system using stacked.
💻 C
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1997-2002 *	Sleepycat Software.  All rights reserved. */#include "db_config.h"#ifndef lintstatic const char revid[] = "$Id: os_dir.c,v 1.1.1.1 2004/08/19 23:53:56 gopalan Exp $";#endif /* not lint */#ifndef __KERNEL__# ifndef NO_SYSTEM_INCLUDES#  include <sys/types.h>#  include <stdlib.h>#  if HAVE_DIRENT_H#   include <dirent.h>#   define NAMLEN(dirent) strlen((dirent)->d_name)#  else#   define dirent direct#   define NAMLEN(dirent) (dirent)->d_namlen#   if HAVE_SYS_NDIR_H#    include <sys/ndir.h>#   endif#   if HAVE_SYS_DIR_H#    include <sys/dir.h>#   endif#   if HAVE_NDIR_H#    include <ndir.h>#   endif#  endif# endif#else# include <linux/types.h># include <linux/string.h># include <linux/kernel.h># include <linux/mm.h># include <linux/dirent.h># include <linux/fs.h># include <linux/file.h>#endif /* __KERNEL__ */#include "db_int.h"#ifdef __KERNEL__struct os_getdents_callback {  struct file *this_file;  filldir_t filldir;  DB_ENV *dbenv;  char **names;  int cnt;  int arraysz;  int error;};int os_filldir(void *dirent, const char *name, int namelen, loff_t offset, ino_t ino, unsigned int d_type){	int err = 0;	struct os_getdents_callback *buf = (struct os_getdents_callback *) dirent;	int ret;			if (buf->cnt >= buf->arraysz && !buf->error) {		buf->arraysz += 100;		if ((ret = __os_realloc(buf->dbenv, buf->arraysz * sizeof(buf->names[0]), &(buf->names))) != 0) {			buf->error = err = ret;			goto nomem;		}	}		if (!buf->error && (ret = __os_strdup(buf->dbenv, name, &(buf->names[buf->cnt]))) != 0) {		buf->error = err = ret;	} else {		buf->cnt++;	}	nomem:	return err;    }int__os_dirlist(dbenv, dir, namesp, cntp)     DB_ENV *dbenv;     const char *dir;     char ***namesp;     int *cntp;{	// struct dirent *dp;	struct os_getdents_callback buf;	struct file *filp;	int ret = 0;	int err = 0;			if (DB_GLOBAL(j_dirlist) != NULL)		return (DB_GLOBAL(j_dirlist)(dir, namesp, cntp));		filp = filp_open(dir, O_RDONLY, 0);		if(IS_ERR(filp))	{		ret = PTR_ERR(filp);				if(ret < 0)		{			err = -ret;		}				__os_set_errno(err);				goto out;	}		buf.cnt = 0;	buf.filldir = os_filldir;	buf.error = 0;	buf.names = NULL;	buf.dbenv = dbenv;	buf.arraysz = 0;		if ((ret = vfs_readdir(filp, os_filldir, (void *) &buf)) != 0) {		if(ret < 0)			err = -ret;		__os_set_errno(err);		goto nomem;	}		*namesp = buf.names;    	*cntp = buf.cnt;	ret = buf.error;nomem:		fput(filp);out:	return (ret);  }#else   /* * __os_dirlist -- *	Return a list of the files in a directory. * * PUBLIC: int __os_dirlist __P((DB_ENV *, const char *, char ***, int *)); */int__os_dirlist(dbenv, dir, namesp, cntp)	DB_ENV *dbenv;	const char *dir;	char ***namesp;	int *cntp;{	struct dirent *dp;	DIR *dirp;	int arraysz, cnt, ret;	char **names;	if (DB_GLOBAL(j_dirlist) != NULL)		return (DB_GLOBAL(j_dirlist)(dir, namesp, cntp));#ifdef HAVE_VXWORKS	if ((dirp = opendir((char *)dir)) == NULL)#else	if ((dirp = opendir(dir)) == NULL)#endif		return (__os_get_errno());	names = NULL;	for (arraysz = cnt = 0; (dp = readdir(dirp)) != NULL; ++cnt) {		if (cnt >= arraysz) {			arraysz += 100;			if ((ret = __os_realloc(dbenv,			    arraysz * sizeof(names[0]), &names)) != 0)				goto nomem;		}		if ((ret = __os_strdup(dbenv, dp->d_name, &names[cnt])) != 0)			goto nomem;	}	(void)closedir(dirp);	*namesp = names;	*cntp = cnt;	return (0);nomem:	if (names != NULL)		__os_dirfree(dbenv, names, cnt);	if (dirp != NULL)		(void)closedir(dirp);	return (ret);}#endif/* * __os_dirfree -- *	Free the list of files. * * PUBLIC: void __os_dirfree __P((DB_ENV *, char **, int)); */void__os_dirfree(dbenv, names, cnt)	DB_ENV *dbenv;	char **names;	int cnt;{	if (DB_GLOBAL(j_dirfree) != NULL)		DB_GLOBAL(j_dirfree)(names, cnt);	else {		while (cnt > 0)			__os_free(dbenv, names[--cnt]);		__os_free(dbenv, names);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -