/* ==================================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) |