Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1638435
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类:

2006-08-08 09:14:04

/* ==================================libtiny_tar.so.1 =================================
  描述
  此库依赖是在 tar-1.15.91的基础修改的,
   其实tar的原理很简单: comment by bob 2006-8-3 11:48
   tar文件的构成:
   tar文件最顶端是512字节的header ,里面记录了对应的file的stat信息,比如uid,gid,mode等等
   然后是文件正文内容
   
   如果tar里面包含了其他的文件的话, 又是一个header ,剩下的又是文件正文
   ..........................
   
   最后tar文件的末尾是 最少 1024个字节的 '\0' 表示tar结尾。当然一般情况下是 10240个bytes 0
   --------------------------------------------------------------------------------------------
  tar 源码分析:
   因为基础上面的结构,所以tar的source code 就比较容易理解了:
   tar 采用了block和record的概念
   record  = 20 个 block (default)
   
   源码里面用20个block的连续的buffer来存储tar fd中的内容,当然一旦这20个block没用,就会flush,又从
   tar fd中读10240 个字节到这20个blocks中来。 
   
   其中最重要就是 current_header , 是最开始 20个blocks中的第一个,对应了 tar_stat_info->header
   如果想了解tar文件包含的文件信息, 就可以读取这个header (调用print_header可以打印出来)
   
   如果要从tar文件中extract某个file ,也很简单, 只需要从第二个block开始读即可了,一直读current_stat_info->stat->st_size
   个字节就可以了(因为我们的tar文件中只含有一个file,所以不必考虑后面的 10240个 '\0' 了
   
   标准的tar生成的tar包的size总是 10240的倍数,所以一个tar包,的最小大小总是 10240 ,即使一个file很小。
   ----------------------------------------------------------------------------------------------
   
  tiny_tar library 0.1 version : author :bob
  initial time: 2006-8-2 17:07
 
  tiny_tar library :该库在 tar的基础上进行修改:目前支持的功能为:
   
   1>只能把一个file 加入到 tar 包中去,不可以加入多个文件
   2>只能tar 一个file ,不支持目录
   3>支持 gzip和bzip2进行压缩
  另外,tiny_tar library still use libtar.so.0
 
 
  顺便说说tar的source code,也真奇怪,作者总是特别倾向于用global varible ,而不是用local variable
  所以很多函数都没有参数,诸如 open_archive(mode) ,这都没有参数,简直fuck \n
  相比之下, 记得openldap就写的比较好的,参数很多,虽然阅读起来也开始比较费劲, 但是编程库的
  形式倒是方便的很!
 
  所以在tar source的基础上,很多函数都加了 参数, 这样才能比较的用于库,被别的R&D调用

 ====================================================================================================================*/
 
 
2>
API定义如下:
//由于编程的原因,我自己重新用typedef定义一下
//----------------------------------------------------------------
typedef struct tar_stat_info S_archive_stat_info;
typedef enum archive_format S_archive_format;
typedef enum access_mode S_archive_acess_mode;
// --------------------------------------------------------------
函数如下:

int  OpenArchive (const char *archive_path,const char *mode_p);
int CloseArchive(int archive_fd); //Close one archive

S_archive_stat_info * GetElementInfo(int archive);
S_archive_stat_info * FindFirstElement(int archive);

int DeleteElement(int archive);
int ExtractElement(int archive) ; // Extract a file from the archive
int AddFileToArchive(int archive,const char *file_path);  //Add one file into a archive tar package
 
 
 

3>
/* ==================================例子===============================
   创建一个archive文件
======================================================================*/
#include "app.h"
#include "archive.h"
//example.c
int main(void)
{
 int fd = -1;
 
 S_archive_stat_info  *ft = NULL;
 fd = OpenArchive("/tmp/1/kk.tar.gz","w");
 printf("has called OpenArchive () \n");
 if(fd < 0)  {
  //fatal_error("can't open /var/bob.tar.gz\n");
  return -1;
 }
 
 printf("open OK \n");
 
 AddFileToArchive(fd,"./log.txt");
 
 CloseArchive(fd);
 return 0;
  
}
 
/* ==================================例子===============================
   访问一个archive文件的属性
======================================================================*/
#include "app.h"
#include "archive.h"
//example.c
int main(void)
{
 int fd = -1;
 
 S_archive_stat_info  *ft = NULL;
 fd = OpenArchive("/tmp/1/kk.tar.gz","r");
 printf("has called OpenArchive () \n");
 if(fd < 0)  {
  //fatal_error("can't open /var/bob.tar.gz\n");
  return -1;
 }
 
 printf("open OK \n");
 //now get the fd descriptor
 ft = FindFirstElement(fd);   //ft是用来描述tar包属性的, 调用者可以打印里面的各种属性值 。
 //比如打印tar包里面包含的文件名
 printf("ft->file_name=%s\n",ft->file_name);
 //在这里你可以print ft的一些属性值
 
 CloseArchive(fd);
 return 0;
  
}
 

/* ==================================例子===============================
   解压一个.tar.gz的文件
======================================================================*/
#include "app.h"
#include "archive.h"
//example.c
int main(void)
{
 int fd = -1;
 
 S_archive_stat_info  *ft = NULL;
 fd = OpenArchive("/tmp/1/kk.tar.gz","r");
 printf("has called OpenArchive () \n");
 if(fd < 0)  {
  //fatal_error("can't open /var/bob.tar.gz\n");
  return -1;
 }
 
 printf("open OK \n");
 
 ExtractElement(fd);
 
 CloseArchive(fd);
 return 0;
  
}
阅读(899) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:使用kgdb调试linux内核及内核模块

给主人留下些什么吧!~~