⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fuse_mt.c

📁 FUSE文件系统开发工具,将内核层面的文件系统开发过程平移到应用层面上来。
💻 C
字号:
/*  FUSE: Filesystem in Userspace  Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>  This program can be distributed under the terms of the GNU LGPLv2.  See the file COPYING.LIB.*/#include "fuse_i.h"#include "fuse_misc.h"#include "fuse_lowlevel.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <assert.h>struct procdata {	struct fuse *f;	struct fuse_chan *prevch;	struct fuse_session *prevse;	fuse_processor_t proc;	void *data;};static void mt_session_proc(void *data, const char *buf, size_t len,			    struct fuse_chan *ch){	struct procdata *pd = (struct procdata *) data;	struct fuse_cmd *cmd = *(struct fuse_cmd **) buf;	(void) len;	(void) ch;	pd->proc(pd->f, cmd, pd->data);}static void mt_session_exit(void *data, int val){	struct procdata *pd = (struct procdata *) data;	if (val)		fuse_session_exit(pd->prevse);	else		fuse_session_reset(pd->prevse);}static int mt_session_exited(void *data){	struct procdata *pd = (struct procdata *) data;	return fuse_session_exited(pd->prevse);}static int mt_chan_receive(struct fuse_chan **chp, char *buf, size_t size){	struct fuse_cmd *cmd;	struct procdata *pd = (struct procdata *) fuse_chan_data(*chp);	assert(size >= sizeof(cmd));	cmd = fuse_read_cmd(pd->f);	if (cmd == NULL)		return 0;	*(struct fuse_cmd **) buf = cmd;	return sizeof(cmd);}int fuse_loop_mt_proc(struct fuse *f, fuse_processor_t proc, void *data){	int res;	struct procdata pd;	struct fuse_session *prevse = fuse_get_session(f);	struct fuse_session *se;	struct fuse_chan *prevch = fuse_session_next_chan(prevse, NULL);	struct fuse_chan *ch;	struct fuse_session_ops sop = {		.exit = mt_session_exit,		.exited = mt_session_exited,		.process = mt_session_proc,	};	struct fuse_chan_ops cop = {		.receive = mt_chan_receive,	};	pd.f = f;	pd.prevch = prevch;	pd.prevse = prevse;	pd.proc = proc;	pd.data = data;	se = fuse_session_new(&sop, &pd);	if (se == NULL)		return -1;	ch = fuse_chan_new(&cop, fuse_chan_fd(prevch),			   sizeof(struct fuse_cmd *), &pd);	if (ch == NULL) {		fuse_session_destroy(se);		return -1;	}	fuse_session_add_chan(se, ch);	res = fuse_session_loop_mt(se);	fuse_session_destroy(se);	return res;}int fuse_loop_mt(struct fuse *f){	if (f == NULL)		return -1;	return fuse_session_loop_mt(fuse_get_session(f));}FUSE_SYMVER(".symver fuse_loop_mt_proc,__fuse_loop_mt@");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -