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

📄 env_method.c

📁 这是国外的resip协议栈
💻 C
📖 第 1 页 / 共 2 页
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1999-2004 *	Sleepycat Software.  All rights reserved. * * $Id: env_method.c,v 11.136 2004/10/11 18:47:50 bostic Exp $ */#include "db_config.h"#ifndef NO_SYSTEM_INCLUDES#include <sys/types.h>#ifdef HAVE_RPC#include <rpc/rpc.h>#endif#include <string.h>#endif#ifdef HAVE_RPC#include "db_server.h"#endif/* * This is the file that initializes the global array.  Do it this way because * people keep changing one without changing the other.  Having declaration and * initialization in one file will hopefully fix that. */#define	DB_INITIALIZE_DB_GLOBALS	1#include "db_int.h"#include "dbinc/crypto.h"#include "dbinc/hmac.h"#include "dbinc/db_shash.h"#include "dbinc/db_page.h"#include "dbinc/db_am.h"#include "dbinc/lock.h"#include "dbinc/log.h"#include "dbinc/mp.h"#include "dbinc/txn.h"#ifdef HAVE_RPC#include "dbinc_auto/rpc_client_ext.h"#endifstatic void __dbenv_err __P((const DB_ENV *, int, const char *, ...));static void __dbenv_errx __P((const DB_ENV *, const char *, ...));static int  __dbenv_get_data_dirs __P((DB_ENV *, const char ***));static int  __dbenv_get_flags __P((DB_ENV *, u_int32_t *));static int  __dbenv_get_home __P((DB_ENV *, const char **));static int  __dbenv_get_shm_key __P((DB_ENV *, long *));static int  __dbenv_get_tas_spins __P((DB_ENV *, u_int32_t *));static int  __dbenv_get_tmp_dir __P((DB_ENV *, const char **));static int  __dbenv_get_verbose __P((DB_ENV *, u_int32_t, int *));static int  __dbenv_init __P((DB_ENV *));static void __dbenv_map_flags __P((DB_ENV *, u_int32_t *, u_int32_t *));static int  __dbenv_set_app_dispatch		__P((DB_ENV *, int (*)(DB_ENV *, DBT *, DB_LSN *, db_recops)));static int  __dbenv_set_feedback __P((DB_ENV *, void (*)(DB_ENV *, int, int)));static int  __dbenv_set_rpc_server_noclnt		__P((DB_ENV *, void *, const char *, long, long, u_int32_t));/* * db_env_create -- *	DB_ENV constructor. * * EXTERN: int db_env_create __P((DB_ENV **, u_int32_t)); */intdb_env_create(dbenvpp, flags)	DB_ENV **dbenvpp;	u_int32_t flags;{	DB_ENV *dbenv;	int ret;	/*	 * !!!	 * Our caller has not yet had the opportunity to reset the panic	 * state or turn off mutex locking, and so we can neither check	 * the panic state or acquire a mutex in the DB_ENV create path.	 *	 * !!!	 * We can't call the flags-checking routines, we don't have an	 * environment yet.	 */	if (flags != 0 && !LF_ISSET(DB_RPCCLIENT))		return (EINVAL);	if ((ret = __os_calloc(NULL, 1, sizeof(*dbenv), &dbenv)) != 0)		return (ret);#ifdef HAVE_RPC	if (LF_ISSET(DB_RPCCLIENT))		F_SET(dbenv, DB_ENV_RPCCLIENT);#endif	if ((ret = __dbenv_init(dbenv)) != 0) {		__os_free(NULL, dbenv);		return (ret);	}	*dbenvpp = dbenv;	return (0);}/* * __dbenv_init -- *	Initialize a DB_ENV structure. */static int__dbenv_init(dbenv)	DB_ENV *dbenv;{	/*	 * !!!	 * Our caller has not yet had the opportunity to reset the panic	 * state or turn off mutex locking, and so we can neither check	 * the panic state or acquire a mutex in the DB_ENV create path.	 *	 * Set up methods that are the same in both normal and RPC	 */	dbenv->err = __dbenv_err;	dbenv->errx = __dbenv_errx;	dbenv->set_errcall = __dbenv_set_errcall;	dbenv->get_errfile = __dbenv_get_errfile;	dbenv->set_errfile = __dbenv_set_errfile;	dbenv->get_errpfx = __dbenv_get_errpfx;	dbenv->set_errpfx = __dbenv_set_errpfx;	dbenv->set_msgcall = __dbenv_set_msgcall;	dbenv->get_msgfile = __dbenv_get_msgfile;	dbenv->set_msgfile = __dbenv_set_msgfile;#ifdef	HAVE_RPC	if (F_ISSET(dbenv, DB_ENV_RPCCLIENT)) {		dbenv->close = __dbcl_env_close_wrap;		dbenv->dbremove = __dbcl_env_dbremove;		dbenv->dbrename = __dbcl_env_dbrename;		dbenv->get_home = __dbcl_env_get_home;		dbenv->get_open_flags = __dbcl_env_get_open_flags;		dbenv->open = __dbcl_env_open_wrap;		dbenv->remove = __dbcl_env_remove;		dbenv->stat_print = NULL;		dbenv->fileid_reset = NULL;		dbenv->is_bigendian = NULL;		dbenv->lsn_reset = NULL;		dbenv->prdbt = NULL;		dbenv->set_alloc = __dbcl_env_alloc;		dbenv->set_app_dispatch = __dbcl_set_app_dispatch;		dbenv->get_data_dirs = __dbcl_get_data_dirs;		dbenv->set_data_dir = __dbcl_set_data_dir;		dbenv->get_encrypt_flags = __dbcl_env_get_encrypt_flags;		dbenv->set_encrypt = __dbcl_env_encrypt;		dbenv->set_feedback = __dbcl_env_set_feedback;		dbenv->get_flags = __dbcl_env_get_flags;		dbenv->set_flags = __dbcl_env_flags;		dbenv->set_paniccall = __dbcl_env_paniccall;		dbenv->set_rpc_server = __dbcl_envrpcserver;		dbenv->get_shm_key = __dbcl_get_shm_key;		dbenv->set_shm_key = __dbcl_set_shm_key;		dbenv->get_tas_spins = __dbcl_get_tas_spins;		dbenv->set_tas_spins = __dbcl_set_tas_spins;		dbenv->get_timeout = __dbcl_get_timeout;		dbenv->set_timeout = __dbcl_set_timeout;		dbenv->get_tmp_dir = __dbcl_get_tmp_dir;		dbenv->set_tmp_dir = __dbcl_set_tmp_dir;		dbenv->get_verbose = __dbcl_get_verbose;		dbenv->set_verbose = __dbcl_set_verbose;	} else {#endif		dbenv->close = __dbenv_close_pp;		dbenv->dbremove = __dbenv_dbremove_pp;		dbenv->dbrename = __dbenv_dbrename_pp;		dbenv->open = __dbenv_open;		dbenv->remove = __dbenv_remove;		dbenv->stat_print = __dbenv_stat_print_pp;		dbenv->fileid_reset = __db_fileid_reset;		dbenv->is_bigendian = __db_isbigendian;		dbenv->lsn_reset = __db_lsn_reset;		dbenv->prdbt = __db_prdbt;		dbenv->get_home = __dbenv_get_home;		dbenv->get_open_flags = __dbenv_get_open_flags;		dbenv->set_alloc = __dbenv_set_alloc;		dbenv->set_app_dispatch = __dbenv_set_app_dispatch;		dbenv->get_data_dirs = __dbenv_get_data_dirs;		dbenv->set_data_dir = __dbenv_set_data_dir;		dbenv->get_encrypt_flags = __dbenv_get_encrypt_flags;		dbenv->set_encrypt = __dbenv_set_encrypt;		dbenv->set_feedback = __dbenv_set_feedback;		dbenv->get_flags = __dbenv_get_flags;		dbenv->set_flags = __dbenv_set_flags;		dbenv->set_intermediate_dir = __dbenv_set_intermediate_dir;		dbenv->set_paniccall = __dbenv_set_paniccall;		dbenv->set_rpc_server = __dbenv_set_rpc_server_noclnt;		dbenv->get_shm_key = __dbenv_get_shm_key;		dbenv->set_shm_key = __dbenv_set_shm_key;		dbenv->get_tas_spins = __dbenv_get_tas_spins;		dbenv->set_tas_spins = __dbenv_set_tas_spins;		dbenv->get_tmp_dir = __dbenv_get_tmp_dir;		dbenv->set_tmp_dir = __dbenv_set_tmp_dir;		dbenv->get_verbose = __dbenv_get_verbose;		dbenv->set_verbose = __dbenv_set_verbose;#ifdef	HAVE_RPC	}#endif	dbenv->shm_key = INVALID_REGION_SEGID;	dbenv->db_ref = 0;	__os_spin(dbenv);	__log_dbenv_create(dbenv);		/* Subsystem specific. */	__lock_dbenv_create(dbenv);	__memp_dbenv_create(dbenv);	__rep_dbenv_create(dbenv);	__txn_dbenv_create(dbenv);	return (0);}/* * __dbenv_err -- *	Error message, including the standard error string. */static void#ifdef STDC_HEADERS__dbenv_err(const DB_ENV *dbenv, int error, const char *fmt, ...)#else__dbenv_err(dbenv, error, fmt, va_alist)	const DB_ENV *dbenv;	int error;	const char *fmt;	va_dcl#endif{	DB_REAL_ERR(dbenv, error, 1, 1, fmt);}/* * __dbenv_errx -- *	Error message. */static void#ifdef STDC_HEADERS__dbenv_errx(const DB_ENV *dbenv, const char *fmt, ...)#else__dbenv_errx(dbenv, fmt, va_alist)	const DB_ENV *dbenv;	const char *fmt;	va_dcl#endif{	DB_REAL_ERR(dbenv, 0, 0, 1, fmt);}static int__dbenv_get_home(dbenv, homep)	DB_ENV *dbenv;	const char **homep;{	ENV_ILLEGAL_BEFORE_OPEN(dbenv, "DB_ENV->get_home");	*homep = dbenv->db_home;	return (0);}/* * __dbenv_set_alloc -- *	{DB_ENV,DB}->set_alloc. * * PUBLIC: int  __dbenv_set_alloc __P((DB_ENV *, void *(*)(size_t), * PUBLIC:          void *(*)(void *, size_t), void (*)(void *))); */int__dbenv_set_alloc(dbenv, mal_func, real_func, free_func)	DB_ENV *dbenv;	void *(*mal_func) __P((size_t));	void *(*real_func) __P((void *, size_t));	void (*free_func) __P((void *));{	ENV_ILLEGAL_AFTER_OPEN(dbenv, "DB_ENV->set_alloc");	dbenv->db_malloc = mal_func;	dbenv->db_realloc = real_func;	dbenv->db_free = free_func;	return (0);}/* * __dbenv_set_app_dispatch -- *	Set the transaction abort recover function. */static int__dbenv_set_app_dispatch(dbenv, app_dispatch)	DB_ENV *dbenv;	int (*app_dispatch) __P((DB_ENV *, DBT *, DB_LSN *, db_recops));{	ENV_ILLEGAL_AFTER_OPEN(dbenv, "DB_ENV->set_app_dispatch");	dbenv->app_dispatch = app_dispatch;	return (0);}/* * __dbenv_get_encrypt_flags -- *	{DB_ENV,DB}->get_encrypt_flags. * * PUBLIC: int __dbenv_get_encrypt_flags __P((DB_ENV *, u_int32_t *)); */int__dbenv_get_encrypt_flags(dbenv, flagsp)	DB_ENV *dbenv;	u_int32_t *flagsp;{#ifdef HAVE_CRYPTO	DB_CIPHER *db_cipher;	db_cipher = dbenv->crypto_handle;	if (db_cipher != NULL && db_cipher->alg == CIPHER_AES)		*flagsp = DB_ENCRYPT_AES;	else		*flagsp = 0;	return (0);#else	COMPQUIET(flagsp, 0);	__db_err(dbenv,	    "library build did not include support for cryptography");	return (DB_OPNOTSUP);#endif}/* * __dbenv_set_encrypt -- *	DB_ENV->set_encrypt. * * PUBLIC: int __dbenv_set_encrypt __P((DB_ENV *, const char *, u_int32_t)); */int__dbenv_set_encrypt(dbenv, passwd, flags)	DB_ENV *dbenv;	const char *passwd;	u_int32_t flags;{#ifdef HAVE_CRYPTO	DB_CIPHER *db_cipher;	int ret;	ENV_ILLEGAL_AFTER_OPEN(dbenv, "DB_ENV->set_encrypt");#define	OK_CRYPTO_FLAGS	(DB_ENCRYPT_AES)	if (flags != 0 && LF_ISSET(~OK_CRYPTO_FLAGS))		return (__db_ferr(dbenv, "DB_ENV->set_encrypt", 0));	if (passwd == NULL || strlen(passwd) == 0) {		__db_err(dbenv, "Empty password specified to set_encrypt");		return (EINVAL);	}	if (!CRYPTO_ON(dbenv)) {		if ((ret = __os_calloc(dbenv, 1, sizeof(DB_CIPHER), &db_cipher))		    != 0)			goto err;		dbenv->crypto_handle = db_cipher;	} else		db_cipher = (DB_CIPHER *)dbenv->crypto_handle;	if (dbenv->passwd != NULL)		__os_free(dbenv, dbenv->passwd);	if ((ret = __os_strdup(dbenv, passwd, &dbenv->passwd)) != 0) {		__os_free(dbenv, db_cipher);		goto err;	}	/*	 * We're going to need this often enough to keep around	 */	dbenv->passwd_len = strlen(dbenv->passwd) + 1;	/*	 * The MAC key is for checksumming, and is separate from	 * the algorithm.  So initialize it here, even if they	 * are using CIPHER_ANY.	 */	__db_derive_mac((u_int8_t *)dbenv->passwd,	    dbenv->passwd_len, db_cipher->mac_key);	switch (flags) {	case 0:		F_SET(db_cipher, CIPHER_ANY);		break;	case DB_ENCRYPT_AES:		if ((ret = __crypto_algsetup(dbenv, db_cipher, CIPHER_AES, 0))		    != 0)			goto err1;		break;	default:				/* Impossible. */		break;	}	return (0);err1:	__os_free(dbenv, dbenv->passwd);	__os_free(dbenv, db_cipher);	dbenv->crypto_handle = NULL;err:	return (ret);#else	COMPQUIET(passwd, NULL);	COMPQUIET(flags, 0);	__db_err(dbenv,	    "library build did not include support for cryptography");	return (DB_OPNOTSUP);#endif}static void__dbenv_map_flags(dbenv, inflagsp, outflagsp)	DB_ENV *dbenv;	u_int32_t *inflagsp, *outflagsp;{	COMPQUIET(dbenv, NULL);	if (FLD_ISSET(*inflagsp, DB_AUTO_COMMIT)) {		FLD_SET(*outflagsp, DB_ENV_AUTO_COMMIT);		FLD_CLR(*inflagsp, DB_AUTO_COMMIT);	}	if (FLD_ISSET(*inflagsp, DB_CDB_ALLDB)) {		FLD_SET(*outflagsp, DB_ENV_CDB_ALLDB);		FLD_CLR(*inflagsp, DB_CDB_ALLDB);	}	if (FLD_ISSET(*inflagsp, DB_DIRECT_DB)) {		FLD_SET(*outflagsp, DB_ENV_DIRECT_DB);		FLD_CLR(*inflagsp, DB_DIRECT_DB);	}	if (FLD_ISSET(*inflagsp, DB_DIRECT_LOG)) {		FLD_SET(*outflagsp, DB_ENV_DIRECT_LOG);		FLD_CLR(*inflagsp, DB_DIRECT_LOG);	}	if (FLD_ISSET(*inflagsp, DB_DSYNC_LOG)) {		FLD_SET(*outflagsp, DB_ENV_DSYNC_LOG);		FLD_CLR(*inflagsp, DB_DSYNC_LOG);	}	if (FLD_ISSET(*inflagsp, DB_LOG_AUTOREMOVE)) {		FLD_SET(*outflagsp, DB_ENV_LOG_AUTOREMOVE);		FLD_CLR(*inflagsp, DB_LOG_AUTOREMOVE);	}	if (FLD_ISSET(*inflagsp, DB_LOG_INMEMORY)) {		FLD_SET(*outflagsp, DB_ENV_LOG_INMEMORY);		FLD_CLR(*inflagsp, DB_LOG_INMEMORY);	}	if (FLD_ISSET(*inflagsp, DB_NOLOCKING)) {		FLD_SET(*outflagsp, DB_ENV_NOLOCKING);		FLD_CLR(*inflagsp, DB_NOLOCKING);	}	if (FLD_ISSET(*inflagsp, DB_NOMMAP)) {		FLD_SET(*outflagsp, DB_ENV_NOMMAP);		FLD_CLR(*inflagsp, DB_NOMMAP);	}	if (FLD_ISSET(*inflagsp, DB_NOPANIC)) {		FLD_SET(*outflagsp, DB_ENV_NOPANIC);		FLD_CLR(*inflagsp, DB_NOPANIC);	}	if (FLD_ISSET(*inflagsp, DB_OVERWRITE)) {		FLD_SET(*outflagsp, DB_ENV_OVERWRITE);		FLD_CLR(*inflagsp, DB_OVERWRITE);	}	if (FLD_ISSET(*inflagsp, DB_REGION_INIT)) {		FLD_SET(*outflagsp, DB_ENV_REGION_INIT);		FLD_CLR(*inflagsp, DB_REGION_INIT);	}	if (FLD_ISSET(*inflagsp, DB_TIME_NOTGRANTED)) {		FLD_SET(*outflagsp, DB_ENV_TIME_NOTGRANTED);		FLD_CLR(*inflagsp, DB_TIME_NOTGRANTED);	}	if (FLD_ISSET(*inflagsp, DB_TXN_NOSYNC)) {		FLD_SET(*outflagsp, DB_ENV_TXN_NOSYNC);		FLD_CLR(*inflagsp, DB_TXN_NOSYNC);	}	if (FLD_ISSET(*inflagsp, DB_TXN_WRITE_NOSYNC)) {		FLD_SET(*outflagsp, DB_ENV_TXN_WRITE_NOSYNC);		FLD_CLR(*inflagsp, DB_TXN_WRITE_NOSYNC);	}	if (FLD_ISSET(*inflagsp, DB_YIELDCPU)) {		FLD_SET(*outflagsp, DB_ENV_YIELDCPU);		FLD_CLR(*inflagsp, DB_YIELDCPU);	}}static int__dbenv_get_flags(dbenv, flagsp)	DB_ENV *dbenv;	u_int32_t *flagsp;{	static const u_int32_t env_flags[] = {		DB_AUTO_COMMIT,		DB_CDB_ALLDB,		DB_DIRECT_DB,		DB_DIRECT_LOG,		DB_DSYNC_LOG,		DB_LOG_AUTOREMOVE,		DB_LOG_INMEMORY,		DB_NOLOCKING,		DB_NOMMAP,		DB_NOPANIC,		DB_OVERWRITE,		DB_REGION_INIT,		DB_TIME_NOTGRANTED,		DB_TXN_NOSYNC,		DB_TXN_WRITE_NOSYNC,		DB_YIELDCPU,		0	};	u_int32_t f, flags, mapped_flag;	int i;	flags = 0;	for (i = 0; (f = env_flags[i]) != 0; i++) {		mapped_flag = 0;		__dbenv_map_flags(dbenv, &f, &mapped_flag);		DB_ASSERT(f == 0);		if (F_ISSET(dbenv, mapped_flag) == mapped_flag)

⌨️ 快捷键说明

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