[Devel] Re: [patch 1/4][resend] fuse-procfs: proxy proc files
Krzysztof Taraszka
krzysztof.taraszka at gnuhosting.net
Mon Sep 14 13:38:58 PDT 2009
Hi Daniel,
right now I do not have any new tasks so I can take a look your patches
and... they won't to apply (patches from 2 to 4).
Can you send me your current procfs.c single file with patches added?
Thanks
--
K
2009/9/4 Daniel Lezcano <daniel.lezcano at free.fr>
> This patch makes possible to mount the fuse-procfs on top of /proc
> and display the content of /proc via fuse.
>
> Signed-off-by: Daniel Lezcano <daniel.lezcano at free.fr>
> ---
> procfs.c | 246
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 246 insertions(+)
>
> Index: lxcfs/procfs.c
> ===================================================================
> --- /dev/null
> +++ lxcfs/procfs.c
> @@ -0,0 +1,246 @@
> +
> +#include <fuse.h>
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <libgen.h>
> +#include <errno.h>
> +#include <dirent.h>
> +#include <mntent.h>
> +#include <limits.h>
> +#include <fcntl.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <sys/param.h>
> +
> +enum {
> + PROCFS_PROXY,
> +};
> +
> +struct procfs_info {
> + DIR *procdir;
> + DIR *subdir;
> +};
> +
> +struct proxy_file {
> + int fd;
> +};
> +
> +struct procfs_file {
> + int type;
> + union {
> + struct proxy_file proxy;
> + } file;
> +};
> +
> +static int procfs_readlink(const char *path, char *buf, size_t bufsiz)
> +{
> + struct fuse_context *context = fuse_get_context();
> + struct procfs_info *fsinfo = context->private_data;
> + char *bname = strchr(path, '/');
> + int ret;
> +
> + if (strcmp(path, "/"))
> + bname += 1;
> +
> + ret = readlinkat(dirfd(fsinfo->procdir), bname, buf, bufsiz);
> + if (ret < 0)
> + return -errno;
> +
> + buf[ret] = '\0';
> +
> + return 0;
> +}
> +
> +static int procfs_getattr(const char *path, struct stat *stbuf)
> +{
> + struct fuse_context *context = fuse_get_context();
> + struct procfs_info *fsinfo = context->private_data;
> + char *bname = strchr(path, '/');
> +
> + if (strcmp(path, "/"))
> + bname += 1;
> +
> + if (fstatat(dirfd(fsinfo->procdir), bname, stbuf,
> AT_SYMLINK_NOFOLLOW))
> + return -errno;
> +
> + return 0;
> +}
> +
> +static int procfs_open(const char *path, struct fuse_file_info *fi)
> +{
> + struct fuse_context *context = fuse_get_context();
> + struct procfs_info *fsinfo = context->private_data;
> + char *bname = strchr(path, '/');
> + struct procfs_file *pfile;
> +
> + if (strcmp(path, "/"))
> + bname += 1;
> +
> + pfile = malloc(sizeof(*pfile));
> + if (!pfile)
> + return -ENOMEM;
> +
> + pfile->type = PROCFS_PROXY;
> + pfile->file.proxy.fd = openat(dirfd(fsinfo->procdir), bname,
> fi->flags);
> + if (pfile->file.proxy.fd < 0) {
> + free(pfile);
> + return -errno;
> + }
> +
> + fi->fh = (typeof(fi->fh))pfile;
> +
> + return 0;
> +}
> +
> +static int procfs_read(const char *path, char *buf, size_t size,
> + off_t offset, struct fuse_file_info *fi)
> +{
> + int ret;
> + struct procfs_file *pfile = (typeof(pfile))fi->fh;;
> +
> + switch (pfile->type) {
> +
> + case PROCFS_PROXY:
> + ret = read(pfile->file.proxy.fd, buf, size);
> + if (ret < 0)
> + return -errno;
> + break;
> + }
> +
> + return ret;
> +}
> +
> +static int procfs_write(const char *path, const char *buf, size_t size,
> + off_t offset, struct fuse_file_info *fi)
> +{
> + int ret;
> + struct procfs_file *pfile = (typeof(pfile))fi->fh;;
> +
> + switch (pfile->type) {
> +
> + case PROCFS_PROXY:
> + ret = write(pfile->file.proxy.fd, buf, size);
> + if (ret < 0)
> + return -errno;
> + break;
> + }
> +
> + return ret;
> +}
> +
> +static int procfs_release(const char *path, struct fuse_file_info *fi)
> +{
> + struct procfs_file *pfile = (typeof(pfile))fi->fh;;
> +
> + switch (pfile->type) {
> +
> + case PROCFS_PROXY:
> + if (close(pfile->file.proxy.fd))
> + return -errno;
> + break;
> + }
> +
> + return 0;
> +}
> +
> +static int procfs_opendir(const char *path, struct fuse_file_info *fi)
> +{
> + struct fuse_context *context = fuse_get_context();
> + struct procfs_info *fsinfo = context->private_data;
> + char *bname = strchr(path, '/');
> + int fd;
> +
> + if (!strcmp(path, "/")) {
> + fsinfo->subdir = fsinfo->procdir;
> + return 0;
> + }
> +
> + fd = openat(dirfd(fsinfo->procdir), bname + 1, O_DIRECTORY);
> + if (fd < 0)
> + return -errno;
> +
> + fsinfo->subdir = fdopendir(fd);
> +
> + return 0;
> +}
> +
> +static int procfs_readdir(const char *path, void *buf, fuse_fill_dir_t
> filler,
> + off_t offset, struct fuse_file_info *fi)
> +{
> + struct fuse_context *context = fuse_get_context();
> + struct procfs_info *fsinfo = context->private_data;
> + struct dirent dirent, *direntp;
> +
> + if (!offset)
> + rewinddir(fsinfo->subdir);
> +
> + while (!readdir_r(fsinfo->subdir, &dirent, &direntp) && direntp)
> + if (filler(buf, direntp->d_name, NULL, offset++))
> + break;
> +
> + return 0;
> +}
> +
> +static int procfs_releasedir(const char *path, struct fuse_file_info *fi)
> +{
> + struct fuse_context *context = fuse_get_context();
> + struct procfs_info *fsinfo = context->private_data;
> + DIR *subdir = fsinfo->subdir;
> +
> + fsinfo->subdir = NULL;
> + if (subdir && subdir != fsinfo->procdir)
> + closedir(subdir);
> +
> + return 0;
> +}
> +
> +static void *procfs_init(struct fuse_conn_info *conn)
> +{
> + struct procfs_info *fsinfo;
> +
> + fsinfo = malloc(sizeof(*fsinfo));
> + if (!fsinfo)
> + return NULL;
> +
> + fsinfo->procdir = opendir("/proc");
> + if (!fsinfo->procdir)
> + goto out_free_fsinfo;
> +
> + fsinfo->subdir = NULL;
> +out:
> + return fsinfo;
> +
> +out_free_fsinfo:
> + free(fsinfo);
> + fsinfo = NULL;
> + goto out;
> +}
> +
> +static void procfs_destroy(void *private_data)
> +{
> + struct procfs_info *fsinfo = private_data;
> +
> + closedir(fsinfo->procdir);
> + free(fsinfo);
> +}
> +
> +static struct fuse_operations procfs_ops = {
> + .readlink = procfs_readlink,
> + .getattr = procfs_getattr,
> + .open = procfs_open,
> + .read = procfs_read,
> + .write = procfs_write,
> + .opendir = procfs_opendir,
> + .releasedir = procfs_releasedir,
> + .readdir = procfs_readdir,
> + .release = procfs_release,
> + .init = procfs_init,
> + .destroy = procfs_destroy,
> +};
> +
> +int main(int argc, char *argv[])
> +{
> + return fuse_main(argc, argv, &procfs_ops, NULL);
> +}
>
>
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list