2010-05-21 2 views
3

J'ai écrit un programme C pour extraire des fichiers d'une archive tar en utilisant libarchive.libarchive lit trop de caractères lors de l'extraction d'un fichier

Je voudrais extraire un fichier de cette archive et l'imprimer vers la sortie standard. Mais je reçois des caractères supplémentaires. C'est de la foutaise, mais ça vient d'un autre fichier (peut-être adjacent dans l'archive). Je pense que la sortie se terminera à </html>.

Voici le code qui lit this tar file:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "archive.h" 
#include "archive_entry.h" 


int main (int argc, const char * argv[]) 
{ 
    struct archive *a; 
    struct archive_entry *entry; 
    int r; 
    int64_t entry_size; 
    a = archive_read_new(); 
    archive_read_support_compression_none(a); 
    archive_read_support_format_tar(a); 
    r = archive_read_open_filename(a, "0000.tar", 1024); 
    if (r != ARCHIVE_OK) 
    { 
     printf("archive not found"); 
    } 
    else 
    { 
     while (archive_read_next_header(a, &entry) == ARCHIVE_OK) 
     { 
      const char *currentFile = archive_entry_pathname(entry); 
      char *fileContents; 
      entry_size = archive_entry_size(entry); //get the size of the file 
      fileContents = malloc(entry_size); //alloc enough for string - from my testing I see that this is how many bytes tar and ls report from command line 
      archive_read_data(a, fileContents, entry_size); //read data into fileContents string for the HTML file size 
      if(strcmp(currentFile, "vendar-definition.html") == 0) 
      { 
       printf("file name = %s, size = %lld\n", currentFile, entry_size); 
       printf("%s\n\n", fileContents); //this output over-reads chars from another file in this tar file 
      }   
      free(fileContents); //free the C string because I malloc'd 
     } 
    } 
    printf("exit"); 
    return 0; 
} 

libarchive 2.8.3 compilé sur mac os X 10.6.3. gcc 4.2 x86_64

ls -l vendar-definition.html me donne 1921 pour la taille du fichier. Et montre ainsi tar tfv 0000.tar | grep vendar-definition.html. Donc, signale la sortie C qui indique la taille du fichier. Pour moi, cela semble correct.

Deux possibilités que je peux voir pourquoi ma sortie n'est pas comme prévu:

  1. J'ai fait l'erreur ou
  2. caractères multi-octets d'un débutant dans les fichiers d'archives a quelque chose à voir avec elle.
+0

ne serait pas mieux si fileContents et currentFile ont été déclarés en dehors du bloc while? –

+0

En outre, mon gcc se plaint en essayant d'utiliser char * au lieu de void * pour fileContents. Ce faisant, un simple printf ("% s", fileContents) a été résolu. S'il vous plaît, vérifiez si cela fonctionne pour vous. –

Répondre

2

je pourrais être très mal mais cela ne ressemble pas à une chaîne terminée par zéro (je ne pense pas que archive_read_data prend soin de cela). Ajoutez un caractère NULL ou consultez this et dites-nous comment ça se passe.

+0

Apparemment, non. Parfait, ce lien m'a mis directement. Merci! – ojreadmore

1

Je suppose que vous n'êtes pas lecture trop de caractères, mais seulement l'impression trop.

Vous envoyez le contenu du fichier à l'aide du spécificateur %s à printf, qui s'attend à ce que l'entrée soit une chaîne à zéro terminal. Le contenu d'un fichier dans l'archive ne peut pas être terminé par un caractère nul et peut contenir des valeurs nulles arbitraires au milieu.

Essayez la sortie comme ceci:

fwrite(fileContents, sizeof(char), entry_size, stdout); 
Questions connexes