Accueil > Forum > > > > Fuse
Fuse
dimanche 29 mai 2011 à 17:00:45 |
Fuse

Zickler
|
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’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’exécution, comme si le contenu du lien
était remplacé par le chemin d’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’à aucun moment, un autre processus tentant d’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
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|