Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1473 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Utilisation de fuse

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Utilisation de fuse

n°1730380
med93
Posté le 09-05-2008 à 20:57:28  profilanswer
 

Bonjour, j'ai un projet de systeme.
Le but est de creer un systeme de fichier que l'on doit monter avec fuse.
Pour tester notre systeme de fichier on utilise un fichier ordinaire qui sera notre disque physique.
J'ai fait la gestion du disque.
Le probleme est lorque je monte mon disque avec fuse. Des que j'effectue une modification sur mon disque, j'obtient une erreur " Le logiciel a provoque l'abandon de la connexion", cependant la modification est bien effectue sur mon disque.
Lorque j'ai cette erreur il m'est alors impossible de remonter le disque.
Le projet est fait en C, j'utilise une debian etch, et comme compilateur gcc.
 
Si quelqu'un a deja manipule fuse et qui sait d'ou peut venir cette erreur, une aide serait la bienvenue.
Mes recherche sur google n'ont pas ete fructueuses.
 
Pour plus d'info, n'hesitez pas a poser des question.
 
                    Merci d'avance.

mood
Publicité
Posté le 09-05-2008 à 20:57:28  profilanswer
 

n°1730381
Elmoricq
Modérateur
Posté le 09-05-2008 à 20:58:54  profilanswer
 

Peux-tu poster le code de la fonction qui provoque l'erreur ?

n°1730382
med93
Posté le 09-05-2008 à 21:01:04  profilanswer
 

Code :
  1. static int hello_chmod (const char * path, mode_t mode) {
  2.     Inode *current;
  3.     unsigned int num_ino = 0;
  4.     unsigned char * ptr_deb = NULL, * ptr_fin = NULL, * name_search = NULL;
  5.     time_t time_buf[2];
  6.  
  7.     if(path == NULL){
  8.         fprintf(stderr,"path == NULL, %d %s\n", __LINE__, __FILE__);
  9.         return FALSE;
  10.         }
  11.  
  12.     current = root;
  13.     ptr_deb = (unsigned char *)(path) + 1;
  14.  
  15.     printf("klmp_chmod path : %s", path);
  16.     
  17.     if (strcmp(path, "/" ) == 0) {
  18.         Set_Inode_Mode (root, S_IFDIR | mode);
  19.         time_buf[0] = time_buf[1] = time(NULL);
  20.         Set_Inode_Time (root, time_buf);
  21.         Clean_Fuse();
  22.         return TRUE;
  23.         }
  24.  
  25.     while( (ptr_fin = (unsigned char *)strchr((const char *)ptr_deb, '/')) != NULL ){
  26.         strncpy((char *)name_search, (char *)ptr_deb, ptr_fin - ptr_deb - 1);
  27.  
  28.         if( FALSE == Search_Element(current, name_search, &num_ino) ){
  29.             fprintf(stderr,"%s non trouvee\n", name_search);
  30.             return FALSE;
  31.             }
  32.  
  33.         current = root + num_ino;
  34.         ptr_deb = ptr_fin + 1;
  35.         }
  36.  
  37.     strcpy((char *)name_search, (char *)ptr_deb);
  38.  
  39.     if( FALSE == Search_Element(current, name_search, &num_ino) ){
  40.         fprintf(stderr,"%s non trouvee\n", name_search);
  41.         return FALSE;
  42.         }
  43.  
  44.     current = root + num_ino;
  45.     time_buf[0] = time_buf[1] = time(NULL);
  46.     Set_Inode_Time (current, time_buf);
  47.     Set_Inode_Mode (current, mode);
  48.     return TRUE;
  49.     }


Message édité par Elmoricq le 09-05-2008 à 21:25:13
n°1730383
med93
Posté le 09-05-2008 à 21:02:51  profilanswer
 

Ici les modifications sont apportees sur l'inode qui reference le fichier sur mon disque.

n°1730386
Elmoricq
Modérateur
Posté le 09-05-2008 à 21:28:34  profilanswer
 

Bon je ne suis pas allé très loin dans l'analyse, mais il y a déjà un gros truc qui ne va pas : tu stockes des données dans name_search à coup de strncpy(), mais cette variable pointe sur NULL, tu ne lui as pas alloué de mémoire.
Normalement, ça sort en coredump à cet endroit.

 


edit : je me suis permis de mettre ton code entre balises [code=cpp ][/code ] (sans les espaces), pour le rendre lisible.


Message édité par Elmoricq le 09-05-2008 à 21:28:58
n°1730387
med93
Posté le 09-05-2008 à 21:31:24  profilanswer
 

Je n'avais pas remarque, je corige et je te dirai si c'etait ca le probleme.

n°1730389
med93
Posté le 09-05-2008 à 21:35:44  profilanswer
 

Code :
  1. /** Change the permission bits of a file */
  2. static int hello_chmod (const char * path, mode_t mode) {
  3.     Inode *current;
  4.     unsigned int num_ino = 0;
  5.     unsigned char * ptr_deb = NULL, * ptr_fin = NULL, name_search[32];
  6.     time_t time_buf[2];
  7.  
  8.     if(path == NULL){
  9.         fprintf(stderr,"path == NULL, %d %s\n", __LINE__, __FILE__);
  10.         return FALSE;
  11.         }
  12.  
  13.     current = root;
  14.     ptr_deb = (unsigned char *)(path) + 1;
  15.  
  16.     printf("klmp_chmod path : %s", path);
  17.     
  18.     if (strcmp(path, "/" ) == 0) {
  19.         Set_Inode_Mode (root, S_IFDIR | mode);
  20.         time_buf[0] = time_buf[1] = time(NULL);
  21.         Set_Inode_Time (root, time_buf);
  22.         Clean_Fuse();
  23.         return TRUE;
  24.         }
  25.  
  26.     while( (ptr_fin = (unsigned char *)strchr((const char *)ptr_deb, '/')) != NULL ){
  27.         memset(name_search,0,32);
  28.         strncpy((char *)name_search, (char *)ptr_deb, ptr_fin - ptr_deb - 1);
  29.  
  30.         if( FALSE == Search_Element(current, name_search, &num_ino) ){
  31.             fprintf(stderr,"%s non trouvee\n", name_search);
  32.             return FALSE;
  33.             }
  34.  
  35.         current = root + num_ino;
  36.         ptr_deb = ptr_fin + 1;
  37.         }
  38.     memset(name_search,0,32);
  39.     strcpy((char *)name_search, (char *)ptr_deb);
  40.  
  41.     if( FALSE == Search_Element(current, name_search, &num_ino) ){
  42.         fprintf(stderr,"%s non trouvee\n", name_search);
  43.         return FALSE;
  44.         }
  45.  
  46.     current = root + num_ino;
  47.     time_buf[0] = time_buf[1] = time(NULL);
  48.     Set_Inode_Time (current, time_buf);
  49.     Set_Inode_Mode (current, mode);
  50.     return TRUE;
  51.     }

n°1730391
med93
Posté le 09-05-2008 à 21:39:05  profilanswer
 

J'ai mis la variable name_search en un tableau de 32 char. J'ai pour le moment limite la taille des noms.
J'ai toujours la meme erreur.
 
kirouani@debiankirouani:~/Desktop/klmp$ ./bin/klmp /tmp/klmp.fuse/  /*Monte mon fichier*/
kirouani@debiankirouani:/tmp/klmp.fuse$ chmod 777 ./
chmod: modification des permissions de `./': Le logiciel a provoqué l'abandon de la connexion.
 
/tmp/klmp.fuse est mon point de montage.

n°1730397
med93
Posté le 09-05-2008 à 22:00:14  profilanswer
 

Je repete que le probleme n'a lieu que lorsqu'il y a une modification sur le disque.
Un ls ou un cd fonctionne et ne provoque pas d'erreur.

n°1730440
gilou
Modérateur
Modzilla
Posté le 10-05-2008 à 10:01:20  profilanswer
 

Citation :

current = root;

Je n'ai pas vu cette variable root declarée dans la fonction. Tu bosses avec de l'effet de bord pour ce genre de fonction? Tu aimes vivre dangereusement alors...
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 10-05-2008 à 10:01:20  profilanswer
 

n°1730465
med93
Posté le 10-05-2008 à 12:13:51  profilanswer
 

root correspondant a l'inode contenant le repertoire racine.
Il est vrai que je code a l'arrache pour le moment.
Je vais corriger tout ca.

n°1738525
med93
Posté le 28-05-2008 à 22:11:52  profilanswer
 

Desole, ca fait longtemps que je ne me suis pas connecte examen oblige.
Poue le projet c'est pas mal avance, l'erreur etait du a une seg fault du a une vieille version d'un fichier c que j'utilisait.
C'est la premiere fois que j'utilise svn.
J'ai pas mal avance sur le projet, il ne reste plus qu'un leger probleme.
Il a lieu lorsque j'essaie d'ecrire sur un fichier non vide(ecrit avec vi.), La premiere fois il n'y a aucun probleme.
Lors de la sauvegarde (:w) il me repond erreur E212 impossible d''ouvrir le fichier pour y ecrire, pourtant le fichier ouvert possede les bon droits. Si je sauvegarde avec :w! les données ont bien ete ecrite.
Si quelqu'un sait d'ou ca peut venir faites moi signe.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Utilisation de fuse

 

Sujets relatifs
utilisation de la commande awk dans un script shellUtilisation de borland c++ builder 6.0
IDE Dev-C++ et utilisation de bibliothéqueutilisation en C de fonctions écrites en C#
utilisation de nombre entier tres grand!Utilisation d'un driver
[AJAX] utilisation de listbox généréesutilisation de NOT en VBA
utilisation d'une procedure stockée TSQL depuis access[UML]Extends : mon diagramme de cas d'utilisation est bon?
Plus de sujets relatifs à : Utilisation de fuse


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR