2009-10-04 7 views
3

Je développe un système de fichiers de fusibles qui stocke des données dans la RAM, mais j'ai des problèmes quand j'écris quelque chose dans un fichier. Le fichier se transforme en un fichier vide.Fuse Filesystem Problème

Voici le code:

#define FUSE_USE_VERSION 26 

#include <fuse/fuse.h> 
#include <string.h> 
#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 

char hello_data[200] = {'h', 'e', 'l', 'l', 'o', '\n'}; 
int hello_size = 6; 

int homsifs_getattr(const char* path, struct stat* stbuf) 
{ 
    memset(stbuf, 0, sizeof(struct stat)); 

    if (strcmp(path, "/") == 0) 
     stbuf->st_mode = S_IFDIR | 0666; 
    else if (strcmp(path, "/hello") == 0) 
    { 
     stbuf->st_mode = S_IFREG | 0666; 
     stbuf->st_size = hello_size; 
    } 
    else 
     return -ENOENT; 

    return 0; 
} 

int homsifs_readdir(const char* path, void* buf, fuse_fill_dir_t filler, 
off_t offset, struct fuse_file_info* fi) 
{ 
    if (strcmp(path, "/") != 0) 
     return -ENOENT; 

    filler(buf, ".", NULL, 0); 
    filler(buf, "..", NULL, 0); 
    filler(buf, "hello", NULL, 0); 

    return 0; 
} 

int homsifs_open(const char* path, struct fuse_file_info* fi) 
{ 
    if (strcmp(path, "/hello") != 0) 
     return -ENOENT; 

    return 0; 
} 

int homsifs_read(const char* path, char* buf, size_t size, off_t offset, 
struct fuse_file_info* fi) 
{ 
    int offset_size = hello_size - offset; 

    if (size > offset_size) 
     size = offset_size; 

    memcpy(buf, hello_data + offset, size); 

    return size; 
} 

int homsifs_truncate(const char* path, off_t size) 
{ 
    if (size > 200) 
     return -ENOMEM; 

    if (hello_size < size) 
     memset(hello_data + size, 0, size - hello_size); 

    hello_size = size; 

    return 0; 
} 

int homsifs_write(const char* path, const char* buf, size_t size, off_t offset, 
struct fuse_file_info* fi) 
{ 
    if (strcmp(path, "/hello") != 0) 
     return -ENOENT; 

    memcpy(hello_data + offset, buf, size); 

    return size; 
} 

struct fuse_operations homsifs_operations = 
{ 
    .getattr = homsifs_getattr, 
    .readdir = homsifs_readdir, 
    .open = homsifs_open, 
    .read = homsifs_read, 
    .truncate = homsifs_truncate, 
    .write = homsifs_write 
}; 

int main(int argc, char** argv) 
{ 
    return fuse_main(argc, argv, &homsifs_operations, NULL); 
} 

Tout le monde sait ce qui ne va pas?

Merci.

+1

Vous pouvez également stocker des fichiers dans/dev/shm qui utilise la RAM –

+1

Il y a probablement une raison pour laquelle il veut utiliser FUSE. :) – BobbyShaftoe

Répondre

2

Lorsqu'un programme ouvre le fichier en écriture, il est tronqué. Après cela, toutes les données écrites sont inaccessibles car vous ne mettez pas à jour correctement hello_size dans homsifs_write.