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

📄 db.c

📁 samba最新软件
💻 C
字号:
/* * Copyright (c) 1997 - 2001 Kungliga Tekniska H鰃skolan * (Royal Institute of Technology, Stockholm, Sweden).  * All rights reserved.  * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in the  *    documentation and/or other materials provided with the distribution.  * * 3. Neither the name of the Institute nor the names of its contributors  *    may be used to endorse or promote products derived from this software  *    without specific prior written permission.  * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  * SUCH DAMAGE.  */#include "hdb_locl.h"RCSID("$Id: db.c 20215 2007-02-09 21:59:53Z lha $");#if HAVE_DB1#if defined(HAVE_DB_185_H)#include <db_185.h>#elif defined(HAVE_DB_H)#include <db.h>#endifstatic krb5_error_codeDB_close(krb5_context context, HDB *db){    DB *d = (DB*)db->hdb_db;    (*d->close)(d);    return 0;}static krb5_error_codeDB_destroy(krb5_context context, HDB *db){    krb5_error_code ret;    ret = hdb_clear_master_key (context, db);    free(db->hdb_name);    free(db);    return ret;}static krb5_error_codeDB_lock(krb5_context context, HDB *db, int operation){    DB *d = (DB*)db->hdb_db;    int fd = (*d->fd)(d);    if(fd < 0) {	krb5_set_error_string(context,			      "Can't lock database: %s", db->hdb_name);	return HDB_ERR_CANT_LOCK_DB;    }    return hdb_lock(fd, operation);}static krb5_error_codeDB_unlock(krb5_context context, HDB *db){    DB *d = (DB*)db->hdb_db;    int fd = (*d->fd)(d);    if(fd < 0) {	krb5_set_error_string(context, 			      "Can't unlock database: %s", db->hdb_name);	return HDB_ERR_CANT_LOCK_DB;    }    return hdb_unlock(fd);}static krb5_error_codeDB_seq(krb5_context context, HDB *db,       unsigned flags, hdb_entry_ex *entry, int flag){    DB *d = (DB*)db->hdb_db;    DBT key, value;    krb5_data key_data, data;    int code;    code = db->hdb_lock(context, db, HDB_RLOCK);    if(code == -1) {	krb5_set_error_string(context, "Database %s in use", db->hdb_name);	return HDB_ERR_DB_INUSE;    }    code = (*d->seq)(d, &key, &value, flag);    db->hdb_unlock(context, db); /* XXX check value */    if(code == -1) {	code = errno;	krb5_set_error_string(context, "Database %s seq error: %s", 			      db->hdb_name, strerror(code));	return code;    }    if(code == 1) {	krb5_clear_error_string(context);	return HDB_ERR_NOENTRY;    }    key_data.data = key.data;    key_data.length = key.size;    data.data = value.data;    data.length = value.size;    memset(entry, 0, sizeof(*entry));    if (hdb_value2entry(context, &data, &entry->entry))	return DB_seq(context, db, flags, entry, R_NEXT);    if (db->hdb_master_key_set && (flags & HDB_F_DECRYPT)) {	code = hdb_unseal_keys (context, db, &entry->entry);	if (code)	    hdb_free_entry (context, entry);    }    if (code == 0 && entry->entry.principal == NULL) {	entry->entry.principal = malloc(sizeof(*entry->entry.principal));	if (entry->entry.principal == NULL) {	    krb5_set_error_string(context, "malloc: out of memory");	    code = ENOMEM;	    hdb_free_entry (context, entry);	} else {	    hdb_key2principal(context, &key_data, entry->entry.principal);	}    }    return code;}static krb5_error_codeDB_firstkey(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry){    return DB_seq(context, db, flags, entry, R_FIRST);}static krb5_error_codeDB_nextkey(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry){    return DB_seq(context, db, flags, entry, R_NEXT);}static krb5_error_codeDB_rename(krb5_context context, HDB *db, const char *new_name){    int ret;    char *old, *new;    asprintf(&old, "%s.db", db->hdb_name);    asprintf(&new, "%s.db", new_name);    ret = rename(old, new);    free(old);    free(new);    if(ret)	return errno;        free(db->hdb_name);    db->hdb_name = strdup(new_name);    return 0;}static krb5_error_codeDB__get(krb5_context context, HDB *db, krb5_data key, krb5_data *reply){    DB *d = (DB*)db->hdb_db;    DBT k, v;    int code;    k.data = key.data;    k.size = key.length;    code = db->hdb_lock(context, db, HDB_RLOCK);    if(code)	return code;    code = (*d->get)(d, &k, &v, 0);    db->hdb_unlock(context, db);    if(code < 0) {	code = errno;	krb5_set_error_string(context, "Database %s get error: %s", 			      db->hdb_name, strerror(code));	return code;    }    if(code == 1) {	krb5_clear_error_string(context);	return HDB_ERR_NOENTRY;    }        krb5_data_copy(reply, v.data, v.size);    return 0;}static krb5_error_codeDB__put(krb5_context context, HDB *db, int replace, 	krb5_data key, krb5_data value){    DB *d = (DB*)db->hdb_db;    DBT k, v;    int code;    k.data = key.data;    k.size = key.length;    v.data = value.data;    v.size = value.length;    code = db->hdb_lock(context, db, HDB_WLOCK);    if(code)	return code;    code = (*d->put)(d, &k, &v, replace ? 0 : R_NOOVERWRITE);    db->hdb_unlock(context, db);    if(code < 0) {	code = errno;	krb5_set_error_string(context, "Database %s put error: %s", 			      db->hdb_name, strerror(code));	return code;    }    if(code == 1) {	krb5_clear_error_string(context);	return HDB_ERR_EXISTS;    }    return 0;}static krb5_error_codeDB__del(krb5_context context, HDB *db, krb5_data key){    DB *d = (DB*)db->hdb_db;    DBT k;    krb5_error_code code;    k.data = key.data;    k.size = key.length;    code = db->hdb_lock(context, db, HDB_WLOCK);    if(code)	return code;    code = (*d->del)(d, &k, 0);    db->hdb_unlock(context, db);    if(code == 1) {	code = errno;	krb5_set_error_string(context, "Database %s put error: %s", 			      db->hdb_name, strerror(code));	return code;    }    if(code < 0)	return errno;    return 0;}static krb5_error_codeDB_open(krb5_context context, HDB *db, int flags, mode_t mode){    char *fn;    krb5_error_code ret;    asprintf(&fn, "%s.db", db->hdb_name);    if (fn == NULL) {	krb5_set_error_string(context, "malloc: out of memory");	return ENOMEM;    }    db->hdb_db = dbopen(fn, flags, mode, DB_BTREE, NULL);    free(fn);    /* try to open without .db extension */    if(db->hdb_db == NULL && errno == ENOENT)	db->hdb_db = dbopen(db->hdb_name, flags, mode, DB_BTREE, NULL);    if(db->hdb_db == NULL) {	ret = errno;	krb5_set_error_string(context, "dbopen (%s): %s",			      db->hdb_name, strerror(ret));	return ret;    }    if((flags & O_ACCMODE) == O_RDONLY)	ret = hdb_check_db_format(context, db);    else	ret = hdb_init_db(context, db);    if(ret == HDB_ERR_NOENTRY) {	krb5_clear_error_string(context);	return 0;    }    if (ret) {	DB_close(context, db);	krb5_set_error_string(context, "hdb_open: failed %s database %s",			      (flags & O_ACCMODE) == O_RDONLY ? 			      "checking format of" : "initialize", 			      db->hdb_name);    }    return ret;}krb5_error_codehdb_db_create(krb5_context context, HDB **db, 	      const char *filename){    *db = calloc(1, sizeof(**db));    if (*db == NULL) {	krb5_set_error_string(context, "malloc: out of memory");	return ENOMEM;    }    (*db)->hdb_db = NULL;    (*db)->hdb_name = strdup(filename);    if ((*db)->hdb_name == NULL) {	krb5_set_error_string(context, "malloc: out of memory");	free(*db);	*db = NULL;	return ENOMEM;    }    (*db)->hdb_master_key_set = 0;    (*db)->hdb_openp = 0;    (*db)->hdb_open = DB_open;    (*db)->hdb_close = DB_close;    (*db)->hdb_fetch = _hdb_fetch;    (*db)->hdb_store = _hdb_store;    (*db)->hdb_remove = _hdb_remove;    (*db)->hdb_firstkey = DB_firstkey;    (*db)->hdb_nextkey= DB_nextkey;    (*db)->hdb_lock = DB_lock;    (*db)->hdb_unlock = DB_unlock;    (*db)->hdb_rename = DB_rename;    (*db)->hdb__get = DB__get;    (*db)->hdb__put = DB__put;    (*db)->hdb__del = DB__del;    (*db)->hdb_destroy = DB_destroy;    return 0;}#endif /* HAVE_DB1 */

⌨️ 快捷键说明

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