亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? gdbmopen.c

?? 這是一個(gè)mp3的源代碼
?? C
字號:
/* gdbmopen.c - Open the dbm file and initialize data structures for use. */

/*  This file is part of GDBM, the GNU data base manager, by Philip A. Nelson.
    Copyright (C) 1990, 1991, 1993  Free Software Foundation, Inc.

    GDBM is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2, or (at your option)
    any later version.

    GDBM is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with GDBM; see the file COPYING.  If not, write to
    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

    You may contact the author by:
       e-mail:  phil@cs.wwu.edu
      us-mail:  Philip A. Nelson
                Computer Science Department
                Western Washington University
                Bellingham, WA 98226
       
*************************************************************************/


/* include system configuration before all else. */
#include "config.h"

#include "gdbmdefs.h"
#include "gdbmerrno.h"

/* Initialize dbm system.  FILE is a pointer to the file name.  If the file
   has a size of zero bytes, a file initialization procedure is performed,
   setting up the initial structure in the file.  BLOCK_SIZE is used during
   initialization to determine the size of various constructs.  If the value
   is less than 512, the file system blocksize is used, otherwise the value
   of BLOCK_SIZE is used.  BLOCK_SIZE is ignored if the file has previously
   initialized.  If FLAGS is set to GDBM_READ the user wants to just
   read the database and any call to dbm_store or dbm_delete will fail. Many
   readers can access the database at the same time.  If FLAGS is set to
   GDBM_WRITE, the user wants both read and write access to the database and
   requires exclusive access.  If FLAGS is GDBM_WRCREAT, the user wants
   both read and write access to the database and if the database does not
   exist, create a new one.  If FLAGS is GDBM_NEWDB, the user want a
   new database created, regardless of whether one existed, and wants read
   and write access to the new database.  Any error detected will cause a 
   return value of null and an approprate value will be in gdbm_errno.  If
   no errors occur, a pointer to the "gdbm file descriptor" will be
   returned. */
   

gdbm_file_info *
gdbm_open (file, block_size, flags, mode, fatal_func)
     char *file;
     int  block_size;
     int  flags;
     int  mode;
     void (*fatal_func) ();
{
  gdbm_file_info *dbf;		/* The record to return. */
  struct stat file_stat;	/* Space for the stat information. */
  int         len;		/* Length of the file name. */
  int         num_bytes;	/* Used in reading and writing. */
  off_t       file_pos;		/* Used with seeks. */
  int	      lock_val;         /* Returned by the flock call. */
  int	      file_block_size;	/* Block size to use for a new file. */
  int 	      index;		/* Used as a loop index. */
  char        need_trunc;	/* Used with GDBM_NEWDB and locking to avoid
				   truncating a file from under a reader. */

  /* Initialize the gdbm_errno variable. */
  gdbm_errno = GDBM_NO_ERROR;

  /* Allocate new info structure. */
  dbf = (gdbm_file_info *) malloc (sizeof (gdbm_file_info));
  if (dbf == NULL)
    {
      gdbm_errno = GDBM_MALLOC_ERROR;
      return NULL;
    }

  /* Initialize some fields for known values.  This is done so gdbm_close
     will work if called before allocating some structures. */
  dbf->dir  = NULL;
  dbf->bucket = NULL;
  dbf->header = NULL;
  dbf->bucket_cache = NULL;
  dbf->cache_size = 0;
  
  /* Save name of file. */
  len = strlen (file);
  dbf->name = (char *) malloc (len + 1);
  if (dbf->name == NULL)
    {
      free (dbf);
      gdbm_errno = GDBM_MALLOC_ERROR;
      return NULL;
    }
  strcpy (dbf->name, file);

  /* Initialize the fatal error routine. */
  dbf->fatal_err = fatal_func;

  dbf->fast_write = TRUE;	/* Default to setting fast_write. */
  dbf->file_locking = TRUE;	/* Default to doing file locking. */
  dbf->central_free = FALSE;	/* Default to not using central_free. */
  dbf->coalesce_blocks = FALSE; /* Default to not coalescing blocks. */

  /* GDBM_FAST used to determine whethere or not we set fast_write. */
  if (flags & GDBM_SYNC)
    {
      /* If GDBM_SYNC has been requested, don't do fast_write. */
      dbf->fast_write = FALSE;
    }
  if (flags & GDBM_NOLOCK)
    {
      dbf->file_locking = FALSE;
    }

  /* Open the file. */
  need_trunc = FALSE;
  switch (flags & GDBM_OPENMASK)
    {
      case GDBM_READER:
	dbf->desc = open (dbf->name, O_RDONLY, 0);
	break;

      case GDBM_OPENMASK:
	dbf->desc = open (dbf->name, O_RDWR, 0);
	break;

      case GDBM_NEWDB:
	dbf->desc = open (dbf->name, O_RDWR|O_CREAT, mode);
	flags = GDBM_WRITER;
	need_trunc = TRUE;
	break;

      default:
	dbf->desc = open (dbf->name, O_RDWR|O_CREAT, mode);
	flags = GDBM_WRITER;
	break;

    }
  if (dbf->desc < 0)
    {
      free (dbf->name);
      free (dbf);
      gdbm_errno = GDBM_FILE_OPEN_ERROR;
      return NULL;
    }

  /* Get the status of the file. */
  fstat (dbf->desc, &file_stat);

  /* Lock the file in the approprate way. */
  if ((flags & GDBM_OPENMASK) == GDBM_READER)
    {
      if (file_stat.st_size == 0)
	{
	  close (dbf->desc);
	  free (dbf->name);
	  free (dbf);
	  gdbm_errno = GDBM_EMPTY_DATABASE;
	  return NULL;
	}
      if (dbf->file_locking)
	{
          /* Sets lock_val to 0 for success.  See systems.h. */
          READLOCK_FILE(dbf);
	}
    }
  else if (dbf->file_locking)
    {
      /* Sets lock_val to 0 for success.  See systems.h. */
      WRITELOCK_FILE(dbf);
    }
  if (dbf->file_locking && (lock_val != 0))
    {
      close (dbf->desc);
      free (dbf->name);
      free (dbf);
      if ((flags & GDBM_OPENMASK) == GDBM_READER)
	gdbm_errno = GDBM_CANT_BE_READER;
      else
	gdbm_errno = GDBM_CANT_BE_WRITER;
      return NULL;
    }

  /* Record the kind of user. */
  dbf->read_write = (flags & GDBM_OPENMASK);

  /* If we do have a write lock and it was a GDBM_NEWDB, it is 
     now time to truncate the file. */
  if (need_trunc && file_stat.st_size != 0)
    {
      TRUNCATE (dbf);
      fstat (dbf->desc, &file_stat);
    }

  /* Decide if this is a new file or an old file. */
  if (file_stat.st_size == 0)
    {

      /* This is a new file.  Create an empty database.  */

      /* Start with the blocksize. */
      if (block_size < 512)
	file_block_size = STATBLKSIZE;
      else
	file_block_size = block_size;

      /* Get space for the file header. */
      dbf->header = (gdbm_file_header *) malloc (file_block_size);
      if (dbf->header == NULL)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_MALLOC_ERROR;
	  return NULL;
	}

      /* Set the magic number and the block_size. */
      dbf->header->header_magic = 0x13579ace;
      dbf->header->block_size = file_block_size;
     
      /* Create the initial hash table directory.  */
      dbf->header->dir_size = 8 * sizeof (off_t);
      dbf->header->dir_bits = 3;
      while (dbf->header->dir_size < dbf->header->block_size)
	{
	  dbf->header->dir_size <<= 1;
	  dbf->header->dir_bits += 1;
	}

      /* Check for correct block_size. */
      if (dbf->header->dir_size != dbf->header->block_size)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_BLOCK_SIZE_ERROR;
	  return NULL;
	}

      /* Allocate the space for the directory. */
      dbf->dir = (off_t *) malloc (dbf->header->dir_size);
      if (dbf->dir == NULL)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_MALLOC_ERROR;
	  return NULL;
	}
      dbf->header->dir = dbf->header->block_size;

      /* Create the first and only hash bucket. */
      dbf->header->bucket_elems =
	(dbf->header->block_size - sizeof (hash_bucket))
	/ sizeof (bucket_element) + 1;
      dbf->header->bucket_size  = dbf->header->block_size;
      dbf->bucket = (hash_bucket *) malloc (dbf->header->bucket_size);
      if (dbf->bucket == NULL)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_MALLOC_ERROR;
	  return NULL;
	}
      _gdbm_new_bucket (dbf, dbf->bucket, 0);
      dbf->bucket->av_count = 1;
      dbf->bucket->bucket_avail[0].av_adr = 3*dbf->header->block_size;
      dbf->bucket->bucket_avail[0].av_size = dbf->header->block_size;

      /* Set table entries to point to hash buckets. */
      for (index = 0; index < dbf->header->dir_size / sizeof (off_t); index++)
	dbf->dir[index] = 2*dbf->header->block_size;

      /* Initialize the active avail block. */
      dbf->header->avail.size
	= ( (dbf->header->block_size - sizeof (gdbm_file_header))
	 / sizeof (avail_elem)) + 1;
      dbf->header->avail.count = 0;
      dbf->header->avail.next_block = 0;
      dbf->header->next_block  = 4*dbf->header->block_size;

      /* Write initial configuration to the file. */
      /* Block 0 is the file header and active avail block. */
      num_bytes = write (dbf->desc, dbf->header, dbf->header->block_size);
      if (num_bytes != dbf->header->block_size)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_FILE_WRITE_ERROR;
	  return NULL;
	}

      /* Block 1 is the initial bucket directory. */
      num_bytes = write (dbf->desc, dbf->dir, dbf->header->dir_size);
      if (num_bytes != dbf->header->dir_size)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_FILE_WRITE_ERROR;
	  return NULL;
	}

      /* Block 2 is the only bucket. */
      num_bytes = write (dbf->desc, dbf->bucket, dbf->header->bucket_size);
      if (num_bytes != dbf->header->bucket_size)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_FILE_WRITE_ERROR;
	  return NULL;
	}

      /* Wait for initial configuration to be written to disk. */
      fsync (dbf->desc);

      free (dbf->bucket);
    }
  else
    {
      /* This is an old database.  Read in the information from the file
	 header and initialize the hash directory. */

      gdbm_file_header partial_header;  /* For the first part of it. */

      /* Read the partial file header. */
      num_bytes = read (dbf->desc, &partial_header, sizeof (gdbm_file_header));
      if (num_bytes != sizeof (gdbm_file_header))
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_FILE_READ_ERROR;
	  return NULL;
	}

      /* Is the magic number good? */
      if (partial_header.header_magic != 0x13579ace)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_BAD_MAGIC_NUMBER;
	  return NULL;
	}

      /* It is a good database, read the entire header. */
      dbf->header = (gdbm_file_header *) malloc (partial_header.block_size);
      if (dbf->header == NULL)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_MALLOC_ERROR;
	  return NULL;
	}
      memcpy (dbf->header, &partial_header, sizeof (gdbm_file_header));
      num_bytes = read (dbf->desc, &dbf->header->avail.av_table[1],
			dbf->header->block_size-sizeof (gdbm_file_header));
      if (num_bytes != dbf->header->block_size-sizeof (gdbm_file_header))
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_FILE_READ_ERROR;
	  return NULL;
	}
	
      /* Allocate space for the hash table directory.  */
      dbf->dir = (off_t *) malloc (dbf->header->dir_size);
      if (dbf->dir == NULL)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_MALLOC_ERROR;
	  return NULL;
	}

      /* Read the hash table directory. */
      file_pos = lseek (dbf->desc, dbf->header->dir, L_SET);
      if (file_pos != dbf->header->dir)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_FILE_SEEK_ERROR;
	  return NULL;
	}

      num_bytes = read (dbf->desc, dbf->dir, dbf->header->dir_size);
      if (num_bytes != dbf->header->dir_size)
	{
	  gdbm_close (dbf);
	  gdbm_errno = GDBM_FILE_READ_ERROR;
	  return NULL;
	}

    }

  /* Finish initializing dbf. */
  dbf->last_read = -1;
  dbf->bucket = NULL;
  dbf->bucket_dir = 0;
  dbf->cache_entry = NULL;
  dbf->header_changed = FALSE;
  dbf->directory_changed = FALSE;
  dbf->bucket_changed = FALSE;
  dbf->second_changed = FALSE;
  
  /* Everything is fine, return the pointer to the file
     information structure.  */
  return dbf;

}

/* initialize the bucket cache. */
int
_gdbm_init_cache(dbf, size)
    gdbm_file_info *dbf;
    int size;
{
register int index;

  if (dbf->bucket_cache == NULL)
    {
      dbf->bucket_cache = (cache_elem *) malloc(sizeof(cache_elem) * size);
      if(dbf->bucket_cache == NULL)
        {
          gdbm_errno = GDBM_MALLOC_ERROR;
          return(-1);
        }
      dbf->cache_size = size;

      for(index = 0; index < size; index++)
        {
          (dbf->bucket_cache[index]).ca_bucket
            = (hash_bucket *) malloc (dbf->header->bucket_size);
          if ((dbf->bucket_cache[index]).ca_bucket == NULL)
	    {
              gdbm_errno = GDBM_MALLOC_ERROR;
	      return(-1);
            }
          (dbf->bucket_cache[index]).ca_adr = 0;
          (dbf->bucket_cache[index]).ca_changed = FALSE;
          (dbf->bucket_cache[index]).ca_data.hash_val = -1;
          (dbf->bucket_cache[index]).ca_data.elem_loc = -1;
          (dbf->bucket_cache[index]).ca_data.dptr = NULL;
        }
      dbf->bucket = dbf->bucket_cache[0].ca_bucket;
      dbf->cache_entry = &dbf->bucket_cache[0];
    }
  return(0);
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩中文另类| 午夜精品久久久久影视| 亚洲精品一区二区在线观看| 精品视频一区二区不卡| 色婷婷综合视频在线观看| 国产成人免费视| 国产麻豆精品95视频| 韩国一区二区三区| 国产一区二区不卡在线| 国产资源精品在线观看| 国产原创一区二区| 国产一区二区按摩在线观看| 国产做a爰片久久毛片| 久久电影国产免费久久电影| 久久aⅴ国产欧美74aaa| 久久不见久久见免费视频1| 久久99蜜桃精品| 国产一区二区不卡在线| 成人三级在线视频| 色欧美88888久久久久久影院| 色婷婷久久综合| 精品视频免费在线| 欧美本精品男人aⅴ天堂| 精品国产一区二区三区久久久蜜月| 2020国产成人综合网| 国产精品久久久久三级| 亚洲女女做受ⅹxx高潮| 日韩黄色小视频| 国产一区二区在线电影| 99久久精品免费观看| 欧美无人高清视频在线观看| 欧美一区二区久久| 精品久久久久久久久久久久久久久久久 | 成人免费观看av| 91麻豆精东视频| 91精品在线免费| 欧美国产日本韩| 亚洲国产日韩精品| 国产一区二区三区黄视频 | 亚洲一级在线观看| 亚洲va欧美va人人爽午夜| 蜜桃视频免费观看一区| www.欧美.com| 日韩欧美黄色影院| 亚洲视频一二三区| 婷婷开心激情综合| 国产精品午夜久久| 亚洲第一综合色| 亚洲人成精品久久久久| 免费成人性网站| aa级大片欧美| 日韩免费观看高清完整版| 亚洲欧美日韩国产综合在线| 久久99日本精品| 欧美色区777第一页| 日本一区二区不卡视频| 日产国产欧美视频一区精品| 成人av午夜影院| 久久在线免费观看| 人人狠狠综合久久亚洲| 91国产免费观看| 国产精品麻豆久久久| 国产一区在线看| 91精品国产综合久久精品麻豆| 亚洲色图一区二区| 国产成人亚洲综合a∨婷婷图片| 狠狠色丁香久久婷婷综合丁香| 国产精品对白交换视频| 国产免费成人在线视频| 青娱乐精品在线视频| 欧美三级日韩三级| 亚洲人成在线播放网站岛国| 国产91丝袜在线播放0| 日韩欧美中文字幕制服| 日本欧洲一区二区| 欧美无砖砖区免费| 亚洲成人久久影院| 欧美日韩国产美| 亚州成人在线电影| 欧美日韩高清一区二区三区| 亚洲va中文字幕| 在线不卡中文字幕| 日韩国产精品久久久| 欧美一区二区三区白人| 日本成人在线电影网| 69堂国产成人免费视频| 免播放器亚洲一区| 精品美女在线观看| 日韩丝袜情趣美女图片| 日韩欧美中文字幕精品| 蜜臀av一区二区| 精品久久久久久亚洲综合网| 激情小说亚洲一区| 久久美女高清视频| 不卡区在线中文字幕| 1区2区3区国产精品| 在线观看av一区| 五月天激情小说综合| 日韩视频免费观看高清在线视频| 蜜臀av性久久久久av蜜臀妖精| 欧美精品一区二区在线播放| 夫妻av一区二区| 亚洲日韩欧美一区二区在线| 欧洲精品视频在线观看| 美女国产一区二区三区| 国产欧美一区二区精品婷婷| 色94色欧美sute亚洲线路二 | 国产福利一区二区| 亚洲精品网站在线观看| 91精品国产一区二区三区香蕉 | 国产精品77777竹菊影视小说| 国产亚洲欧美一级| 欧美性受xxxx黑人xyx性爽| 美女免费视频一区二区| 中文字幕在线不卡一区二区三区| 欧美伊人久久久久久久久影院 | 日本福利一区二区| 日本女人一区二区三区| 久久青草国产手机看片福利盒子 | 艳妇臀荡乳欲伦亚洲一区| 欧美伦理电影网| 一区二区三区在线视频观看58| av亚洲精华国产精华| 一区二区三区精品在线| 欧美xxxxxxxx| 波多野结衣精品在线| 亚洲色图制服诱惑 | 国产精品情趣视频| 色噜噜偷拍精品综合在线| 亚洲综合色区另类av| 欧美一二三区精品| 国产一区二区精品久久91| 亚洲人123区| 欧美刺激脚交jootjob| 99久久久精品| 日韩精品一级二级| 国产精品久久三| 日韩欧美黄色影院| 91啪九色porn原创视频在线观看| 免费观看在线综合色| 久久亚洲综合色一区二区三区| 一区二区三区在线免费视频| 91精选在线观看| 国产综合成人久久大片91| 中文字幕精品一区二区精品绿巨人| 在线观看欧美日本| 国产麻豆成人精品| 激情综合亚洲精品| 亚洲一区二区av在线| 国产丝袜美腿一区二区三区| 欧美精品99久久久**| 国产精选一区二区三区| 韩国三级电影一区二区| 亚洲3atv精品一区二区三区| 中文乱码免费一区二区| 日韩精品最新网址| 日韩一区二区三区av| 在线观看91视频| 99热99精品| 国产不卡免费视频| 久久av中文字幕片| 日韩成人精品在线观看| 亚洲超碰精品一区二区| 亚洲欧美国产毛片在线| 国产欧美1区2区3区| 国产精品―色哟哟| 久久久久久久综合日本| 欧美电视剧在线看免费| 69精品人人人人| 91影院在线观看| 欧美视频在线一区二区三区| 色天天综合色天天久久| 97se亚洲国产综合在线| 91亚洲国产成人精品一区二三| 成人黄色在线网站| 成人性视频免费网站| 国产精品1024| 国产精品一品二品| 一本一道久久a久久精品综合蜜臀| 国产成人一级电影| 成人午夜免费电影| www.99精品| 欧美精品高清视频| 日韩三级.com| 久久久亚洲高清| 国产精品―色哟哟| 日韩在线一区二区三区| 日韩av电影免费观看高清完整版在线观看| 香蕉久久一区二区不卡无毒影院| 亚洲一区二区三区三| 91国偷自产一区二区开放时间| 韩国毛片一区二区三区| 99re这里只有精品视频首页| 色婷婷国产精品久久包臀| 久久狠狠亚洲综合| 国产福利91精品一区二区三区| 国产91在线观看丝袜| 国产美女在线精品| 欧美午夜精品久久久| 亚洲精品在线三区|