2014-07-22 10 views
6

Sto provando a creare un file tar utilizzando c. Per un motivo non posso usareutilizzando la libreria libtar in c

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

il mio codice è:

#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); 

} 

Dopo l'esecuzione di questo codice, quando voglio decomprimere con

tar -xvf file.tar 

sto ottenendo un errore

tar: This does not look like a tar archive 
tar: Exiting with failure status due to previous errors 

Qual è il problema con il mio codice c?

risposta

8

Penso che sia necessario chiamare tar_append_eof http://linux.die.net/man/3/tar_append_eof prima di chiudere il file tar.

La funzione tar_append_eof() scrive un indicatore EOF (due blocchi di tutti gli zeri) nel file tar associato a t.

+0

Ho completamente dimenticato di chiamare quella funzione. Grazie @Pierre – irukeru

0

codice modificato come hai detto, ma non riesce a esecuzione,

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); 

} 

Ma questo non riesce:

$ ./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) 
+0

hai usato le librerie che ho usato? se libtar.h non esiste, è necessario installare libtar-dev. – irukeru

0

Invece di tar_open (& PTAR, tarFilename, NULL, O_WRONLY | O_CREAT , 0644, TAR_GNU);

Utilizzare la seguente: tar_open (& PTAR, tarFilename, NULL, O_WRONLY | O_CREAT, 0644, TAR_IGNORE_MAGIC); oppure tar_open (& pTar, tarFilename, NULL, O_WRONLY | O_CREAT, 0644, TAR_VERBOSE);

Motivo potrebbe essere: Dimensione di "char magic [6]" è 6. Somewhere library sta cercando di copiare 8bytes in magic come sotto se l'opzione è TAR_GNU. Quindi, in questo caso, dobbiamo passare un'opzione diversa da TAR_GNU.

if (t->options & TAR_GNU) 
    strncpy(t->th_buf.magic, "ustar ", 8);