在C语言中使用libtar库

9

我正在尝试使用C语言制作一个tar文件。由于某些原因,我不能使用

system("tar -cvf xxxx.tar xxxx");

我的代码如下:

#include <stdio.h>
#include <libtar.h>
#include <fcntl.h>

int main(void) {

        TAR *pTar;

        char *tarFilename = "file.tar";
        char *srcDir = "directory";

        char *extractTo = ".";
        tar_open(&pTar, tarFilename, NULL, O_WRONLY | O_CREAT, 0644, TAR_GNU);
        tar_append_tree(pTar, srcDir, extractTo);
        tar_close(pTar);
        return (0);

}

运行这段代码后,当我想要使用 untar 命令解压缩时,会发生以下错误:
tar -xvf file.tar

我遇到了一个错误。
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

我的C代码有什么问题?
3个回答

11

我完全忘记调用那个函数了。谢谢@Pierre。 - irukeru

0

按照您所说的修改了代码,但在执行时失败了。

int main(int argc, char** argv)
    {

        TAR *pTar;
    enter code here
        if (argc == 4)
            {
        char *tarFilename = argv[1];
        char *srcDir = argv[2];

        char *extractTo = argv[3];

        tar_open(&pTar, tarFilename, NULL, O_WRONLY | O_CREAT, 0644, TAR_GNU);
        tar_append_tree(pTar, srcDir, extractTo);
        tar_append_eof(pTar);
        tar_close(pTar);
            }
        else
            {
            fprintf(stdout,"Usage : arg1 : file.tar \n \ "
                "   arg2 : directory \n \ "
                "   arg3 : Extract to \n");
            }
        return (0);

}

但是这个失败了:

$ ./TarProg makefile.tar /home/prashant/prashant/eclipse2/TarProg/Debug /home/prashant/prashant/eclipse2/TarProg/Debug/tmp/
*** buffer overflow detected ***: ./TarProg terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45)[0xb76bbeb5]
/lib/i386-linux-gnu/libc.so.6(+0x103c8a)[0xb76bac8a]
/lib/i386-linux-gnu/libc.so.6(+0x1031b2)[0xb76ba1b2]
./TarProg[0x8049bca]
./TarProg[0x8049851]
./TarProg[0x8049376]
./TarProg[0x804ba7a]
./TarProg[0x8048ed5]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75d04d3]
./TarProg[0x8048dc1]
======= Memory map: ========
08048000-0804f000 r-xp 00000000 08:02 810831     /home/prashant/prashant/eclipse2/TarProg/Debug/TarProg
0804f000-08050000 r--p 00006000 08:02 810831     /home/prashant/prashant/eclipse2/TarProg/Debug/TarProg
08050000-08051000 rw-p 00007000 08:02 810831     /home/prashant/prashant/eclipse2/TarProg/Debug/TarProg
08051000-08053000 rw-p 00000000 00:00 0 
0974b000-0976c000 rw-p 00000000 00:00 0          [heap]
b7548000-b7564000 r-xp 00000000 08:02 392629     /lib/i386-linux-gnu/libgcc_s.so.1
b7564000-b7565000 r--p 0001b000 08:02 392629     /lib/i386-linux-gnu/libgcc_s.so.1
b7565000-b7566000 rw-p 0001c000 08:02 392629     /lib/i386-linux-gnu/libgcc_s.so.1
b757a000-b7585000 r-xp 00000000 08:02 403881     /lib/i386-linux-gnu/libnss_files-2.15.so
b7585000-b7586000 r--p 0000a000 08:02 403881     /lib/i386-linux-gnu/libnss_files-2.15.so
b7586000-b7587000 rw-p 0000b000 08:02 403881     /lib/i386-linux-gnu/libnss_files-2.15.so
b7587000-b7591000 r-xp 00000000 08:02 403880     /lib/i386-linux-gnu/libnss_nis-2.15.so
b7591000-b7592000 r--p 00009000 08:02 403880     /lib/i386-linux-gnu/libnss_nis-2.15.so
b7592000-b7593000 rw-p 0000a000 08:02 403880     /lib/i386-linux-gnu/libnss_nis-2.15.so
b7593000-b75a9000 r-xp 00000000 08:02 403725     /lib/i386-linux-gnu/libnsl-2.15.so
b75a9000-b75aa000 r--p 00015000 08:02 403725     /lib/i386-linux-gnu/libnsl-2.15.so
b75aa000-b75ab000 rw-p 00016000 08:02 403725     /lib/i386-linux-gnu/libnsl-2.15.so
b75ab000-b75ad000 rw-p 00000000 00:00 0 
b75ad000-b75b4000 r-xp 00000000 08:02 403882     /lib/i386-linux-gnu/libnss_compat-2.15.so
b75b4000-b75b5000 r--p 00006000 08:02 403882     /lib/i386-linux-gnu/libnss_compat-2.15.so
b75b5000-b75b6000 rw-p 00007000 08:02 403882     /lib/i386-linux-gnu/libnss_compat-2.15.so
b75b6000-b75b7000 rw-p 00000000 00:00 0 
b75b7000-b775b000 r-xp 00000000 08:02 403884     /lib/i386-linux-gnu/libc-2.15.so
b775b000-b775d000 r--p 001a4000 08:02 403884     /lib/i386-linux-gnu/libc-2.15.so
b775d000-b775e000 rw-p 001a6000 08:02 403884     /lib/i386-linux-gnu/libc-2.15.so
b775e000-b7761000 rw-p 00000000 00:00 0 
b7774000-b7777000 rw-p 00000000 00:00 0 
b7777000-b7778000 r-xp 00000000 00:00 0          [vdso]
b7778000-b7798000 r-xp 00000000 08:02 403783     /lib/i386-linux-gnu/ld-2.15.so
b7798000-b7799000 r--p 0001f000 08:02 403783     /lib/i386-linux-gnu/ld-2.15.so
b7799000-b779a000 rw-p 00020000 08:02 403783     /lib/i386-linux-gnu/ld-2.15.so
bf82f000-bf850000 rw-p 00000000 00:00 0          [stack]
Aborted (core dumped)

你使用了我用过的库吗?如果libtar.h不存在,你需要安装libtar-dev。 - irukeru

0

不是

tar_open(&pTar, tarFilename, NULL, O_WRONLY | O_CREAT, 0644, TAR_GNU);

请使用以下内容:
tar_open(&pTar, tarFilename, NULL, O_WRONLY | O_CREAT, 0644, TAR_IGNORE_MAGIC);

或者

tar_open(&pTar, tarFilename, NULL, O_WRONLY | O_CREAT, 0644, TAR_VERBOSE);

可能的原因是:char magic [6] 的大小为6。某些库试图将8个字节复制到magic中,如下所示,如果选项为TAR_GNU。因此,在这种情况下,我们必须传递除TAR_GNU之外的选项。
if (t->options & TAR_GNU)
    strncpy(t->th_buf.magic, "ustar  ", 8);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接