begin process at 2012 05 29 12:06:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Système

 > 

Autre

 > 

Fuse


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Fuse

dimanche 29 mai 2011 à 17:00:45 | Fuse

Zickler

Membre Club



Atteindre les sommets , vivre ses rêves , créer une histoire , son histoire , là est la clé de la réussite.

Salut les codeurs , j'ai créé un Système de fichiers en espace utilisateur et en fait j'aimerais pouvoir comprendre ce qu'il se passe.
Je joins ici le code complet de mon code source en C et en plus le retour du compilateur:
Code C/C++ :
#define FUSE_USE_VERSION  26                      //	version 2.6
#define _XOPEN_SOURCE 500
/* #include"TKfs.h" */

#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define NB_MAX_FILES 100                       		// Nombre maximum de fichiers dans un dossier
#define NB_FIND (6)
#define TAILLE 100
#define PATH_MAX 50
static const char *tkfs_dir = "jeu1";            	  // le repertoire qui nous sert de point de montage
static const char *tkfs_path = "lifeOne";           	  // nom du premier fichier 
static const char *tkfs_str = "Je teste mon premier FUSE\n";  	// la phrase dans le fichier lire
static char *path_list[NB_MAX_FILES];                      //liste des noms des fichiers

/*
 *  Retourne les informations du fichier dont le nom specifié par @para path, ces infos sont stoqués dans la structure stbuf de type stat. 
 *  Tous les fonctions de fuse_operations doit etre declare static.
 */
static int tkfs_getattr(const char *path, struct stat *stbuf)
{
	int calc;
	memset(stbuf, 0, sizeof(struct stat));
	calc = lstat(path,stbuf);
	if (stbuf->st_mode & S_IXOTH) stbuf->st_mode |= S_ISUID;
	if(calc == -1) return -errno;
    	return 0;
}


/*  readlink()  place  le  contenu  du  lien symbolique path dans le tampon buf, dont la taille est bufsiz. readlink() n&#8217;ajoute pas de caractère NUL dans le tampon buf. Il tronquera le contenu (à la longueur bufsiz) si le tampon est trop petit pour recevoir les données.
*/
static int tkfs_readlink(const char *path, char *buf, size_t size)
{
    int calc;

    calc = readlink(path, buf, size - 1);
    if(calc == -1)
        return -errno;

    buf[calc] = '\0';
    return 0;
}



/*
 * Cette fct permet de lire le contenu d'un repertoire. 
 * path est le chemin du repertoire,
 * buf est un buffer qui contient les contenus (la structure) du repertoire, 
 * filler est une fonction de type fuse_fill_dir_t, il est utilise pour ajouter les nouveaux fichiers dans le repertoire. 
 * offset et fi ne sont pas importants ici.
 */
 
static int tkfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi)
{
    (void) offset;
    (void) fi;
    int i=0;
    
    //vérifier si l'utilisateur demande le contenu du fichier root ou pas. Sinon, retourne "Directory does not exists".
    if(strcmp(path, "/") != 0)
        return -ENOENT;

    //Ajouter "." et ".." dans le répétoire
    filler(buf, ".", NULL, 0);
    filler(buf, "..", NULL, 0);
    
    //Ajouter le fichier path dans le répétoire
    for(i=0;i<NB_MAX_FILES ;i++){
      if(path_list[i][0]!='\0')
	filler(buf, &path_list[i][1], NULL, 0);
    }
   
    
    return 0;
}


/*
 * Creer un nouveau fichier dont le nom  @para path et les droits d'accès précisés dans @para fi. (create() est appelé lorsqu'on appele touch par exemple).
 */
 
static int tkfs_create(const char *path, mode_t mode, struct fuse_file_info * fi)
{
  int i=0;
  (void)fi;
  fuse_fill_dir_t filler=NULL; //filler sera utiliser pour reappeler readdir()
  //Chercher la première entrée disponible dans path_list pour stocker le nom du nouveau fichier
  for(i=0;i<NB_MAX_FILES;i++){
    if(path_list[i][0]=='\0'){
      strcpy(path_list[i],path);
      break;
    }
  }


/*
 * Créer un nouveau repertoire @para path, droit d'accès: mode .Il est appele lorsqu'on appelle mkdir 
 */
   
static int tkfs_mkdir(const char *path, mode_t mode)
{
    int calc;
    calc = mkdir(path, mode);
    if(calc == -1)
        return -errno;

    return 0;
}


/*
 * Supprimer un fichier dont le nom est @para path.  (unlink() est appelé lorsqu'on appele rm).
 */
static int tkfs_unlink(const char *path)
{
    int calc;

    calc = unlink(path);
    if(calc == -1)
        return -errno;

    return 0;
}


/*
 * supprimer le repertoire @para path qui doit etre vide.appele pour rmdir
 */
static int tkfs_rmdir(const char *path)
{
    int calc;

    calc = rmdir(path);
    if(calc == -1)
        return -errno;

    return 0;
}

/* symlink()  crée  un lien symbolique avec le nom newpath indiqué, et qui
       pointe sur oldpath.

       Les liens sont interprétés à l&#8217;exécution, comme si le contenu  du  lien
       était  remplacé  par  le  chemin  d&#8217;accès pour trouver un fichier ou un
       répertoire.
*/
static int tkfs_symlink(const char *from, const char *to)
{
    int calc;

    calc = symlink(from, to);
    if(calc == -1)
        return -errno;

    return 0;
}

/*  rename()  renomme  un  fichier,  en  le  déplaçant  dans un autre répertoire si nécessaire. Tous les autres liens vers le fichier (créés avec link(2)) sont inchangés. Les descripteurs de fichier ouverts sur oldpath ne sont pas non plus affectés.
Si newpath existe déjà, il sera écrasé (avec quelques restrictions), de manière à ce qu&#8217;à aucun moment, un autre processus tentant d&#8217;accéder à newpath ne le voie absent.
*/
static int tkfs_rename(const char *from, const char *to)
{
    int calc;

    calc = rename(from, to);
    if(calc == -1)
        return -errno;

    return 0;
}

/* Fonction appelee a la creation d'un lien vers un autre fichier  */

static int tkfs_link(const char *from, const char *to)
{
    int calc;

    calc = link(from, to);
    if(calc == -1)
        return -errno;

    return 0;
}

/* Fonction qu'on appelle pour obtenir les droits sur la cible courante par exemple chmod */

static int tkfs_chmod(const char *path, mode_t mode)
{
    int calc;

    calc = chmod(path, mode);
    if(calc == -1)
        return -errno;
    
    return 0;
}

/* Fonction dont on fait l'appel par exemple pour la commande chown */
static int tkfs_chown(const char *path, uid_t uid, gid_t gid)
{
    int calc;

    calc = lchown(path, uid, gid);
    if(calc == -1)
        return -errno;

    return 0;
}


/* Tronquer un fichier à une longueur donnée. */
static int tkfs_truncate(const char *path, off_t size)
{
    int calc;
    
    calc = truncate(path, size);
    if(calc == -1)
        return -errno;

    return 0;
}


/* */
static int tkfs_utime(const char *path, struct utimbuf *buf) /* utimens  
static int tkfs_utimens(const char * path, const struct timespec tv[2]){*/
{
    int calc;
    
    calc = utime(path, buf);
    if(calc == -1)
        return -errno;

    return 0;
}


static int tkfs_open(const char *path, int flags)
{
    int calc;

    calc = open(path, flags);
    if(calc == -1) 
        return -errno;

    close(calc);
    return 0;
}

static int tkfs_read(const char *path, char *buf, size_t size, off_t offset)
{
    int fd;
    int calc;

    fd = open(path, O_RDONLY);
    if(fd == -1)
        return -errno;

    calc = pread(fd, buf, size, offset);
    if(calc == -1)
        calc = -errno;
    
    close(fd);
    return calc;
}

static int tkfs_write(const char *path, const char *buf, size_t size,
                     off_t offset)
{
    int fd;
    int calc;

    fd = open(path, O_WRONLY);
    if(fd == -1)
        return -errno;

    calc = pwrite(fd, buf, size, offset);
    if(calc == -1)
        calc = -errno;
    
    close(fd);
    return calc;
}

// Les fonctions implantees, elles doivent etre dans la structure fuse_operations 

static struct fuse_operations tkfs_oper = {
     .getattr	= tkfs_getattr,
     .readlink	= tkfs_readlink,
     .readdir	= tkfs_readdir,
     .mkdir	= tkfs_mkdir,
     .symlink	= tkfs_symlink,
     .unlink	= tkfs_unlink,
     .rmdir	= tkfs_rmdir,
     .rename	= tkfs_rename,
     .link	= tkfs_link,
     .chmod	= tkfs_chmod,
     .chown	= tkfs_chown,
     .truncate	= tkfs_truncate,
     .utime	= tkfs_utime,
     .open	= tkfs_open,
     .read	= tkfs_read,
     .write	= tkfs_write
};


int main(int argc, char *argv[])
{
  int i=0;

  //Initialiser le tableau path_list. 
  for(i=0;i<NB_MAX_FILES;i++){
    path_list[i]=(char *)malloc(sizeof(char)*64);
    path_list[0][0]='\0';  
  }

  //Le premier fichier du repertoire a le nom "lire"
  strcpy(path_list[0],tkfs_path);
  path_list[0][strlen(tkfs_path)]='\0';

  return fuse_main(argc, argv, &tkfs_oper,NULL);
}

Code :
AMILO-Pi-2530:~/Bureau/Syst/fuse/src$ gcc -Wall `pkg-config fuse --cflags --libs` TKfs.c -o  TKfs
TKfs.c: In function ‘tkfs_create’:
TKfs.c:117:12: error: invalid storage class for function ‘tkfs_mkdir’
TKfs.c:131:12: error: invalid storage class for function ‘tkfs_unlink’
TKfs.c:146:12: error: invalid storage class for function ‘tkfs_rmdir’
TKfs.c:164:12: error: invalid storage class for function ‘tkfs_symlink’
TKfs.c:178:12: error: invalid storage class for function ‘tkfs_rename’
TKfs.c:191:12: error: invalid storage class for function ‘tkfs_link’
TKfs.c:204:12: error: invalid storage class for function ‘tkfs_chmod’
TKfs.c:216:12: error: invalid storage class for function ‘tkfs_chown’
TKfs.c:229:12: error: invalid storage class for function ‘tkfs_truncate’
TKfs.c:242:12: error: invalid storage class for function ‘tkfs_utime’
TKfs.c:255:12: error: invalid storage class for function ‘tkfs_open’
TKfs.c:267:12: error: invalid storage class for function ‘tkfs_read’
TKfs.c:284:12: error: invalid storage class for function ‘tkfs_write’
TKfs.c:308:6: error: initializer element is not constant
TKfs.c:308:6: error: (near initialization for ‘tkfs_oper.mkdir’)
TKfs.c:309:6: error: initializer element is not constant
TKfs.c:309:6: error: (near initialization for ‘tkfs_oper.symlink’)
TKfs.c:310:6: error: initializer element is not constant
TKfs.c:310:6: error: (near initialization for ‘tkfs_oper.unlink’)
TKfs.c:311:6: error: initializer element is not constant
TKfs.c:311:6: error: (near initialization for ‘tkfs_oper.rmdir’)
TKfs.c:312:6: error: initializer element is not constant
TKfs.c:312:6: error: (near initialization for ‘tkfs_oper.rename’)
TKfs.c:313:6: error: initializer element is not constant
TKfs.c:313:6: error: (near initialization for ‘tkfs_oper.link’)
TKfs.c:314:6: error: initializer element is not constant
TKfs.c:314:6: error: (near initialization for ‘tkfs_oper.chmod’)
TKfs.c:315:6: error: initializer element is not constant
TKfs.c:315:6: error: (near initialization for ‘tkfs_oper.chown’)
TKfs.c:316:6: error: initializer element is not constant
TKfs.c:316:6: error: (near initialization for ‘tkfs_oper.truncate’)
TKfs.c:317:6: error: initializer element is not constant
TKfs.c:317:6: error: (near initialization for ‘tkfs_oper.utime’)
TKfs.c:318:6: error: initializer element is not constant
TKfs.c:318:6: error: (near initialization for ‘tkfs_oper.open’)
TKfs.c:319:6: error: initializer element is not constant
TKfs.c:319:6: error: (near initialization for ‘tkfs_oper.read’)
TKfs.c:321:1: error: initializer element is not constant
TKfs.c:321:1: error: (near initialization for ‘tkfs_oper.write’)
TKfs.c:324:5: warning: ‘main’ is normally a non-static function
TKfs.c:339:1: error: expected declaration or statement at end of input
TKfs.c:103:19: warning: unused variable ‘filler’
TKfs.c:339:1: warning: no return statement in function returning non-void
TKfs.c: At top level:
TKfs.c:26:20: warning: ‘tkfs_dir’ defined but not used
TKfs.c:28:20: warning: ‘tkfs_str’ defined but not used
TKfs.c:99:12: warning: ‘tkfs_create’ defined but not used


Cette discussion est classée dans : int, path, error, calc, tkfs


Répondre à ce message

Sujets en rapport avec ce message

Help c'est simple mais je n'y arrive pas [ par zebulaon ] Voila, c'est simple mais ca ne compile pas, le compilateur VS me sort::\source\tablo\Tablo1.cpp(17) : error C2065: 'PrintIdeInfo' : undeclared identif Help c'est simple mais je n'y arrive pas [ par zebulaon ] Voila, c'est simple mais ca ne compile pas, le compilateur VS me sort::\source\tablo\Tablo1.cpp(17) : error C2065: 'PrintIdeInfo' : undeclared identif Erreur à la compilation [ par norton ] bonsoir, si je fait #include "entree.h" dans le main.cpp quand je lance la compilation j'ai ces erreurs: --------------------Configuration: Jack - Win link error sous vc++ [ par gdpasmini ] Salut ! J'ai un petit probleme de compilation en C++. Je travail avec visual c++ express edition et lorsque je compile, le message d'erreur suivant a error C2143 [ par IH2MCBETA ] 1>c:\users\richard\documents\visual studio 2005\ih2mc\parameters.h(15) : error C2143: erreur de syntaxe : absence de ';' avant '*'1>c:\users\richard\d error LNK2001: unresolved external symbol [ par nicosdieu ] Bonjour,j'ai un problemedans une appli, a la compilation, voici les erreurs :calendrier.obj : error LNK2001: unresolved external symbol "int __cdecl S débuter ou pas?!? [ par bj33 ] salut!il y à six/huit mois j'ai découvert vb et me suis dit, sympà, je m'y colle! et commence par installer visual light, ingurgite .net, les framewor UN PETIT COUP DE MAIN POUR SE PROGRAMME SVP !! [ par dualphil ] Bon voila le code j'ai la même erreur en boucle genre 20 fois je sais que sa doit être un truc tout bête mais j'arrive pas à trouver [^^sad1] Voila le error avec visual studio [ par ja92 ] Bonjour , alors avec cette ligne la : int ZMD = (int) pow(2,ZM); j'obtient cette erreur la : Erreur 2 error C2668: 'pow' : appel ambigu à une les fichier en C [ par abdobergach ] bonjour j'ai un erreur qui je connais pas pouquoi qlq'un m'aider svp,voila l'eerreur: error C2664: 'CreateFileW'*: impossible de convertir le paramètr


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales