17c478bd9Sstevel@tonic-gate /* 2*e9af4bc0SJohn Beck ** Copyright (c) 1999-2003, 2009 Sendmail, Inc. and its suppliers. 37c478bd9Sstevel@tonic-gate ** All rights reserved. 47c478bd9Sstevel@tonic-gate ** 57c478bd9Sstevel@tonic-gate ** By using this file, you agree to the terms and conditions set 67c478bd9Sstevel@tonic-gate ** forth in the LICENSE file which can be found at the top level of 77c478bd9Sstevel@tonic-gate ** the sendmail distribution. 87c478bd9Sstevel@tonic-gate */ 97c478bd9Sstevel@tonic-gate 107c478bd9Sstevel@tonic-gate #include <sm/gen.h> 11*e9af4bc0SJohn Beck SM_RCSID("@(#)$Id: smdb2.c,v 8.80 2009/11/12 23:07:49 ca Exp $") 127c478bd9Sstevel@tonic-gate 137c478bd9Sstevel@tonic-gate #include <fcntl.h> 147c478bd9Sstevel@tonic-gate #include <stdlib.h> 157c478bd9Sstevel@tonic-gate #include <unistd.h> 167c478bd9Sstevel@tonic-gate 177c478bd9Sstevel@tonic-gate 187c478bd9Sstevel@tonic-gate #include <sendmail/sendmail.h> 197c478bd9Sstevel@tonic-gate #include <libsmdb/smdb.h> 207c478bd9Sstevel@tonic-gate 217c478bd9Sstevel@tonic-gate #if (DB_VERSION_MAJOR >= 2) 227c478bd9Sstevel@tonic-gate 237c478bd9Sstevel@tonic-gate # define SMDB2_FILE_EXTENSION "db" 247c478bd9Sstevel@tonic-gate 257c478bd9Sstevel@tonic-gate struct smdb_db2_database 267c478bd9Sstevel@tonic-gate { 277c478bd9Sstevel@tonic-gate DB *smdb2_db; 287c478bd9Sstevel@tonic-gate int smdb2_lock_fd; 297c478bd9Sstevel@tonic-gate }; 307c478bd9Sstevel@tonic-gate typedef struct smdb_db2_database SMDB_DB2_DATABASE; 317c478bd9Sstevel@tonic-gate 327c478bd9Sstevel@tonic-gate /* 337c478bd9Sstevel@tonic-gate ** SMDB_TYPE_TO_DB2_TYPE -- Translates smdb database type to db2 type. 347c478bd9Sstevel@tonic-gate ** 357c478bd9Sstevel@tonic-gate ** Parameters: 367c478bd9Sstevel@tonic-gate ** type -- The type to translate. 377c478bd9Sstevel@tonic-gate ** 387c478bd9Sstevel@tonic-gate ** Returns: 397c478bd9Sstevel@tonic-gate ** The DB2 type that corresponsds to the passed in SMDB type. 407c478bd9Sstevel@tonic-gate ** Returns -1 if there is no equivalent type. 417c478bd9Sstevel@tonic-gate ** 427c478bd9Sstevel@tonic-gate */ 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate DBTYPE 457c478bd9Sstevel@tonic-gate smdb_type_to_db2_type(type) 467c478bd9Sstevel@tonic-gate SMDB_DBTYPE type; 477c478bd9Sstevel@tonic-gate { 487c478bd9Sstevel@tonic-gate if (type == SMDB_TYPE_DEFAULT) 497c478bd9Sstevel@tonic-gate return DB_HASH; 507c478bd9Sstevel@tonic-gate 517c478bd9Sstevel@tonic-gate if (strncmp(type, SMDB_TYPE_HASH, SMDB_TYPE_HASH_LEN) == 0) 527c478bd9Sstevel@tonic-gate return DB_HASH; 537c478bd9Sstevel@tonic-gate 547c478bd9Sstevel@tonic-gate if (strncmp(type, SMDB_TYPE_BTREE, SMDB_TYPE_BTREE_LEN) == 0) 557c478bd9Sstevel@tonic-gate return DB_BTREE; 567c478bd9Sstevel@tonic-gate 577c478bd9Sstevel@tonic-gate return DB_UNKNOWN; 587c478bd9Sstevel@tonic-gate } 597c478bd9Sstevel@tonic-gate /* 607c478bd9Sstevel@tonic-gate ** DB2_ERROR_TO_SMDB -- Translates db2 errors to smdbe errors 617c478bd9Sstevel@tonic-gate ** 627c478bd9Sstevel@tonic-gate ** Parameters: 637c478bd9Sstevel@tonic-gate ** error -- The error to translate. 647c478bd9Sstevel@tonic-gate ** 657c478bd9Sstevel@tonic-gate ** Returns: 667c478bd9Sstevel@tonic-gate ** The SMDBE error corresponding to the db2 error. 677c478bd9Sstevel@tonic-gate ** If we don't have a corresponding error, it returs errno. 687c478bd9Sstevel@tonic-gate ** 697c478bd9Sstevel@tonic-gate */ 707c478bd9Sstevel@tonic-gate 717c478bd9Sstevel@tonic-gate int 727c478bd9Sstevel@tonic-gate db2_error_to_smdb(error) 737c478bd9Sstevel@tonic-gate int error; 747c478bd9Sstevel@tonic-gate { 757c478bd9Sstevel@tonic-gate int result; 767c478bd9Sstevel@tonic-gate 777c478bd9Sstevel@tonic-gate switch (error) 787c478bd9Sstevel@tonic-gate { 797c478bd9Sstevel@tonic-gate # ifdef DB_INCOMPLETE 807c478bd9Sstevel@tonic-gate case DB_INCOMPLETE: 817c478bd9Sstevel@tonic-gate result = SMDBE_INCOMPLETE; 827c478bd9Sstevel@tonic-gate break; 837c478bd9Sstevel@tonic-gate # endif /* DB_INCOMPLETE */ 847c478bd9Sstevel@tonic-gate 857c478bd9Sstevel@tonic-gate # ifdef DB_NOTFOUND 867c478bd9Sstevel@tonic-gate case DB_NOTFOUND: 877c478bd9Sstevel@tonic-gate result = SMDBE_NOT_FOUND; 887c478bd9Sstevel@tonic-gate break; 897c478bd9Sstevel@tonic-gate # endif /* DB_NOTFOUND */ 907c478bd9Sstevel@tonic-gate 917c478bd9Sstevel@tonic-gate # ifdef DB_KEYEMPTY 927c478bd9Sstevel@tonic-gate case DB_KEYEMPTY: 937c478bd9Sstevel@tonic-gate result = SMDBE_KEY_EMPTY; 947c478bd9Sstevel@tonic-gate break; 957c478bd9Sstevel@tonic-gate # endif /* DB_KEYEMPTY */ 967c478bd9Sstevel@tonic-gate 977c478bd9Sstevel@tonic-gate # ifdef DB_KEYEXIST 987c478bd9Sstevel@tonic-gate case DB_KEYEXIST: 997c478bd9Sstevel@tonic-gate result = SMDBE_KEY_EXIST; 1007c478bd9Sstevel@tonic-gate break; 1017c478bd9Sstevel@tonic-gate # endif /* DB_KEYEXIST */ 1027c478bd9Sstevel@tonic-gate 1037c478bd9Sstevel@tonic-gate # ifdef DB_LOCK_DEADLOCK 1047c478bd9Sstevel@tonic-gate case DB_LOCK_DEADLOCK: 1057c478bd9Sstevel@tonic-gate result = SMDBE_LOCK_DEADLOCK; 1067c478bd9Sstevel@tonic-gate break; 1077c478bd9Sstevel@tonic-gate # endif /* DB_LOCK_DEADLOCK */ 1087c478bd9Sstevel@tonic-gate 1097c478bd9Sstevel@tonic-gate # ifdef DB_LOCK_NOTGRANTED 1107c478bd9Sstevel@tonic-gate case DB_LOCK_NOTGRANTED: 1117c478bd9Sstevel@tonic-gate result = SMDBE_LOCK_NOT_GRANTED; 1127c478bd9Sstevel@tonic-gate break; 1137c478bd9Sstevel@tonic-gate # endif /* DB_LOCK_NOTGRANTED */ 1147c478bd9Sstevel@tonic-gate 1157c478bd9Sstevel@tonic-gate # ifdef DB_LOCK_NOTHELD 1167c478bd9Sstevel@tonic-gate case DB_LOCK_NOTHELD: 1177c478bd9Sstevel@tonic-gate result = SMDBE_LOCK_NOT_HELD; 1187c478bd9Sstevel@tonic-gate break; 1197c478bd9Sstevel@tonic-gate # endif /* DB_LOCK_NOTHELD */ 1207c478bd9Sstevel@tonic-gate 1217c478bd9Sstevel@tonic-gate # ifdef DB_RUNRECOVERY 1227c478bd9Sstevel@tonic-gate case DB_RUNRECOVERY: 1237c478bd9Sstevel@tonic-gate result = SMDBE_RUN_RECOVERY; 1247c478bd9Sstevel@tonic-gate break; 1257c478bd9Sstevel@tonic-gate # endif /* DB_RUNRECOVERY */ 1267c478bd9Sstevel@tonic-gate 1277c478bd9Sstevel@tonic-gate # ifdef DB_OLD_VERSION 1287c478bd9Sstevel@tonic-gate case DB_OLD_VERSION: 1297c478bd9Sstevel@tonic-gate result = SMDBE_OLD_VERSION; 1307c478bd9Sstevel@tonic-gate break; 1317c478bd9Sstevel@tonic-gate # endif /* DB_OLD_VERSION */ 1327c478bd9Sstevel@tonic-gate 1337c478bd9Sstevel@tonic-gate case 0: 1347c478bd9Sstevel@tonic-gate result = SMDBE_OK; 1357c478bd9Sstevel@tonic-gate break; 1367c478bd9Sstevel@tonic-gate 1377c478bd9Sstevel@tonic-gate default: 1387c478bd9Sstevel@tonic-gate result = error; 1397c478bd9Sstevel@tonic-gate } 1407c478bd9Sstevel@tonic-gate return result; 1417c478bd9Sstevel@tonic-gate } 1427c478bd9Sstevel@tonic-gate /* 1437c478bd9Sstevel@tonic-gate ** SMDB_PUT_FLAGS_TO_DB2_FLAGS -- Translates smdb put flags to db2 put flags. 1447c478bd9Sstevel@tonic-gate ** 1457c478bd9Sstevel@tonic-gate ** Parameters: 1467c478bd9Sstevel@tonic-gate ** flags -- The flags to translate. 1477c478bd9Sstevel@tonic-gate ** 1487c478bd9Sstevel@tonic-gate ** Returns: 1497c478bd9Sstevel@tonic-gate ** The db2 flags that are equivalent to the smdb flags. 1507c478bd9Sstevel@tonic-gate ** 1517c478bd9Sstevel@tonic-gate ** Notes: 1527c478bd9Sstevel@tonic-gate ** Any invalid flags are ignored. 1537c478bd9Sstevel@tonic-gate ** 1547c478bd9Sstevel@tonic-gate */ 1557c478bd9Sstevel@tonic-gate 1567c478bd9Sstevel@tonic-gate unsigned int 1577c478bd9Sstevel@tonic-gate smdb_put_flags_to_db2_flags(flags) 1587c478bd9Sstevel@tonic-gate SMDB_FLAG flags; 1597c478bd9Sstevel@tonic-gate { 1607c478bd9Sstevel@tonic-gate int return_flags; 1617c478bd9Sstevel@tonic-gate 1627c478bd9Sstevel@tonic-gate return_flags = 0; 1637c478bd9Sstevel@tonic-gate 1647c478bd9Sstevel@tonic-gate if (bitset(SMDBF_NO_OVERWRITE, flags)) 1657c478bd9Sstevel@tonic-gate return_flags |= DB_NOOVERWRITE; 1667c478bd9Sstevel@tonic-gate 1677c478bd9Sstevel@tonic-gate return return_flags; 1687c478bd9Sstevel@tonic-gate } 1697c478bd9Sstevel@tonic-gate /* 1707c478bd9Sstevel@tonic-gate ** SMDB_CURSOR_GET_FLAGS_TO_DB2 -- Translates smdb cursor get flags to db2 1717c478bd9Sstevel@tonic-gate ** getflags. 1727c478bd9Sstevel@tonic-gate ** 1737c478bd9Sstevel@tonic-gate ** Parameters: 1747c478bd9Sstevel@tonic-gate ** flags -- The flags to translate. 1757c478bd9Sstevel@tonic-gate ** 1767c478bd9Sstevel@tonic-gate ** Returns: 1777c478bd9Sstevel@tonic-gate ** The db2 flags that are equivalent to the smdb flags. 1787c478bd9Sstevel@tonic-gate ** 1797c478bd9Sstevel@tonic-gate ** Notes: 1807c478bd9Sstevel@tonic-gate ** -1 is returned if flag is unknown. 1817c478bd9Sstevel@tonic-gate ** 1827c478bd9Sstevel@tonic-gate */ 1837c478bd9Sstevel@tonic-gate 1847c478bd9Sstevel@tonic-gate int 1857c478bd9Sstevel@tonic-gate smdb_cursor_get_flags_to_db2(flags) 1867c478bd9Sstevel@tonic-gate SMDB_FLAG flags; 1877c478bd9Sstevel@tonic-gate { 1887c478bd9Sstevel@tonic-gate switch (flags) 1897c478bd9Sstevel@tonic-gate { 1907c478bd9Sstevel@tonic-gate case SMDB_CURSOR_GET_FIRST: 1917c478bd9Sstevel@tonic-gate return DB_FIRST; 1927c478bd9Sstevel@tonic-gate 1937c478bd9Sstevel@tonic-gate case SMDB_CURSOR_GET_LAST: 1947c478bd9Sstevel@tonic-gate return DB_LAST; 1957c478bd9Sstevel@tonic-gate 1967c478bd9Sstevel@tonic-gate case SMDB_CURSOR_GET_NEXT: 1977c478bd9Sstevel@tonic-gate return DB_NEXT; 1987c478bd9Sstevel@tonic-gate 1997c478bd9Sstevel@tonic-gate case SMDB_CURSOR_GET_RANGE: 2007c478bd9Sstevel@tonic-gate return DB_SET_RANGE; 2017c478bd9Sstevel@tonic-gate 2027c478bd9Sstevel@tonic-gate default: 2037c478bd9Sstevel@tonic-gate return -1; 2047c478bd9Sstevel@tonic-gate } 2057c478bd9Sstevel@tonic-gate } 2067c478bd9Sstevel@tonic-gate 2077c478bd9Sstevel@tonic-gate /* 2087c478bd9Sstevel@tonic-gate ** Except for smdb_db_open, the rest of these functions correspond to the 2097c478bd9Sstevel@tonic-gate ** interface laid out in smdb.h. 2107c478bd9Sstevel@tonic-gate */ 2117c478bd9Sstevel@tonic-gate 2127c478bd9Sstevel@tonic-gate SMDB_DB2_DATABASE * 2137c478bd9Sstevel@tonic-gate smdb2_malloc_database() 2147c478bd9Sstevel@tonic-gate { 2157c478bd9Sstevel@tonic-gate SMDB_DB2_DATABASE *db2; 2167c478bd9Sstevel@tonic-gate 2177c478bd9Sstevel@tonic-gate db2 = (SMDB_DB2_DATABASE *) malloc(sizeof(SMDB_DB2_DATABASE)); 2187c478bd9Sstevel@tonic-gate if (db2 != NULL) 2197c478bd9Sstevel@tonic-gate db2->smdb2_lock_fd = -1; 2207c478bd9Sstevel@tonic-gate 2217c478bd9Sstevel@tonic-gate return db2; 2227c478bd9Sstevel@tonic-gate } 2237c478bd9Sstevel@tonic-gate 2247c478bd9Sstevel@tonic-gate int 2257c478bd9Sstevel@tonic-gate smdb2_close(database) 2267c478bd9Sstevel@tonic-gate SMDB_DATABASE *database; 2277c478bd9Sstevel@tonic-gate { 2287c478bd9Sstevel@tonic-gate int result; 2297c478bd9Sstevel@tonic-gate SMDB_DB2_DATABASE *db2 = (SMDB_DB2_DATABASE *) database->smdb_impl; 2307c478bd9Sstevel@tonic-gate DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db; 2317c478bd9Sstevel@tonic-gate 2327c478bd9Sstevel@tonic-gate result = db2_error_to_smdb(db->close(db, 0)); 2337c478bd9Sstevel@tonic-gate if (db2->smdb2_lock_fd != -1) 2347c478bd9Sstevel@tonic-gate close(db2->smdb2_lock_fd); 2357c478bd9Sstevel@tonic-gate 2367c478bd9Sstevel@tonic-gate free(db2); 2377c478bd9Sstevel@tonic-gate database->smdb_impl = NULL; 2387c478bd9Sstevel@tonic-gate 2397c478bd9Sstevel@tonic-gate return result; 2407c478bd9Sstevel@tonic-gate } 2417c478bd9Sstevel@tonic-gate 2427c478bd9Sstevel@tonic-gate int 2437c478bd9Sstevel@tonic-gate smdb2_del(database, key, flags) 2447c478bd9Sstevel@tonic-gate SMDB_DATABASE *database; 2457c478bd9Sstevel@tonic-gate SMDB_DBENT *key; 2467c478bd9Sstevel@tonic-gate unsigned int flags; 2477c478bd9Sstevel@tonic-gate { 2487c478bd9Sstevel@tonic-gate DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db; 2497c478bd9Sstevel@tonic-gate DBT dbkey; 2507c478bd9Sstevel@tonic-gate 2517c478bd9Sstevel@tonic-gate (void) memset(&dbkey, '\0', sizeof dbkey); 2527c478bd9Sstevel@tonic-gate dbkey.data = key->data; 2537c478bd9Sstevel@tonic-gate dbkey.size = key->size; 2547c478bd9Sstevel@tonic-gate return db2_error_to_smdb(db->del(db, NULL, &dbkey, flags)); 2557c478bd9Sstevel@tonic-gate } 2567c478bd9Sstevel@tonic-gate 2577c478bd9Sstevel@tonic-gate int 2587c478bd9Sstevel@tonic-gate smdb2_fd(database, fd) 2597c478bd9Sstevel@tonic-gate SMDB_DATABASE *database; 2607c478bd9Sstevel@tonic-gate int *fd; 2617c478bd9Sstevel@tonic-gate { 2627c478bd9Sstevel@tonic-gate DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db; 2637c478bd9Sstevel@tonic-gate 2647c478bd9Sstevel@tonic-gate return db2_error_to_smdb(db->fd(db, fd)); 2657c478bd9Sstevel@tonic-gate } 2667c478bd9Sstevel@tonic-gate 2677c478bd9Sstevel@tonic-gate int 2687c478bd9Sstevel@tonic-gate smdb2_lockfd(database) 2697c478bd9Sstevel@tonic-gate SMDB_DATABASE *database; 2707c478bd9Sstevel@tonic-gate { 2717c478bd9Sstevel@tonic-gate SMDB_DB2_DATABASE *db2 = (SMDB_DB2_DATABASE *) database->smdb_impl; 2727c478bd9Sstevel@tonic-gate 2737c478bd9Sstevel@tonic-gate return db2->smdb2_lock_fd; 2747c478bd9Sstevel@tonic-gate } 2757c478bd9Sstevel@tonic-gate 2767c478bd9Sstevel@tonic-gate int 2777c478bd9Sstevel@tonic-gate smdb2_get(database, key, data, flags) 2787c478bd9Sstevel@tonic-gate SMDB_DATABASE *database; 2797c478bd9Sstevel@tonic-gate SMDB_DBENT *key; 2807c478bd9Sstevel@tonic-gate SMDB_DBENT *data; 2817c478bd9Sstevel@tonic-gate unsigned int flags; 2827c478bd9Sstevel@tonic-gate { 2837c478bd9Sstevel@tonic-gate int result; 2847c478bd9Sstevel@tonic-gate DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db; 2857c478bd9Sstevel@tonic-gate DBT dbkey, dbdata; 2867c478bd9Sstevel@tonic-gate 2877c478bd9Sstevel@tonic-gate (void) memset(&dbdata, '\0', sizeof dbdata); 2887c478bd9Sstevel@tonic-gate (void) memset(&dbkey, '\0', sizeof dbkey); 2897c478bd9Sstevel@tonic-gate dbkey.data = key->data; 2907c478bd9Sstevel@tonic-gate dbkey.size = key->size; 2917c478bd9Sstevel@tonic-gate 2927c478bd9Sstevel@tonic-gate result = db->get(db, NULL, &dbkey, &dbdata, flags); 2937c478bd9Sstevel@tonic-gate data->data = dbdata.data; 2947c478bd9Sstevel@tonic-gate data->size = dbdata.size; 2957c478bd9Sstevel@tonic-gate return db2_error_to_smdb(result); 2967c478bd9Sstevel@tonic-gate } 2977c478bd9Sstevel@tonic-gate 2987c478bd9Sstevel@tonic-gate int 2997c478bd9Sstevel@tonic-gate smdb2_put(database, key, data, flags) 3007c478bd9Sstevel@tonic-gate SMDB_DATABASE *database; 3017c478bd9Sstevel@tonic-gate SMDB_DBENT *key; 3027c478bd9Sstevel@tonic-gate SMDB_DBENT *data; 3037c478bd9Sstevel@tonic-gate unsigned int flags; 3047c478bd9Sstevel@tonic-gate { 3057c478bd9Sstevel@tonic-gate DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db; 3067c478bd9Sstevel@tonic-gate DBT dbkey, dbdata; 3077c478bd9Sstevel@tonic-gate 3087c478bd9Sstevel@tonic-gate (void) memset(&dbdata, '\0', sizeof dbdata); 3097c478bd9Sstevel@tonic-gate (void) memset(&dbkey, '\0', sizeof dbkey); 3107c478bd9Sstevel@tonic-gate dbkey.data = key->data; 3117c478bd9Sstevel@tonic-gate dbkey.size = key->size; 3127c478bd9Sstevel@tonic-gate dbdata.data = data->data; 3137c478bd9Sstevel@tonic-gate dbdata.size = data->size; 3147c478bd9Sstevel@tonic-gate 3157c478bd9Sstevel@tonic-gate return db2_error_to_smdb(db->put(db, NULL, &dbkey, &dbdata, 3167c478bd9Sstevel@tonic-gate smdb_put_flags_to_db2_flags(flags))); 3177c478bd9Sstevel@tonic-gate } 3187c478bd9Sstevel@tonic-gate 3197c478bd9Sstevel@tonic-gate 3207c478bd9Sstevel@tonic-gate int 3217c478bd9Sstevel@tonic-gate smdb2_set_owner(database, uid, gid) 3227c478bd9Sstevel@tonic-gate SMDB_DATABASE *database; 3237c478bd9Sstevel@tonic-gate uid_t uid; 3247c478bd9Sstevel@tonic-gate gid_t gid; 3257c478bd9Sstevel@tonic-gate { 3267c478bd9Sstevel@tonic-gate # if HASFCHOWN 3277c478bd9Sstevel@tonic-gate int fd; 3287c478bd9Sstevel@tonic-gate int result; 3297c478bd9Sstevel@tonic-gate DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db; 3307c478bd9Sstevel@tonic-gate 3317c478bd9Sstevel@tonic-gate result = db->fd(db, &fd); 3327c478bd9Sstevel@tonic-gate if (result != 0) 3337c478bd9Sstevel@tonic-gate return result; 3347c478bd9Sstevel@tonic-gate 3357c478bd9Sstevel@tonic-gate result = fchown(fd, uid, gid); 3367c478bd9Sstevel@tonic-gate if (result < 0) 3377c478bd9Sstevel@tonic-gate return errno; 3387c478bd9Sstevel@tonic-gate # endif /* HASFCHOWN */ 3397c478bd9Sstevel@tonic-gate 3407c478bd9Sstevel@tonic-gate return SMDBE_OK; 3417c478bd9Sstevel@tonic-gate } 3427c478bd9Sstevel@tonic-gate 3437c478bd9Sstevel@tonic-gate int 3447c478bd9Sstevel@tonic-gate smdb2_sync(database, flags) 3457c478bd9Sstevel@tonic-gate SMDB_DATABASE *database; 3467c478bd9Sstevel@tonic-gate unsigned int flags; 3477c478bd9Sstevel@tonic-gate { 3487c478bd9Sstevel@tonic-gate DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db; 3497c478bd9Sstevel@tonic-gate 3507c478bd9Sstevel@tonic-gate return db2_error_to_smdb(db->sync(db, flags)); 3517c478bd9Sstevel@tonic-gate } 3527c478bd9Sstevel@tonic-gate 3537c478bd9Sstevel@tonic-gate int 3547c478bd9Sstevel@tonic-gate smdb2_cursor_close(cursor) 3557c478bd9Sstevel@tonic-gate SMDB_CURSOR *cursor; 3567c478bd9Sstevel@tonic-gate { 3577c478bd9Sstevel@tonic-gate int ret; 3587c478bd9Sstevel@tonic-gate DBC *dbc = (DBC *) cursor->smdbc_impl; 3597c478bd9Sstevel@tonic-gate 3607c478bd9Sstevel@tonic-gate ret = db2_error_to_smdb(dbc->c_close(dbc)); 3617c478bd9Sstevel@tonic-gate free(cursor); 3627c478bd9Sstevel@tonic-gate return ret; 3637c478bd9Sstevel@tonic-gate } 3647c478bd9Sstevel@tonic-gate 3657c478bd9Sstevel@tonic-gate int 3667c478bd9Sstevel@tonic-gate smdb2_cursor_del(cursor, flags) 3677c478bd9Sstevel@tonic-gate SMDB_CURSOR *cursor; 3687c478bd9Sstevel@tonic-gate SMDB_FLAG flags; 3697c478bd9Sstevel@tonic-gate { 3707c478bd9Sstevel@tonic-gate DBC *dbc = (DBC *) cursor->smdbc_impl; 3717c478bd9Sstevel@tonic-gate 3727c478bd9Sstevel@tonic-gate return db2_error_to_smdb(dbc->c_del(dbc, 0)); 3737c478bd9Sstevel@tonic-gate } 3747c478bd9Sstevel@tonic-gate 3757c478bd9Sstevel@tonic-gate int 3767c478bd9Sstevel@tonic-gate smdb2_cursor_get(cursor, key, value, flags) 3777c478bd9Sstevel@tonic-gate SMDB_CURSOR *cursor; 3787c478bd9Sstevel@tonic-gate SMDB_DBENT *key; 3797c478bd9Sstevel@tonic-gate SMDB_DBENT *value; 3807c478bd9Sstevel@tonic-gate SMDB_FLAG flags; 3817c478bd9Sstevel@tonic-gate { 3827c478bd9Sstevel@tonic-gate int db2_flags; 3837c478bd9Sstevel@tonic-gate int result; 3847c478bd9Sstevel@tonic-gate DBC *dbc = (DBC *) cursor->smdbc_impl; 3857c478bd9Sstevel@tonic-gate DBT dbkey, dbdata; 3867c478bd9Sstevel@tonic-gate 3877c478bd9Sstevel@tonic-gate (void) memset(&dbdata, '\0', sizeof dbdata); 3887c478bd9Sstevel@tonic-gate (void) memset(&dbkey, '\0', sizeof dbkey); 3897c478bd9Sstevel@tonic-gate 3907c478bd9Sstevel@tonic-gate db2_flags = smdb_cursor_get_flags_to_db2(flags); 3917c478bd9Sstevel@tonic-gate result = dbc->c_get(dbc, &dbkey, &dbdata, db2_flags); 3927c478bd9Sstevel@tonic-gate if (result == DB_NOTFOUND) 3937c478bd9Sstevel@tonic-gate return SMDBE_LAST_ENTRY; 3947c478bd9Sstevel@tonic-gate key->data = dbkey.data; 3957c478bd9Sstevel@tonic-gate key->size = dbkey.size; 3967c478bd9Sstevel@tonic-gate value->data = dbdata.data; 3977c478bd9Sstevel@tonic-gate value->size = dbdata.size; 3987c478bd9Sstevel@tonic-gate return db2_error_to_smdb(result); 3997c478bd9Sstevel@tonic-gate } 4007c478bd9Sstevel@tonic-gate 4017c478bd9Sstevel@tonic-gate int 4027c478bd9Sstevel@tonic-gate smdb2_cursor_put(cursor, key, value, flags) 4037c478bd9Sstevel@tonic-gate SMDB_CURSOR *cursor; 4047c478bd9Sstevel@tonic-gate SMDB_DBENT *key; 4057c478bd9Sstevel@tonic-gate SMDB_DBENT *value; 4067c478bd9Sstevel@tonic-gate SMDB_FLAG flags; 4077c478bd9Sstevel@tonic-gate { 4087c478bd9Sstevel@tonic-gate DBC *dbc = (DBC *) cursor->smdbc_impl; 4097c478bd9Sstevel@tonic-gate DBT dbkey, dbdata; 4107c478bd9Sstevel@tonic-gate 4117c478bd9Sstevel@tonic-gate (void) memset(&dbdata, '\0', sizeof dbdata); 4127c478bd9Sstevel@tonic-gate (void) memset(&dbkey, '\0', sizeof dbkey); 4137c478bd9Sstevel@tonic-gate dbkey.data = key->data; 4147c478bd9Sstevel@tonic-gate dbkey.size = key->size; 4157c478bd9Sstevel@tonic-gate dbdata.data = value->data; 4167c478bd9Sstevel@tonic-gate dbdata.size = value->size; 4177c478bd9Sstevel@tonic-gate 4187c478bd9Sstevel@tonic-gate return db2_error_to_smdb(dbc->c_put(dbc, &dbkey, &dbdata, 0)); 4197c478bd9Sstevel@tonic-gate } 4207c478bd9Sstevel@tonic-gate 4217c478bd9Sstevel@tonic-gate int 4227c478bd9Sstevel@tonic-gate smdb2_cursor(database, cursor, flags) 4237c478bd9Sstevel@tonic-gate SMDB_DATABASE *database; 4247c478bd9Sstevel@tonic-gate SMDB_CURSOR **cursor; 4257c478bd9Sstevel@tonic-gate SMDB_FLAG flags; 4267c478bd9Sstevel@tonic-gate { 4277c478bd9Sstevel@tonic-gate int result; 4287c478bd9Sstevel@tonic-gate DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db; 4297c478bd9Sstevel@tonic-gate DBC *db2_cursor; 4307c478bd9Sstevel@tonic-gate 4317c478bd9Sstevel@tonic-gate # if DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >= 6 4327c478bd9Sstevel@tonic-gate result = db->cursor(db, NULL, &db2_cursor, 0); 4337c478bd9Sstevel@tonic-gate # else /* DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >= 6 */ 4347c478bd9Sstevel@tonic-gate result = db->cursor(db, NULL, &db2_cursor); 4357c478bd9Sstevel@tonic-gate # endif /* DB_VERSION_MAJOR > 2 || DB_VERSION_MINOR >= 6 */ 4367c478bd9Sstevel@tonic-gate if (result != 0) 4377c478bd9Sstevel@tonic-gate return db2_error_to_smdb(result); 4387c478bd9Sstevel@tonic-gate 4397c478bd9Sstevel@tonic-gate *cursor = (SMDB_CURSOR *) malloc(sizeof(SMDB_CURSOR)); 4407c478bd9Sstevel@tonic-gate if (*cursor == NULL) 4417c478bd9Sstevel@tonic-gate return SMDBE_MALLOC; 4427c478bd9Sstevel@tonic-gate 4437c478bd9Sstevel@tonic-gate (*cursor)->smdbc_close = smdb2_cursor_close; 4447c478bd9Sstevel@tonic-gate (*cursor)->smdbc_del = smdb2_cursor_del; 4457c478bd9Sstevel@tonic-gate (*cursor)->smdbc_get = smdb2_cursor_get; 4467c478bd9Sstevel@tonic-gate (*cursor)->smdbc_put = smdb2_cursor_put; 4477c478bd9Sstevel@tonic-gate (*cursor)->smdbc_impl = db2_cursor; 4487c478bd9Sstevel@tonic-gate 4497c478bd9Sstevel@tonic-gate return SMDBE_OK; 4507c478bd9Sstevel@tonic-gate } 4517c478bd9Sstevel@tonic-gate 4527c478bd9Sstevel@tonic-gate # if DB_VERSION_MAJOR == 2 4537c478bd9Sstevel@tonic-gate static int 4547c478bd9Sstevel@tonic-gate smdb_db_open_internal(db_name, db_type, db_flags, db_params, db) 4557c478bd9Sstevel@tonic-gate char *db_name; 4567c478bd9Sstevel@tonic-gate DBTYPE db_type; 4577c478bd9Sstevel@tonic-gate int db_flags; 4587c478bd9Sstevel@tonic-gate SMDB_DBPARAMS *db_params; 4597c478bd9Sstevel@tonic-gate DB **db; 4607c478bd9Sstevel@tonic-gate { 4617c478bd9Sstevel@tonic-gate void *params; 4627c478bd9Sstevel@tonic-gate DB_INFO db_info; 4637c478bd9Sstevel@tonic-gate 4647c478bd9Sstevel@tonic-gate params = NULL; 4657c478bd9Sstevel@tonic-gate (void) memset(&db_info, '\0', sizeof db_info); 4667c478bd9Sstevel@tonic-gate if (db_params != NULL) 4677c478bd9Sstevel@tonic-gate { 4687c478bd9Sstevel@tonic-gate db_info.db_cachesize = db_params->smdbp_cache_size; 4697c478bd9Sstevel@tonic-gate if (db_type == DB_HASH) 4707c478bd9Sstevel@tonic-gate db_info.h_nelem = db_params->smdbp_num_elements; 4717c478bd9Sstevel@tonic-gate if (db_params->smdbp_allow_dup) 4727c478bd9Sstevel@tonic-gate db_info.flags |= DB_DUP; 4737c478bd9Sstevel@tonic-gate params = &db_info; 4747c478bd9Sstevel@tonic-gate } 4757c478bd9Sstevel@tonic-gate return db_open(db_name, db_type, db_flags, DBMMODE, NULL, params, db); 4767c478bd9Sstevel@tonic-gate } 4777c478bd9Sstevel@tonic-gate # endif /* DB_VERSION_MAJOR == 2 */ 4787c478bd9Sstevel@tonic-gate 4797c478bd9Sstevel@tonic-gate # if DB_VERSION_MAJOR > 2 4807c478bd9Sstevel@tonic-gate static int 4817c478bd9Sstevel@tonic-gate smdb_db_open_internal(db_name, db_type, db_flags, db_params, db) 4827c478bd9Sstevel@tonic-gate char *db_name; 4837c478bd9Sstevel@tonic-gate DBTYPE db_type; 4847c478bd9Sstevel@tonic-gate int db_flags; 4857c478bd9Sstevel@tonic-gate SMDB_DBPARAMS *db_params; 4867c478bd9Sstevel@tonic-gate DB **db; 4877c478bd9Sstevel@tonic-gate { 4887c478bd9Sstevel@tonic-gate int result; 4897c478bd9Sstevel@tonic-gate 4907c478bd9Sstevel@tonic-gate result = db_create(db, NULL, 0); 4917c478bd9Sstevel@tonic-gate if (result != 0 || *db == NULL) 4927c478bd9Sstevel@tonic-gate return result; 4937c478bd9Sstevel@tonic-gate 4947c478bd9Sstevel@tonic-gate if (db_params != NULL) 4957c478bd9Sstevel@tonic-gate { 4967c478bd9Sstevel@tonic-gate result = (*db)->set_cachesize(*db, 0, 4977c478bd9Sstevel@tonic-gate db_params->smdbp_cache_size, 0); 4987c478bd9Sstevel@tonic-gate if (result != 0) 4997c478bd9Sstevel@tonic-gate { 5007c478bd9Sstevel@tonic-gate (void) (*db)->close((*db), 0); 5017c478bd9Sstevel@tonic-gate *db = NULL; 5027c478bd9Sstevel@tonic-gate return db2_error_to_smdb(result); 5037c478bd9Sstevel@tonic-gate } 5047c478bd9Sstevel@tonic-gate if (db_type == DB_HASH) 5057c478bd9Sstevel@tonic-gate { 5067c478bd9Sstevel@tonic-gate result = (*db)->set_h_nelem(*db, db_params->smdbp_num_elements); 5077c478bd9Sstevel@tonic-gate if (result != 0) 5087c478bd9Sstevel@tonic-gate { 5097c478bd9Sstevel@tonic-gate (void) (*db)->close(*db, 0); 5107c478bd9Sstevel@tonic-gate *db = NULL; 5117c478bd9Sstevel@tonic-gate return db2_error_to_smdb(result); 5127c478bd9Sstevel@tonic-gate } 5137c478bd9Sstevel@tonic-gate } 5147c478bd9Sstevel@tonic-gate if (db_params->smdbp_allow_dup) 5157c478bd9Sstevel@tonic-gate { 5167c478bd9Sstevel@tonic-gate result = (*db)->set_flags(*db, DB_DUP); 5177c478bd9Sstevel@tonic-gate if (result != 0) 5187c478bd9Sstevel@tonic-gate { 5197c478bd9Sstevel@tonic-gate (void) (*db)->close(*db, 0); 5207c478bd9Sstevel@tonic-gate *db = NULL; 5217c478bd9Sstevel@tonic-gate return db2_error_to_smdb(result); 5227c478bd9Sstevel@tonic-gate } 5237c478bd9Sstevel@tonic-gate } 5247c478bd9Sstevel@tonic-gate } 5257c478bd9Sstevel@tonic-gate 5267c478bd9Sstevel@tonic-gate result = (*db)->open(*db, 5277c478bd9Sstevel@tonic-gate DBTXN /* transaction for DB 4.1 */ 5287c478bd9Sstevel@tonic-gate db_name, NULL, db_type, db_flags, DBMMODE); 5297c478bd9Sstevel@tonic-gate if (result != 0) 5307c478bd9Sstevel@tonic-gate { 5317c478bd9Sstevel@tonic-gate (void) (*db)->close(*db, 0); 5327c478bd9Sstevel@tonic-gate *db = NULL; 5337c478bd9Sstevel@tonic-gate } 5347c478bd9Sstevel@tonic-gate return db2_error_to_smdb(result); 5357c478bd9Sstevel@tonic-gate } 5367c478bd9Sstevel@tonic-gate # endif /* DB_VERSION_MAJOR > 2 */ 5377c478bd9Sstevel@tonic-gate /* 5387c478bd9Sstevel@tonic-gate ** SMDB_DB_OPEN -- Opens a db database. 5397c478bd9Sstevel@tonic-gate ** 5407c478bd9Sstevel@tonic-gate ** Parameters: 5417c478bd9Sstevel@tonic-gate ** database -- An unallocated database pointer to a pointer. 5427c478bd9Sstevel@tonic-gate ** db_name -- The name of the database without extension. 5437c478bd9Sstevel@tonic-gate ** mode -- File permisions for a created database. 5447c478bd9Sstevel@tonic-gate ** mode_mask -- Mode bits that must match on an opened database. 5457c478bd9Sstevel@tonic-gate ** sff -- Flags for safefile. 5467c478bd9Sstevel@tonic-gate ** type -- The type of database to open 5477c478bd9Sstevel@tonic-gate ** See smdb_type_to_db2_type for valid types. 5487c478bd9Sstevel@tonic-gate ** user_info -- User information for file permissions. 5497c478bd9Sstevel@tonic-gate ** db_params -- 5507c478bd9Sstevel@tonic-gate ** An SMDB_DBPARAMS struct including params. These 5517c478bd9Sstevel@tonic-gate ** are processed according to the type of the 5527c478bd9Sstevel@tonic-gate ** database. Currently supported params (only for 5537c478bd9Sstevel@tonic-gate ** HASH type) are: 5547c478bd9Sstevel@tonic-gate ** num_elements 5557c478bd9Sstevel@tonic-gate ** cache_size 5567c478bd9Sstevel@tonic-gate ** 5577c478bd9Sstevel@tonic-gate ** Returns: 5587c478bd9Sstevel@tonic-gate ** SMDBE_OK -- Success, other errno: 5597c478bd9Sstevel@tonic-gate ** SMDBE_MALLOC -- Cannot allocate memory. 5607c478bd9Sstevel@tonic-gate ** SMDBE_BAD_OPEN -- db_open didn't return an error, but 5617c478bd9Sstevel@tonic-gate ** somehow the DB pointer is NULL. 5627c478bd9Sstevel@tonic-gate ** Anything else: translated error from db2 5637c478bd9Sstevel@tonic-gate */ 5647c478bd9Sstevel@tonic-gate 5657c478bd9Sstevel@tonic-gate int 5667c478bd9Sstevel@tonic-gate smdb_db_open(database, db_name, mode, mode_mask, sff, type, user_info, db_params) 5677c478bd9Sstevel@tonic-gate SMDB_DATABASE **database; 5687c478bd9Sstevel@tonic-gate char *db_name; 5697c478bd9Sstevel@tonic-gate int mode; 5707c478bd9Sstevel@tonic-gate int mode_mask; 5717c478bd9Sstevel@tonic-gate long sff; 5727c478bd9Sstevel@tonic-gate SMDB_DBTYPE type; 5737c478bd9Sstevel@tonic-gate SMDB_USER_INFO *user_info; 5747c478bd9Sstevel@tonic-gate SMDB_DBPARAMS *db_params; 5757c478bd9Sstevel@tonic-gate { 5767c478bd9Sstevel@tonic-gate bool lockcreated = false; 5777c478bd9Sstevel@tonic-gate int result; 5787c478bd9Sstevel@tonic-gate int db_flags; 5797c478bd9Sstevel@tonic-gate int lock_fd; 5807c478bd9Sstevel@tonic-gate int db_fd; 5817c478bd9Sstevel@tonic-gate int major_v, minor_v, patch_v; 5827c478bd9Sstevel@tonic-gate SMDB_DATABASE *smdb_db; 5837c478bd9Sstevel@tonic-gate SMDB_DB2_DATABASE *db2; 5847c478bd9Sstevel@tonic-gate DB *db; 5857c478bd9Sstevel@tonic-gate DBTYPE db_type; 5867c478bd9Sstevel@tonic-gate struct stat stat_info; 5877c478bd9Sstevel@tonic-gate char db_file_name[MAXPATHLEN]; 5887c478bd9Sstevel@tonic-gate 5897c478bd9Sstevel@tonic-gate (void) db_version(&major_v, &minor_v, &patch_v); 5907c478bd9Sstevel@tonic-gate if (major_v != DB_VERSION_MAJOR || minor_v != DB_VERSION_MINOR) 5917c478bd9Sstevel@tonic-gate return SMDBE_VERSION_MISMATCH; 5927c478bd9Sstevel@tonic-gate 5937c478bd9Sstevel@tonic-gate *database = NULL; 5947c478bd9Sstevel@tonic-gate 5957c478bd9Sstevel@tonic-gate result = smdb_add_extension(db_file_name, sizeof db_file_name, 5967c478bd9Sstevel@tonic-gate db_name, SMDB2_FILE_EXTENSION); 5977c478bd9Sstevel@tonic-gate if (result != SMDBE_OK) 5987c478bd9Sstevel@tonic-gate return result; 5997c478bd9Sstevel@tonic-gate 6007c478bd9Sstevel@tonic-gate result = smdb_setup_file(db_name, SMDB2_FILE_EXTENSION, 6017c478bd9Sstevel@tonic-gate mode_mask, sff, user_info, &stat_info); 6027c478bd9Sstevel@tonic-gate if (result != SMDBE_OK) 6037c478bd9Sstevel@tonic-gate return result; 6047c478bd9Sstevel@tonic-gate 6057c478bd9Sstevel@tonic-gate lock_fd = -1; 6067c478bd9Sstevel@tonic-gate 6077c478bd9Sstevel@tonic-gate if (stat_info.st_mode == ST_MODE_NOFILE && 6087c478bd9Sstevel@tonic-gate bitset(mode, O_CREAT)) 6097c478bd9Sstevel@tonic-gate lockcreated = true; 6107c478bd9Sstevel@tonic-gate 6117c478bd9Sstevel@tonic-gate result = smdb_lock_file(&lock_fd, db_name, mode, sff, 6127c478bd9Sstevel@tonic-gate SMDB2_FILE_EXTENSION); 6137c478bd9Sstevel@tonic-gate if (result != SMDBE_OK) 6147c478bd9Sstevel@tonic-gate return result; 6157c478bd9Sstevel@tonic-gate 6167c478bd9Sstevel@tonic-gate if (lockcreated) 6177c478bd9Sstevel@tonic-gate { 6187c478bd9Sstevel@tonic-gate mode |= O_TRUNC; 6197c478bd9Sstevel@tonic-gate mode &= ~(O_CREAT|O_EXCL); 6207c478bd9Sstevel@tonic-gate } 6217c478bd9Sstevel@tonic-gate 6227c478bd9Sstevel@tonic-gate smdb_db = smdb_malloc_database(); 6237c478bd9Sstevel@tonic-gate db2 = smdb2_malloc_database(); 624*e9af4bc0SJohn Beck if (db2 == NULL || smdb_db == NULL) 625*e9af4bc0SJohn Beck { 626*e9af4bc0SJohn Beck smdb_unlock_file(lock_fd); 627*e9af4bc0SJohn Beck smdb_free_database(smdb_db); /* ok to be NULL */ 6287c478bd9Sstevel@tonic-gate return SMDBE_MALLOC; 629*e9af4bc0SJohn Beck } 6307c478bd9Sstevel@tonic-gate 6317c478bd9Sstevel@tonic-gate db2->smdb2_lock_fd = lock_fd; 6327c478bd9Sstevel@tonic-gate 6337c478bd9Sstevel@tonic-gate db_type = smdb_type_to_db2_type(type); 6347c478bd9Sstevel@tonic-gate 6357c478bd9Sstevel@tonic-gate db = NULL; 6367c478bd9Sstevel@tonic-gate 6377c478bd9Sstevel@tonic-gate db_flags = 0; 6387c478bd9Sstevel@tonic-gate if (bitset(O_CREAT, mode)) 6397c478bd9Sstevel@tonic-gate db_flags |= DB_CREATE; 6407c478bd9Sstevel@tonic-gate if (bitset(O_TRUNC, mode)) 6417c478bd9Sstevel@tonic-gate db_flags |= DB_TRUNCATE; 6427c478bd9Sstevel@tonic-gate if (mode == O_RDONLY) 6437c478bd9Sstevel@tonic-gate db_flags |= DB_RDONLY; 6447c478bd9Sstevel@tonic-gate SM_DB_FLAG_ADD(db_flags); 6457c478bd9Sstevel@tonic-gate 6467c478bd9Sstevel@tonic-gate result = smdb_db_open_internal(db_file_name, db_type, 6477c478bd9Sstevel@tonic-gate db_flags, db_params, &db); 6487c478bd9Sstevel@tonic-gate 6497c478bd9Sstevel@tonic-gate if (result == 0 && db != NULL) 6507c478bd9Sstevel@tonic-gate { 6517c478bd9Sstevel@tonic-gate result = db->fd(db, &db_fd); 6527c478bd9Sstevel@tonic-gate if (result == 0) 6537c478bd9Sstevel@tonic-gate result = SMDBE_OK; 6547c478bd9Sstevel@tonic-gate } 6557c478bd9Sstevel@tonic-gate else 6567c478bd9Sstevel@tonic-gate { 6577c478bd9Sstevel@tonic-gate /* Try and narrow down on the problem */ 6587c478bd9Sstevel@tonic-gate if (result != 0) 6597c478bd9Sstevel@tonic-gate result = db2_error_to_smdb(result); 6607c478bd9Sstevel@tonic-gate else 6617c478bd9Sstevel@tonic-gate result = SMDBE_BAD_OPEN; 6627c478bd9Sstevel@tonic-gate } 6637c478bd9Sstevel@tonic-gate 6647c478bd9Sstevel@tonic-gate if (result == SMDBE_OK) 6657c478bd9Sstevel@tonic-gate result = smdb_filechanged(db_name, SMDB2_FILE_EXTENSION, db_fd, 6667c478bd9Sstevel@tonic-gate &stat_info); 6677c478bd9Sstevel@tonic-gate 6687c478bd9Sstevel@tonic-gate if (result == SMDBE_OK) 6697c478bd9Sstevel@tonic-gate { 6707c478bd9Sstevel@tonic-gate /* Everything is ok. Setup driver */ 6717c478bd9Sstevel@tonic-gate db2->smdb2_db = db; 6727c478bd9Sstevel@tonic-gate 6737c478bd9Sstevel@tonic-gate smdb_db->smdb_close = smdb2_close; 6747c478bd9Sstevel@tonic-gate smdb_db->smdb_del = smdb2_del; 6757c478bd9Sstevel@tonic-gate smdb_db->smdb_fd = smdb2_fd; 6767c478bd9Sstevel@tonic-gate smdb_db->smdb_lockfd = smdb2_lockfd; 6777c478bd9Sstevel@tonic-gate smdb_db->smdb_get = smdb2_get; 6787c478bd9Sstevel@tonic-gate smdb_db->smdb_put = smdb2_put; 6797c478bd9Sstevel@tonic-gate smdb_db->smdb_set_owner = smdb2_set_owner; 6807c478bd9Sstevel@tonic-gate smdb_db->smdb_sync = smdb2_sync; 6817c478bd9Sstevel@tonic-gate smdb_db->smdb_cursor = smdb2_cursor; 6827c478bd9Sstevel@tonic-gate smdb_db->smdb_impl = db2; 6837c478bd9Sstevel@tonic-gate 6847c478bd9Sstevel@tonic-gate *database = smdb_db; 6857c478bd9Sstevel@tonic-gate 6867c478bd9Sstevel@tonic-gate return SMDBE_OK; 6877c478bd9Sstevel@tonic-gate } 6887c478bd9Sstevel@tonic-gate 6897c478bd9Sstevel@tonic-gate if (db != NULL) 6907c478bd9Sstevel@tonic-gate db->close(db, 0); 6917c478bd9Sstevel@tonic-gate 6927c478bd9Sstevel@tonic-gate smdb_unlock_file(db2->smdb2_lock_fd); 6937c478bd9Sstevel@tonic-gate free(db2); 6947c478bd9Sstevel@tonic-gate smdb_free_database(smdb_db); 6957c478bd9Sstevel@tonic-gate 6967c478bd9Sstevel@tonic-gate return result; 6977c478bd9Sstevel@tonic-gate } 6987c478bd9Sstevel@tonic-gate 6997c478bd9Sstevel@tonic-gate #endif /* (DB_VERSION_MAJOR >= 2) */ 700