Reproduir la commande tar.

kunamaro Messages postés 21 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

Je m'appelle Thomas, je suis tek1 à epitech, et je suis actuellement entrain de faire un projet dont l'objectif final est de reproduire la commande tar avec un programme fait par nos soins.
Le but n'est pas de me donner un bout de code ou un code entier, mais juste d'en discuter et de trouver/donner des idées.

Pour le moment je dois créé un fichier my archive qui prend comme premier paramètre le fichier destination (l'archive) et qui prend ensuite autant de paramètres que l'utilisateur veut (utilisation de va arg je pense) pour les archiver dans le fichier archive. J'ajouterais que l'archive doit bien entendre pouvoir être désarchiver, ce n'est pas marrant sinon =)

Dans l'une des étapes suivantes, nous devons rendre notre my archive utilisable par la fonction tar du système (en gros refaire purement et simplement tar), donc ça serait bien si j'arrivais à faire ça directement.

Voilà en gros l'objectif!

Je ne maitrise pas encore bien les manipulations de fichier à partir d'un programme (write, open, close et bien d'autres)
Je pense utiliser va arg pour récupérer les différents paramètres, par contre je me demande comment faire pour accéder à un fichier dont on donne le chemin d'accès (donc qui n'est pas dans le dossier courant)... J'ai bien une idée mais elle parais un peu trop compliquée pour la chose (tout simplement récupérée chaque nom de dossier et les opens les uns après les autres :/)
Après ça, je ne sais pas comment alloué de la place après avoir créé un fichier (à ce même fichier), car lors de la création d'un fichier tar, la fonction tar lui alloue une certaine place qui dépend de la taille de ce qu'on veut archiver (des blocking Factor si j'ai bien compris, cf: http://www.gnu.org/software/tar/manual/html_node/Blocking-Factor.html

Voilà voilà, si quelqu'un avait quelques idées ou indications concernant le fonctionnement de tar, d'une archive, le desarchivage, l'allocation de mémoire à un fichier ou sur tous les autres éléments concernant ce projet je suis preneur!

PS: Seul la lib C est autorisée

Merci d'avance,

Cordialement.
A voir également:

6 réponses

wefwef
 
rtfm! ;)
Tu as un my_ls pour apprendre a utiliser stat et argc argv.
Tu as eu aussi pendant la piscine un cat a refaire. tu sais donc lire un fichier.
3
Heckmann
 
#include <stdio.h>
#include <stdarg.h>

int main(int argc, ...)
{
    int i;
    va_list list;

    va_start(list, argc);

    char **argv = va_arg(list, char **);
    char **environ = va_arg(list, char **);

    for (i = 0; i < argc; ++i) {
        printf("argument %d = [%s]\n", i, argv[i]);
    }
                                                                                                                                                                                                                                               
    va_end(list);
    return 0;
}
2
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
C'est quoi l'intérêt de gérer argv avec va_arg ? Sachant que tu peux le mettre en argument de ta fonction main ?
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut Heckmann,

Si tu dois reproduire l'écriture de fichiers tar et la lecture, tu dois comprendre le format .tar (ou plutôt les formats, et décider celui ou ceux que tu implémentes).

Sur une Debian
man 5 tar
te renseigne sur la question. On en parle aussi sur https://en.wikipedia.org/wiki/Tar_%28computing%29.


Dal
1
kunamaro Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
Up? ^^"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Pour récupérer les différents paramètres, tu n'as pas besoin de va_list. Tu utilises le prototype de main : int main(int argc, char **argv);
argv contiendra alors tous tes arguments.

write, open, close et bien d'autres
Ce ne sont les des fonctions standards. Il faut utiliser plutôt : fwrite(), fopen(), fclose(), etc.

Pour accéder à un fichier qui n'est pas dans le dossier courant, c'est aussi simple que s'il était dans le fichier courant. Par exemple :
FILE *fp = fopen("/home/fiddy/toto.txt");

Pour la taille, tu t'en fiches. C'est fwrite() qui s'occupera de ça. Tu te contentes d'écrire dans le fichier, et il grossira tout seul.

Projet intéressant en tout cas :-).
Bon courage.
0
kunamaro Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup pour ta réponse =) J'en prend note.

En effet, on fait pas mal de projets sympa, c'est cool^^ Et les meilleurs sont à venir!

Bonne continuation, ciao!
0