tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

db.c (4442B)


      1 /*-
      2 * Copyright (c) 1991, 1993
      3 *  The Regents of the University of California.  All rights reserved.
      4 *
      5 * Redistribution and use in source and binary forms, with or without
      6 * modification, are permitted provided that the following conditions
      7 * are met:
      8 * 1. Redistributions of source code must retain the above copyright
      9 *    notice, this list of conditions and the following disclaimer.
     10 * 2. Redistributions in binary form must reproduce the above copyright
     11 *    notice, this list of conditions and the following disclaimer in the
     12 *    documentation and/or other materials provided with the distribution.
     13 * 3. ***REMOVED*** - see
     14 *    ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
     15 * 4. Neither the name of the University nor the names of its contributors
     16 *    may be used to endorse or promote products derived from this software
     17 *    without specific prior written permission.
     18 *
     19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     29 * SUCH DAMAGE.
     30 */
     31 
     32 #if defined(LIBC_SCCS) && !defined(lint)
     33 static char sccsid[] = "@(#)db.c    8.4 (Berkeley) 2/21/94";
     34 #endif /* LIBC_SCCS and not lint */
     35 
     36 #ifndef __DBINTERFACE_PRIVATE
     37 #define __DBINTERFACE_PRIVATE
     38 #endif
     39 #ifdef macintosh
     40 #include <unix.h>
     41 #else
     42 #include <sys/types.h>
     43 #endif
     44 
     45 #include <errno.h>
     46 #include <fcntl.h>
     47 #include <stddef.h>
     48 #include <stdio.h>
     49 
     50 #include "mcom_db.h"
     51 
     52 /* a global flag that locks closed all databases */
     53 int all_databases_locked_closed = 0;
     54 
     55 /* set or unset a global lock flag to disable the
     56 * opening of any DBM file
     57 */
     58 void
     59 dbSetOrClearDBLock(DBLockFlagEnum type)
     60 {
     61    if (type == LockOutDatabase)
     62        all_databases_locked_closed = 1;
     63    else
     64        all_databases_locked_closed = 0;
     65 }
     66 
     67 DB *
     68 dbopen(const char *fname, int flags, int mode, DBTYPE type, const void *openinfo)
     69 {
     70 
     71    /* lock out all file databases.  Let in-memory databases through
     72     */
     73    if (all_databases_locked_closed && fname) {
     74        errno = EINVAL;
     75        return (NULL);
     76    }
     77 
     78 #define DB_FLAGS (DB_LOCK | DB_SHMEM | DB_TXN)
     79 
     80 #if 0 /* most systems don't have EXLOCK and SHLOCK */
     81 #define USE_OPEN_FLAGS                                     \
     82    (O_CREAT | O_EXCL | O_EXLOCK | O_NONBLOCK | O_RDONLY | \
     83     O_RDWR | O_SHLOCK | O_TRUNC)
     84 #else
     85 #define USE_OPEN_FLAGS             \
     86    (O_CREAT | O_EXCL | O_RDONLY | \
     87     O_RDWR | O_TRUNC)
     88 #endif
     89 
     90    if ((flags & ~(USE_OPEN_FLAGS | DB_FLAGS)) == 0)
     91        switch (type) {
     92 /* we don't need btree and recno right now */
     93 #if 0
     94            case DB_BTREE:
     95                return (dbm_bt_open(fname, flags & USE_OPEN_FLAGS,
     96                    mode, openinfo, flags & DB_FLAGS));
     97            case DB_RECNO:
     98                return (dbm_rec_open(fname, flags & USE_OPEN_FLAGS,
     99                    mode, openinfo, flags & DB_FLAGS));
    100 #endif
    101 
    102            case DB_HASH:
    103                return (dbm_hash_open(fname, flags & USE_OPEN_FLAGS,
    104                                      mode, (const HASHINFO *)openinfo, flags & DB_FLAGS));
    105            default:
    106                break;
    107        }
    108    errno = EINVAL;
    109    return (NULL);
    110 }
    111 
    112 static int
    113 dbm_dberr()
    114 {
    115    return (RET_ERROR);
    116 }
    117 
    118 /*
    119 * __DBPANIC -- Stop.
    120 *
    121 * Parameters:
    122 *  dbp:    pointer to the DB structure.
    123 */
    124 void
    125 dbm_dbpanic(DB *dbp)
    126 {
    127    /* The only thing that can succeed is a close. */
    128    dbp->del = (int (*)(const struct dbm_db *, const DBT *, uint))dbm_dberr;
    129    dbp->fd = (int (*)(const struct dbm_db *))dbm_dberr;
    130    dbp->get = (int (*)(const struct dbm_db *, const DBT *, DBT *, uint))dbm_dberr;
    131    dbp->put = (int (*)(const struct dbm_db *, DBT *, const DBT *, uint))dbm_dberr;
    132    dbp->seq = (int (*)(const struct dbm_db *, DBT *, DBT *, uint))dbm_dberr;
    133    dbp->sync = (int (*)(const struct dbm_db *, uint))dbm_dberr;
    134 }