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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sparse.c

?? gnu tar 源碼包。 tar 軟件是 Unix 系統下的一個打包軟件
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* Functions for dealing with sparse files   Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.   This program 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 3, or (at your option) any later   version.   This program 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 this program; if not, write to the Free Software Foundation, Inc.,   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */#include <system.h>#include <inttostr.h>#include <quotearg.h>#include "common.h"struct tar_sparse_file;static bool sparse_select_optab (struct tar_sparse_file *file);enum sparse_scan_state  {    scan_begin,    scan_block,    scan_end  };struct tar_sparse_optab{  bool (*init) (struct tar_sparse_file *);  bool (*done) (struct tar_sparse_file *);  bool (*sparse_member_p) (struct tar_sparse_file *);  bool (*dump_header) (struct tar_sparse_file *);  bool (*fixup_header) (struct tar_sparse_file *);  bool (*decode_header) (struct tar_sparse_file *);  bool (*scan_block) (struct tar_sparse_file *, enum sparse_scan_state,		      void *);  bool (*dump_region) (struct tar_sparse_file *, size_t);  bool (*extract_region) (struct tar_sparse_file *, size_t);};struct tar_sparse_file{  int fd;                           /* File descriptor */  bool seekable;                    /* Is fd seekable? */  off_t offset;                     /* Current offset in fd if seekable==false.				       Otherwise unused */  off_t dumped_size;                /* Number of bytes actually written				       to the archive */  struct tar_stat_info *stat_info;  /* Information about the file */  struct tar_sparse_optab const *optab; /* Operation table */  void *closure;                    /* Any additional data optab calls might				       require */};/* Dump zeros to file->fd until offset is reached. It is used instead of   lseek if the output file is not seekable */static booldump_zeros (struct tar_sparse_file *file, off_t offset){  static char const zero_buf[BLOCKSIZE];  if (offset < file->offset)    {      errno = EINVAL;      return false;    }  while (file->offset < offset)    {      size_t size = (BLOCKSIZE < offset - file->offset		     ? BLOCKSIZE		     : offset - file->offset);      ssize_t wrbytes;      wrbytes = write (file->fd, zero_buf, size);      if (wrbytes <= 0)	{	  if (wrbytes == 0)	    errno = EINVAL;	  return false;	}      file->offset += wrbytes;    }  return true;}static booltar_sparse_member_p (struct tar_sparse_file *file){  if (file->optab->sparse_member_p)    return file->optab->sparse_member_p (file);  return false;}static booltar_sparse_init (struct tar_sparse_file *file){  memset (file, 0, sizeof *file);  if (!sparse_select_optab (file))    return false;  if (file->optab->init)    return file->optab->init (file);  return true;}static booltar_sparse_done (struct tar_sparse_file *file){  if (file->optab->done)    return file->optab->done (file);  return true;}static booltar_sparse_scan (struct tar_sparse_file *file, enum sparse_scan_state state,		 void *block){  if (file->optab->scan_block)    return file->optab->scan_block (file, state, block);  return true;}static booltar_sparse_dump_region (struct tar_sparse_file *file, size_t i){  if (file->optab->dump_region)    return file->optab->dump_region (file, i);  return false;}static booltar_sparse_extract_region (struct tar_sparse_file *file, size_t i){  if (file->optab->extract_region)    return file->optab->extract_region (file, i);  return false;}static booltar_sparse_dump_header (struct tar_sparse_file *file){  if (file->optab->dump_header)    return file->optab->dump_header (file);  return false;}static booltar_sparse_decode_header (struct tar_sparse_file *file){  if (file->optab->decode_header)    return file->optab->decode_header (file);  return true;}static booltar_sparse_fixup_header (struct tar_sparse_file *file){  if (file->optab->fixup_header)    return file->optab->fixup_header (file);  return true;}static boollseek_or_error (struct tar_sparse_file *file, off_t offset){  if (file->seekable      ? lseek (file->fd, offset, SEEK_SET) < 0      : ! dump_zeros (file, offset))    {      seek_diag_details (file->stat_info->orig_file_name, offset);      return false;    }  return true;}/* Takes a blockful of data and basically cruises through it to see if   it's made *entirely* of zeros, returning a 0 the instant it finds   something that is a nonzero, i.e., useful data.  */static boolzero_block_p (char const *buffer, size_t size){  while (size--)    if (*buffer++)      return false;  return true;}static voidsparse_add_map (struct tar_stat_info *st, struct sp_array const *sp){  struct sp_array *sparse_map = st->sparse_map;  size_t avail = st->sparse_map_avail;  if (avail == st->sparse_map_size)    st->sparse_map = sparse_map =      x2nrealloc (sparse_map, &st->sparse_map_size, sizeof *sparse_map);  sparse_map[avail] = *sp;  st->sparse_map_avail = avail + 1;}/* Scan the sparse file and create its map */static boolsparse_scan_file (struct tar_sparse_file *file){  struct tar_stat_info *st = file->stat_info;  int fd = file->fd;  char buffer[BLOCKSIZE];  size_t count;  off_t offset = 0;  struct sp_array sp = {0, 0};  if (!lseek_or_error (file, 0))    return false;  st->archive_file_size = 0;    if (!tar_sparse_scan (file, scan_begin, NULL))    return false;  while ((count = safe_read (fd, buffer, sizeof buffer)) != 0	 && count != SAFE_READ_ERROR)    {      /* Analyze the block.  */      if (zero_block_p (buffer, count))	{	  if (sp.numbytes)	    {	      sparse_add_map (st, &sp);	      sp.numbytes = 0;	      if (!tar_sparse_scan (file, scan_block, NULL))		return false;	    }	}      else	{	  if (sp.numbytes == 0)	    sp.offset = offset;	  sp.numbytes += count;	  st->archive_file_size += count;	  if (!tar_sparse_scan (file, scan_block, buffer))	    return false;	}      offset += count;    }  if (sp.numbytes == 0)    sp.offset = offset;  sparse_add_map (st, &sp);  st->archive_file_size += count;  return tar_sparse_scan (file, scan_end, NULL);}static struct tar_sparse_optab const oldgnu_optab;static struct tar_sparse_optab const star_optab;static struct tar_sparse_optab const pax_optab;static boolsparse_select_optab (struct tar_sparse_file *file){  switch (current_format == DEFAULT_FORMAT ? archive_format : current_format)    {    case V7_FORMAT:    case USTAR_FORMAT:      return false;    case OLDGNU_FORMAT:    case GNU_FORMAT: /*FIXME: This one should disappear? */      file->optab = &oldgnu_optab;      break;    case POSIX_FORMAT:      file->optab = &pax_optab;      break;    case STAR_FORMAT:      file->optab = &star_optab;      break;    default:      return false;    }  return true;}static boolsparse_dump_region (struct tar_sparse_file *file, size_t i){  union block *blk;  off_t bytes_left = file->stat_info->sparse_map[i].numbytes;  if (!lseek_or_error (file, file->stat_info->sparse_map[i].offset))    return false;  while (bytes_left > 0)    {      size_t bufsize = (bytes_left > BLOCKSIZE) ? BLOCKSIZE : bytes_left;      size_t bytes_read;      blk = find_next_block ();      bytes_read = safe_read (file->fd, blk->buffer, bufsize);      if (bytes_read == SAFE_READ_ERROR)	{          read_diag_details (file->stat_info->orig_file_name,	                     (file->stat_info->sparse_map[i].offset			      + file->stat_info->sparse_map[i].numbytes			      - bytes_left),			     bufsize);	  return false;	}      memset (blk->buffer + bytes_read, 0, BLOCKSIZE - bytes_read);      bytes_left -= bytes_read;      file->dumped_size += bytes_read;      mv_size_left (file->stat_info->archive_file_size - file->dumped_size);      set_next_block_after (blk);    }  return true;}static boolsparse_extract_region (struct tar_sparse_file *file, size_t i){  size_t write_size;  if (!lseek_or_error (file, file->stat_info->sparse_map[i].offset))    return false;  write_size = file->stat_info->sparse_map[i].numbytes;  if (write_size == 0)    {      /* Last block of the file is a hole */      if (file->seekable && sys_truncate (file->fd))	truncate_warn (file->stat_info->orig_file_name);    }  else while (write_size > 0)    {      size_t count;      size_t wrbytes = (write_size > BLOCKSIZE) ? BLOCKSIZE : write_size;      union block *blk = find_next_block ();      if (!blk)	{	  ERROR ((0, 0, _("Unexpected EOF in archive")));	  return false;	}      set_next_block_after (blk);      count = full_write (file->fd, blk->buffer, wrbytes);      write_size -= count;      file->dumped_size += count;      mv_size_left (file->stat_info->archive_file_size - file->dumped_size);      file->offset += count;      if (count != wrbytes)	{	  write_error_details (file->stat_info->orig_file_name,			       count, wrbytes);	  return false;	}    }  return true;}/* Interface functions */enum dump_statussparse_dump_file (int fd, struct tar_stat_info *st){  bool rc;  struct tar_sparse_file file;  if (!tar_sparse_init (&file))    return dump_status_not_implemented;  file.stat_info = st;  file.fd = fd;  file.seekable = true; /* File *must* be seekable for dump to work */  rc = sparse_scan_file (&file);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99riav一区二区三区| 欧美亚洲综合另类| 欧美无砖专区一中文字| 精品久久99ma| 一区二区三区欧美| 国产麻豆9l精品三级站| 欧美伊人久久久久久久久影院 | 4438成人网| 自拍偷拍亚洲激情| 国产一区免费电影| 欧美日韩在线播放一区| 日韩一区在线免费观看| 国产精品中文字幕日韩精品| 911国产精品| 亚洲一区二区在线视频| 岛国一区二区在线观看| 亚洲精品在线免费观看视频| 亚洲一区在线免费观看| 99re这里都是精品| 欧美高清在线精品一区| 九色|91porny| 欧美变态口味重另类| 日韩黄色小视频| 欧美日本韩国一区| 亚洲成a人在线观看| 欧洲人成人精品| 一级日本不卡的影视| 日本韩国欧美在线| 亚洲欧美日韩国产另类专区| 成人av高清在线| 日本午夜精品一区二区三区电影 | 国产亚洲精品精华液| 美国十次综合导航| 91精品国产乱码| 亚洲一级片在线观看| 欧美日韩在线综合| 亚洲成人777| 欧美一区二区三区爱爱| 日韩在线卡一卡二| 日韩免费高清av| 久久99精品一区二区三区| 欧美成人欧美edvon| 精品一区二区三区视频在线观看| 日韩亚洲欧美在线| 国产一区二区福利视频| 久久久91精品国产一区二区精品| 麻豆91在线看| 国内精品不卡在线| 成人h精品动漫一区二区三区| 激情五月婷婷综合| 久久久综合九色合综国产精品| 久久不见久久见免费视频7 | 日本 国产 欧美色综合| 日韩欧美成人午夜| 国产精品中文有码| 久久伊人蜜桃av一区二区| 亚洲激情一二三区| 天天色图综合网| 国产精品一区二区在线观看不卡 | 91网页版在线| 国产一区二区三区四| 亚洲va在线va天堂| 678五月天丁香亚洲综合网| 亚洲婷婷综合色高清在线| 亚洲一二三四区| 不卡的电视剧免费网站有什么| 国产欧美日韩另类一区| 欧美丰满高潮xxxx喷水动漫| 婷婷夜色潮精品综合在线| 国产馆精品极品| 99国产精品久久久久久久久久| 欧美α欧美αv大片| 亚洲女同一区二区| 午夜在线成人av| 福利一区二区在线| 日韩欧美国产一区二区三区| 久久综合九色欧美综合狠狠| 国产精品网友自拍| 日本欧美一区二区| 91蜜桃婷婷狠狠久久综合9色| 欧美一区二区观看视频| 国产欧美视频在线观看| 国产黄色精品视频| 久久久国产精品不卡| 91免费看视频| 一区二区久久久久| 欧美伦理影视网| 亚洲va韩国va欧美va精品| 欧美精品乱人伦久久久久久| 亚洲va中文字幕| 日韩一级大片在线观看| 五月天激情综合网| 欧美一区二区视频网站| 麻豆精品久久精品色综合| 日韩三级视频中文字幕| 日韩电影在线观看电影| 色久综合一二码| 国产精品美女久久久久久久久久久 | 欧美性一区二区| 亚洲精品日韩专区silk| 色噜噜狠狠一区二区三区果冻| 欧美一级一区二区| 五月综合激情日本mⅴ| 亚洲精品一区二区三区福利 | 欧美精品乱人伦久久久久久| 麻豆精品国产传媒mv男同| 中日韩av电影| 欧美人牲a欧美精品| 狠狠色综合日日| 一区二区三区在线观看国产| 国产网站一区二区| 国产成人精品亚洲午夜麻豆| 欧美夫妻性生活| 欧美综合久久久| 日本精品裸体写真集在线观看| 粉嫩av亚洲一区二区图片| 国产综合久久久久影院| 久久99国产精品尤物| 日本特黄久久久高潮| 日韩av不卡在线观看| 午夜激情久久久| 日韩电影免费在线看| 日韩高清不卡一区二区| 蜜桃91丨九色丨蝌蚪91桃色| 蜜桃视频在线一区| 韩国欧美一区二区| 国产尤物一区二区在线| 国产精品一二三四| 懂色av一区二区夜夜嗨| 99久久久精品| 91黄色激情网站| 91精品国产综合久久精品图片| 日韩手机在线导航| 久久无码av三级| 国产精品每日更新在线播放网址| 亚洲素人一区二区| 亚洲国产成人tv| 久久超碰97中文字幕| 高清不卡一区二区| 欧美自拍偷拍一区| 日韩欧美123| 国产精品高潮呻吟| 亚洲福中文字幕伊人影院| 麻豆久久一区二区| jizzjizzjizz欧美| 欧美日韩精品福利| 2019国产精品| 一区二区三区四区激情| 蜜臀av性久久久久蜜臀aⅴ流畅 | 91精品国产免费| 久久久亚洲午夜电影| 自拍av一区二区三区| 蜜臀久久久99精品久久久久久| 国产九九视频一区二区三区| 91麻豆免费看| 精品欧美乱码久久久久久| 日韩美女久久久| 老司机一区二区| 色综合久久天天| 精品久久久久久亚洲综合网| 亚洲色大成网站www久久九九| 日韩和欧美一区二区三区| 丁香六月久久综合狠狠色| 欧美日韩免费一区二区三区视频| 国产亚洲欧美一区在线观看| 亚洲午夜在线视频| 成人网在线免费视频| 日韩一区二区影院| 亚洲男女毛片无遮挡| 久久99精品国产91久久来源| 色94色欧美sute亚洲线路一ni| 26uuu久久综合| 日本亚洲视频在线| 91国产福利在线| 国产精品国产三级国产a| 国产在线精品免费| 91麻豆精品国产91久久久使用方法| 中文字幕在线不卡视频| 国产一区二区精品久久91| 欧美美女网站色| 亚洲一区二区视频| 99麻豆久久久国产精品免费优播| 欧美tickling挠脚心丨vk| 视频在线在亚洲| 欧美视频在线不卡| 亚洲伦理在线免费看| 成人永久免费视频| 国产偷v国产偷v亚洲高清| 久草中文综合在线| 日韩你懂的在线观看| 日韩精品欧美成人高清一区二区| 在线欧美日韩精品| 亚洲色欲色欲www| 99re免费视频精品全部| 中文字幕的久久| 成人午夜激情片| 中文字幕日韩av资源站| 成人av免费在线观看| 中文字幕日韩一区二区| 成人高清视频在线|