Ето как би изглеждало нещо подобно с npfs за 9p. Трябва да извикаш fsstart с директорията, където искаш да бъде монтирано дървото. Предполагам, че с fuse ще е дори и по-лесно и кратко.
Трябва да промениш confread и confwrite да правят каквото искаш. Ако искаш повече файлове, дефинирай операции за тях и ги добави в fsstart. Ако искаш да поддържаш повече от един потребител ще трябва да дефинираш повече операции.
П.П. Не гарантирам, че кода ще работи, надрасках го набързо и ме мързи да го тествам.
#define _XOPEN_SOURCE 600
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <fcntl.h>
#include <assert.h>
#include "npfs.h"
static Npfile* dirfirst(Npfile *);
static Npfile* dirnext(Npfile *, Npfile *);
static int confread(Npfilefid *, u64, u32, u8*, Npreq *);
static int confwrite(Npfilefid *, u64, u32, u8*, Npreq *);
static int confwstat(Npfile *, Npstat *);
static void connclose(Npconn *);
static Npsrv *srv;
static Npfile *root;
static Npfile *conf;
static Npdirops rootops = {
.first = dirfirst,
.next = dirnext,
};
static Npfileops confops = {
.read = confread,
.write = confwrite,
.wstat = confwstat,
};
static int
fsstart(char *mntpt) {
Npuser *user;
char *opts, *s;
user = np_unix_users->uid2user(np_unix_users, geteuid());
root = npfile_alloc(NULL, strdup(""), 0755|Dmdir, 0, &rootops, NULL);
root->parent = root;
npfile_incref(root);
root->atime = time(NULL);
root->mtime = root->atime;
root->uid = user;
root->gid = user->dfltgroup;
root->muid = user;
conf = npfile_alloc(root, strdup("conf"), 0644, 1, &confops, NULL);
npfile_incref(conf);
root->dirfirst = conf;
root->dirlast = conf;
srv = np_pipesrv_create(1);
if (!srv)
return -1;
npfile_init_srv(srv, root);
np_pipesrv_mount(srv, mntpt, user->uname, 0, NULL);
return 0;
}
static Npfile*
dirfirst(Npfile *dir)
{
if (dir->dirfirst)
npfile_incref(dir->dirfirst);
return dir->dirfirst;
}
static Npfile*
dirnext(Npfile *dir, Npfile *prevchild)
{
if (prevchild->next)
npfile_incref(prevchild->next);
return prevchild->next;
}
static int
confread(Npfilefid* file, u64 offset, u32 count, u8* data, Npreq *req)
{
char buf[128];
/* print your configuration here */
snprintf(buf, sizeof(buf), "tarator");
len = strlen(buf);
if (offset > len)
return 0;
if (offset+count > len)
count = len - offset;
memmove(data, buf+offset, count)
return count;
}
static int
confwrite(Npfilefid* file, u64 offset, u32 count, u8* data, Npreq *req)
{
/* the content is in data */
return 0;
}
static int
confwstat(Npfile* file, Npstat* stat)
{
return 1;
}