Forum Programmation.c utilisation de libtar

Posté par  .
Étiquettes : aucune
0
21
mar.
2006
Bonjour,

J'essaye avec difficulté d'utiliser la librairie libtar, pour créer des archives, ajouter des fichiers, lire le contenu de l'archive...

Je n'ai pas trouvé de réelle documentation, ni d'exemple clair pouvant m'aider..
Est-ce que quelqu'un pourrais me poster un bout de code pour m'aider à démarrer ?

merci de votre aide.
  • # Docs

    Posté par  (site web personnel) . Évalué à 3.

    La bibliothèque libtar est livrée avec un répertoire doc qui comprend des fichiers man décrivant les principales fonctions qui la compose : soit le package est bien installé et tu peux directement faire man soit tu ne veux pas l'installer, et il suffira pour l'afficher d'une genre :

    groff -Tascii -man tar_open.3 | less


    Les pages dispos son :

    - tar_append_file.3
    - tar_block_read.3
    - tar_extract_all.3
    - tar_extract_file.3
    - tar_open.3
    - th_get_pathname.3
    - th_print_long_ls.3
    - th_read.3
    - th_set_from_stat.3

    Et là tu vas me dire, "oui mais des exemples". Certes, ça manque, et google est bien muet sur le coup. Tout ce que j'ai pu trouver c'est un code source en C qui comporte notamment une ouverture de fichier TAR avec cette lib (j'ai bien regardé le code source de gnozip, malheureusement celui-ci utilise une implémentation maison du détarrage...)

    http://darcs.frugalware.org/repos/pacman-i18n/src/pacman.c

    Voilà, entre ça, les man pages, et ta débrouillardise, ça devrait aller ? ;-)
    Désolé de ne pas avoir donné de code à moi, mais je n'ai jamais utilisé cette lib pour être honnête ! Bonne chance.
    • [^] # Re: Docs

      Posté par  . Évalué à 1.

      Salut, merci pour cette aide, ca m'a permis d'avancer un poil, même si c'est vraiment dur,

      Voilà où je bute encore :
      lorsque je veux utiliser la fonction,

      tar_open(&tarh, tar_path, &Type, O_RDONLY, 0, TAR_GNU)

      j'obtiens le message suivant :

      /home/wsb/prog/archiver/src/archiver.c:48: erreur: ‘O_RDONLY’ undeclared (first use in this function)
      /home/wsb/prog/archiver/src/archiver.c:48: erreur: (Chaque identificateur non déclaré est rapporté une seule fois


      Or j'ai bien linké la libtar, et dans le manuel, il semble que la valeur de oflags ne peut-être que O_RDONLY ou O_WONLY...
      Est-ce que je dois définir cette constante quelque part ?
    • [^] # Re: Docs

      Posté par  . Évalué à 1.

      Salut, merci pour cette aide, ca m'a permis d'avancer un poil, même si c'est vraiment dur,

      Voilà où je bute encore :
      lorsque je veux utiliser la fonction,

      tar_open(&tarh, tar_path, &Type, O_RDONLY, 0, TAR_GNU)

      j'obtiens le message suivant :

      /home/wsb/prog/archiver/src/archiver.c:48: erreur: ‘O_RDONLY’ undeclared (first use in this function)
      /home/wsb/prog/archiver/src/archiver.c:48: erreur: (Chaque identificateur non déclaré est rapporté une seule fois


      Or j'ai bien linké la libtar, et dans le manuel, il semble que la valeur de oflags ne peut-être que O_RDONLY ou O_WONLY...
      Est-ce que je dois définir cette constante quelque part ?
      • [^] # Re: Docs

        Posté par  . Évalué à 1.

        En fait j'ai peut-etre trouvé un des problèmes : J'ai ajouté la librairie #include <fcntl.h>, dans laquelle est contenue open() qui semble être utiliser par libtar... (si quelqu'un peut confirmer ?) Par contre, depuis que j'ai ajouté cette entête, il me dit qu'il ne connaît pas la fonction tar_open !! Pourquoi ces deux entêtes ne pourraient-elles pas coexister ? Ou et ce que l'erreur ce situe ailleurs ?
        #ifdef HAVE_CONFIG_H
        #include <config.h>
        #endif
        
        #include <stdio.h>
        #include <unistd.h>
        #include <stdlib.h>
        #include <fcntl.h>
        #include <libtar.h>
        
        
        char * list_options = "a:o:";
        int option;
        char * tar_path;
        
        TAR *tarh;
        tartype_t Type;
        int nMode = 0644;
        
        
        int main(int argc, char *argv[])
        {
        
        while ((option = getopt(argc, argv, list_options)) != -1) {
        	switch (option) {
        	case 'a' :
        	fprintf(stdout, "option a : %s\n", optarg);
        	break;
        	case 'o' :
        	fprintf(stdout, "option o : %s\n", optarg);
        	tar_path = optarg;
        	break;
        	case '?' :
        	fprintf(stdout, "wrong option !\n");
        	break;
        	}
        }
        
        //fprintf(stdout, "voilà le path :%s", tar_path);
        /*
        Type.openfunc=open;
         Type.closefunc=close;
         Type.readfunc=read;
         Type.writefunc=write;
        */
        
        tar_open(&tarh, tar_path, &Type, O_RDONLY, 0, TAR_GNU);
        //tar_close(&tarh);
        
        
          return EXIT_SUCCESS;
        }
        
        • [^] # Re: Docs

          Posté par  (site web personnel) . Évalué à 2.

          Quand je tente de compiler ton code, l'erreur que je vois ne concerne pas une inclusion, mais c'est :
          ld: Undefined symbols:
          _tar_open

          Autrement dit un problème de linkage (pardon, édition de liens). Ton code est donc probablement correct au niveau des inclusions, mais la subtilité doit être sur la ligne de commande pour compiler, sachant que la mienne était :
          gcc -I/usr/local/include -L/usr/local/lib -ltar test.c -o test

          (test.c étant ton source)
          • [^] # Re: Docs

            Posté par  (site web personnel) . Évalué à 2.

            Apparemment cela passe en référençant la lib de manière plus directe. J'ai donc décomposé ma commande en :
            gcc -I/usr/local/include -c test.c
            ...
            gcc test.o /usr/local/lib/libtar.a -o test
            
            Cela produit donc un exécutable. Par contre l'exécution donne un zoli message "Bus error" (sous OSX kipusaipaslibre, je sais _o/PAF) sur l'appel tar_open, mais bon, je n'ai pas trop regardé ton code. Je vais y jeter un coup d'oeil un peu plus tar(d) si j'ai quelques minutes ;-)
            • [^] # Re: Docs

              Posté par  (site web personnel) . Évalué à 2.

              Bon, en fait, une minute suffit : dans ton appel à tar_open, tu passes un pointeur "tarh" pour lequel jamais une once de mémoire n'a été allouée. Pas bieeeeeen !

              Pour le reste, je te laisse, j'suis crevé. Pis ça te donnera l'occasion de reviser le fonctionnement de ces joyeusetés ;o) Faudrait pas que je sois le seul à bosser !
              • [^] # Re: Docs

                Posté par  (site web personnel) . Évalué à 2.

                Message à ignorer : c'est une belle anerie que je viens de sortir ;-) La mémoire est allouée par tar_open en théorie.
            • [^] # Re: Docs

              Posté par  (site web personnel) . Évalué à 2.

              Bon, en décommentant l'initialisation de la structure tartype_t, ça semble marcher. Bonne route pour la suite :o)
              • [^] # Re: Docs

                Posté par  . Évalué à 1.

                Tu peux m'expliquer commen allouer de la mémoire au pointeur ?

                Je suis nouveau en c, et je pensais qu'en déclarant le pointeur, il n'y avait pas besoin d'allouer de la mémoire, puisque celui-ci utiliserait la mémoire déjà alouer par la fonction tar_open, dans la librairie correspondante...
                Si c'est pas le cas, je comprend maintenant les fautes de segmentation que j'ai obtenu dans d'autre prog. Pourrais tu m'expliquer comment il faut procéder ici (ca me permettra de comprendre mon erreur)

                J'ai bien acheté de livres, mais il manque parfois des exemples concrets, et j'ai toujours besoin de me planter pour enregister ;)
                • [^] # Re: Docs

                  Posté par  (site web personnel) . Évalué à 2.

                  je pensais qu'en déclarant le pointeur, il n'y avait pas besoin d'allouer de la mémoire, puisque celui-ci utiliserait la mémoire déjà alouer par la fonction tar_open

                  Oui, c'est bien ça : comme je le dis un peu plus haut, j'ai sorti une belle anerie (je n'avais pas lu la man page de tar_open en entier. Cela dit si tu as des segfaults dans d'autres cas, c'est bien vers ce genre de problème qu'il faut s'orienter.
              • [^] # Re: Docs

                Posté par  . Évalué à 1.

                Tu peux m'expliquer commen allouer de la mémoire au pointeur ?

                Je suis nouveau en c, et je pensais qu'en déclarant le pointeur, il n'y avait pas besoin d'allouer de la mémoire, puisque celui-ci utiliserait la mémoire déjà alouer par la fonction tar_open, dans la librairie correspondante...
                Si c'est pas le cas, je comprend maintenant les fautes de segmentation que j'ai obtenu dans d'autre prog. Pourrais tu m'expliquer comment il faut procéder ici (ca me permettra de comprendre mon erreur)

                J'ai bien acheté de livres, mais il manque parfois des exemples concrets, et j'ai toujours besoin de me planter pour enregister ;)
  • # merci à toi

    Posté par  . Évalué à 1.

    Je vais essayer ca demain, étant informaticien, j'ai un peu de mal à me remettre sur l'ordi en ce moment après le boulot...
    Donc si j'ai bien compris, je revois le linkage et je décommente la ligne d'initialisation de la variable type ?

    Un grand, grand merci pour ton aide ! J'espère que ca me permettra d'avancer

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.