Utilisation de fuse

Utilisation de fuse - C - Programmation

Marsh Posté le 09-05-2008 à 20:57:28    

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.

Reply

Marsh Posté le 09-05-2008 à 20:57:28   

Reply

Marsh Posté le 09-05-2008 à 20:58:54    

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

Reply

Marsh Posté le 09-05-2008 à 21:01:04    

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
Reply

Marsh Posté le 09-05-2008 à 21:02:51    

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

Reply

Marsh Posté le 09-05-2008 à 21:28:34    

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
Reply

Marsh Posté le 09-05-2008 à 21:31:24    

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

Reply

Marsh Posté le 09-05-2008 à 21:35:44    

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.     }

Reply

Marsh Posté le 09-05-2008 à 21:39:05    

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.

Reply

Marsh Posté le 09-05-2008 à 22:00:14    

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.

Reply

Marsh Posté le 10-05-2008 à 10:01:20    

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é!  --
Reply

Marsh Posté le 10-05-2008 à 10:01:20   

Reply

Marsh Posté le 10-05-2008 à 12:13:51    

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.

Reply

Marsh Posté le 28-05-2008 à 22:11:52    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed