亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mount.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 "config.h"#include "fuse_i.h"#include "fuse_misc.h"#include "fuse_opt.h"#include "fuse_common_compat.h"#include "mount_util.h"#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <stddef.h>#include <fcntl.h>#include <errno.h>#include <sys/poll.h>#include <sys/socket.h>#include <sys/un.h>#include <sys/wait.h>#include <sys/mount.h>#define FUSERMOUNT_PROG		"fusermount"#define FUSE_COMMFD_ENV		"_FUSE_COMMFD"#ifndef HAVE_FORK#define fork() vfork()#endif#ifndef MS_DIRSYNC#define MS_DIRSYNC 128#endifenum {	KEY_KERN_FLAG,	KEY_KERN_OPT,	KEY_FUSERMOUNT_OPT,	KEY_SUBTYPE_OPT,	KEY_MTAB_OPT,	KEY_ALLOW_ROOT,	KEY_RO,	KEY_HELP,	KEY_VERSION,};struct mount_opts {	int allow_other;	int allow_root;	int ishelp;	int flags;	int nonempty;	int blkdev;	char *fsname;	char *subtype;	char *subtype_opt;	char *mtab_opts;	char *fusermount_opts;	char *kernel_opts;};#define FUSE_MOUNT_OPT(t, p) { t, offsetof(struct mount_opts, p), 1 }static const struct fuse_opt fuse_mount_opts[] = {	FUSE_MOUNT_OPT("allow_other",	    allow_other),	FUSE_MOUNT_OPT("allow_root",	    allow_root),	FUSE_MOUNT_OPT("nonempty",	    nonempty),	FUSE_MOUNT_OPT("blkdev",	    blkdev),	FUSE_MOUNT_OPT("fsname=%s",	    fsname),	FUSE_MOUNT_OPT("subtype=%s",	    subtype),	FUSE_OPT_KEY("allow_other",	    KEY_KERN_OPT),	FUSE_OPT_KEY("allow_root",	    KEY_ALLOW_ROOT),	FUSE_OPT_KEY("nonempty",	    KEY_FUSERMOUNT_OPT),	FUSE_OPT_KEY("blkdev",		    KEY_FUSERMOUNT_OPT),	FUSE_OPT_KEY("fsname=",		    KEY_FUSERMOUNT_OPT),	FUSE_OPT_KEY("subtype=",	    KEY_SUBTYPE_OPT),	FUSE_OPT_KEY("large_read",	    KEY_KERN_OPT),	FUSE_OPT_KEY("blksize=",	    KEY_KERN_OPT),	FUSE_OPT_KEY("default_permissions", KEY_KERN_OPT),	FUSE_OPT_KEY("max_read=",	    KEY_KERN_OPT),	FUSE_OPT_KEY("max_read=",	    FUSE_OPT_KEY_KEEP),	FUSE_OPT_KEY("user=",		    KEY_MTAB_OPT),	FUSE_OPT_KEY("-r",		    KEY_RO),	FUSE_OPT_KEY("ro",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("rw",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("suid",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("nosuid",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("dev",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("nodev",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("exec",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("noexec",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("async",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("sync",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("dirsync",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("atime",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("noatime",		    KEY_KERN_FLAG),	FUSE_OPT_KEY("-h",		    KEY_HELP),	FUSE_OPT_KEY("--help",		    KEY_HELP),	FUSE_OPT_KEY("-V",		    KEY_VERSION),	FUSE_OPT_KEY("--version",	    KEY_VERSION),	FUSE_OPT_END};static void mount_help(void){	fprintf(stderr,"    -o allow_other         allow access to other users\n""    -o allow_root          allow access to root\n""    -o nonempty            allow mounts over non-empty file/dir\n""    -o default_permissions enable permission checking by kernel\n""    -o fsname=NAME         set filesystem name\n""    -o subtype=NAME        set filesystem type\n""    -o large_read          issue large read requests (2.4 only)\n""    -o max_read=N          set maximum size of read requests\n""\n");}static void exec_fusermount(const char *argv[]){	execv(FUSERMOUNT_DIR "/" FUSERMOUNT_PROG, (char **) argv);	execvp(FUSERMOUNT_PROG, (char **) argv);}static void mount_version(void){	int pid = fork();	if (!pid) {		const char *argv[] = { FUSERMOUNT_PROG, "--version", NULL };		exec_fusermount(argv);		_exit(1);	} else if (pid != -1)		waitpid(pid, NULL, 0);}struct mount_flags {	const char *opt;	unsigned long flag;	int on;};static struct mount_flags mount_flags[] = {	{"rw",	    MS_RDONLY,	    0},	{"ro",	    MS_RDONLY,	    1},	{"suid",    MS_NOSUID,	    0},	{"nosuid",  MS_NOSUID,	    1},	{"dev",	    MS_NODEV,	    0},	{"nodev",   MS_NODEV,	    1},	{"exec",    MS_NOEXEC,	    0},	{"noexec",  MS_NOEXEC,	    1},	{"async",   MS_SYNCHRONOUS, 0},	{"sync",    MS_SYNCHRONOUS, 1},	{"atime",   MS_NOATIME,	    0},	{"noatime", MS_NOATIME,	    1},	{"dirsync", MS_DIRSYNC,	    1},	{NULL,	    0,		    0}};static void set_mount_flag(const char *s, int *flags){	int i;	for (i = 0; mount_flags[i].opt != NULL; i++) {		const char *opt = mount_flags[i].opt;		if (strcmp(opt, s) == 0) {			if (mount_flags[i].on)				*flags |= mount_flags[i].flag;			else				*flags &= ~mount_flags[i].flag;			return;		}	}	fprintf(stderr, "fuse: internal error, can't find mount flag\n");	abort();}static int fuse_mount_opt_proc(void *data, const char *arg, int key,			       struct fuse_args *outargs){	struct mount_opts *mo = data;	switch (key) {	case KEY_ALLOW_ROOT:		if (fuse_opt_add_opt(&mo->kernel_opts, "allow_other") == -1 ||		    fuse_opt_add_arg(outargs, "-oallow_root") == -1)			return -1;		return 0;	case KEY_RO:		arg = "ro";		/* fall through */	case KEY_KERN_FLAG:		set_mount_flag(arg, &mo->flags);		return 0;	case KEY_KERN_OPT:		return fuse_opt_add_opt(&mo->kernel_opts, arg);	case KEY_FUSERMOUNT_OPT:		return fuse_opt_add_opt(&mo->fusermount_opts, arg);	case KEY_SUBTYPE_OPT:		return fuse_opt_add_opt(&mo->subtype_opt, arg);	case KEY_MTAB_OPT:		return fuse_opt_add_opt(&mo->mtab_opts, arg);	case KEY_HELP:		mount_help();		mo->ishelp = 1;		break;	case KEY_VERSION:		mount_version();		mo->ishelp = 1;		break;	}	return 1;}/* return value: * >= 0	 => fd * -1	 => error */static int receive_fd(int fd){	struct msghdr msg;	struct iovec iov;	char buf[1];	int rv;	size_t ccmsg[CMSG_SPACE(sizeof(int)) / sizeof(size_t)];	struct cmsghdr *cmsg;	iov.iov_base = buf;	iov.iov_len = 1;	msg.msg_name = 0;	msg.msg_namelen = 0;	msg.msg_iov = &iov;	msg.msg_iovlen = 1;	/* old BSD implementations should use msg_accrights instead of	 * msg_control; the interface is different. */	msg.msg_control = ccmsg;	msg.msg_controllen = sizeof(ccmsg);	while(((rv = recvmsg(fd, &msg, 0)) == -1) && errno == EINTR);	if (rv == -1) {		perror("recvmsg");		return -1;	}	if(!rv) {		/* EOF */		return -1;	}	cmsg = CMSG_FIRSTHDR(&msg);	if (!cmsg->cmsg_type == SCM_RIGHTS) {		fprintf(stderr, "got control message of unknown type %d\n",			cmsg->cmsg_type);		return -1;	}	return *(int*)CMSG_DATA(cmsg);}void fuse_kern_unmount(const char *mountpoint, int fd){	int res;	int pid;	if (!mountpoint)		return;	if (fd != -1) {		struct pollfd pfd;		pfd.fd = fd;		pfd.events = 0;		res = poll(&pfd, 1, 0);		/* If file poll returns POLLERR on the device file descriptor,		   then the filesystem is already unmounted */		if (res == 1 && (pfd.revents & POLLERR))			return;		/* Need to close file descriptor, otherwise synchronous umount		   would recurse into filesystem, and deadlock */		close(fd);	}	if (geteuid() == 0) {		fuse_mnt_umount("fuse", mountpoint, 1);		return;	}	res = umount2(mountpoint, 2);	if (res == 0)		return;	pid = fork();	if(pid == -1)		return;	if(pid == 0) {		const char *argv[] = { FUSERMOUNT_PROG, "-u", "-q", "-z",				       "--", mountpoint, NULL };		exec_fusermount(argv);		_exit(1);	}	waitpid(pid, NULL, 0);}void fuse_unmount_compat22(const char *mountpoint){	fuse_kern_unmount(mountpoint, -1);}static int fuse_mount_fusermount(const char *mountpoint, const char *opts,				 int quiet){	int fds[2], pid;	int res;	int rv;	if (!mountpoint) {		fprintf(stderr, "fuse: missing mountpoint\n");		return -1;	}	res = socketpair(PF_UNIX, SOCK_STREAM, 0, fds);	if(res == -1) {		perror("fuse: socketpair() failed");		return -1;	}	pid = fork();	if(pid == -1) {		perror("fuse: fork() failed");		close(fds[0]);		close(fds[1]);		return -1;	}	if(pid == 0) {		char env[10];		const char *argv[32];		int a = 0;		if (quiet) {			int fd = open("/dev/null", O_RDONLY);			dup2(fd, 1);			dup2(fd, 2);		}		argv[a++] = FUSERMOUNT_PROG;		if (opts) {			argv[a++] = "-o";			argv[a++] = opts;		}		argv[a++] = "--";		argv[a++] = mountpoint;		argv[a++] = NULL;		close(fds[1]);		fcntl(fds[0], F_SETFD, 0);		snprintf(env, sizeof(env), "%i", fds[0]);		setenv(FUSE_COMMFD_ENV, env, 1);		exec_fusermount(argv);		perror("fuse: failed to exec fusermount");		_exit(1);	}	close(fds[0]);	rv = receive_fd(fds[1]);	close(fds[1]);	waitpid(pid, NULL, 0); /* bury zombie */	return rv;}int fuse_mount_compat22(const char *mountpoint, const char *opts){	return fuse_mount_fusermount(mountpoint, opts, 0);}static int fuse_mount_sys(const char *mnt, struct mount_opts *mo,			  const char *mnt_opts){	char tmp[128];	const char *devname = "/dev/fuse";	char *source = NULL;	char *type = NULL;	struct stat stbuf;	int fd;	int res;	if (!mnt) {		fprintf(stderr, "fuse: missing mountpoint\n");		return -1;	}	res = lstat(mnt, &stbuf);	if (res == -1) {		fprintf(stderr ,"fuse: failed to access mountpoint %s: %s\n",			mnt, strerror(errno));		return -1;	}	if (!mo->nonempty) {		res = fuse_mnt_check_empty("fuse", mnt, stbuf.st_mode,					   stbuf.st_size);		if (res == -1)			return -1;	}	fd = open(devname, O_RDWR);	if (fd == -1) {		if (errno == ENODEV || errno == ENOENT)			fprintf(stderr, "fuse: device not found, try 'modprobe fuse' first\n");		else			fprintf(stderr, "fuse: failed to open %s: %s\n",				devname, strerror(errno));		return -1;	}	snprintf(tmp, sizeof(tmp),  "fd=%i,rootmode=%o,user_id=%i,group_id=%i",		 fd, stbuf.st_mode & S_IFMT, getuid(), getgid());	res = fuse_opt_add_opt(&mo->kernel_opts, tmp);	if (res == -1)		goto out_close;	source = malloc((mo->fsname ? strlen(mo->fsname) : 0) +			(mo->subtype ? strlen(mo->subtype) : 0) +			strlen(devname) + 32);	type = malloc((mo->subtype ? strlen(mo->subtype) : 0) + 32);	if (!type || !source) {		fprintf(stderr, "fuse: failed to allocate memory\n");		goto out_close;	}	strcpy(type, mo->blkdev ? "fuseblk" : "fuse");	if (mo->subtype) {		strcat(type, ".");		strcat(type, mo->subtype);	}	strcpy(source,	       mo->fsname ? mo->fsname : (mo->subtype ? mo->subtype : devname));	res = mount(source, mnt, type, mo->flags, mo->kernel_opts);	if (res == -1 && errno == ENODEV && mo->subtype) {		/* Probably missing subtype support */		strcpy(type, mo->blkdev ? "fuseblk" : "fuse");		if (mo->fsname) {			if (!mo->blkdev)				sprintf(source, "%s#%s", mo->subtype,					mo->fsname);		} else {			strcpy(source, type);		}		res = mount(source, mnt, type, mo->flags, mo->kernel_opts);	}	if (res == -1) {		/*		 * Maybe kernel doesn't support unprivileged mounts, in this		 * case try falling back to fusermount		 */		if (errno == EPERM) {			res = -2;		} else {			int errno_save = errno;			if (mo->blkdev && errno == ENODEV &&			    !fuse_mnt_check_fuseblk())				fprintf(stderr,					"fuse: 'fuseblk' support missing\n");			else				fprintf(stderr, "fuse: mount failed: %s\n",					strerror(errno_save));		}		goto out_close;	}	if (geteuid() == 0) {		char *newmnt = fuse_mnt_resolve_path("fuse", mnt);		res = -1;		if (!newmnt)			goto out_umount;		res = fuse_mnt_add_mount("fuse", source, newmnt, type,					 mnt_opts);		free(newmnt);		if (res == -1)			goto out_umount;	}	return fd;out_umount:	umount2(mnt, 2); /* lazy umount */out_close:	free(type);	free(source);	close(fd);	return res;}static int get_mnt_flag_opts(char **mnt_optsp, int flags){	int i;	if (!(flags & MS_RDONLY) && fuse_opt_add_opt(mnt_optsp, "rw") == -1)		return -1;	for (i = 0; mount_flags[i].opt != NULL; i++) {		if (mount_flags[i].on && (flags & mount_flags[i].flag) &&		    fuse_opt_add_opt(mnt_optsp, mount_flags[i].opt) == -1)			return -1;	}	return 0;}int fuse_kern_mount(const char *mountpoint, struct fuse_args *args){	struct mount_opts mo;	int res = -1;	char *mnt_opts = NULL;	memset(&mo, 0, sizeof(mo));	mo.flags = MS_NOSUID | MS_NODEV;	if (args &&	    fuse_opt_parse(args, &mo, fuse_mount_opts, fuse_mount_opt_proc) == -1)		return -1;	if (mo.allow_other && mo.allow_root) {		fprintf(stderr, "fuse: 'allow_other' and 'allow_root' options are mutually exclusive\n");		goto out;	}	res = 0;	if (mo.ishelp)		goto out;	res = -1;	if (get_mnt_flag_opts(&mnt_opts, mo.flags) == -1)		goto out;	if (mo.kernel_opts && fuse_opt_add_opt(&mnt_opts, mo.kernel_opts) == -1)		goto out;	if (mo.mtab_opts &&  fuse_opt_add_opt(&mnt_opts, mo.mtab_opts) == -1)		goto out;	res = fuse_mount_sys(mountpoint, &mo, mnt_opts);	if (res == -2) {		if (mo.fusermount_opts &&		    fuse_opt_add_opt(&mnt_opts, mo.fusermount_opts) == -1)			goto out;		if (mo.subtype) {			char *tmp_opts = NULL;			res = -1;			if (fuse_opt_add_opt(&tmp_opts, mnt_opts) == -1 ||			    fuse_opt_add_opt(&tmp_opts, mo.subtype_opt) == -1) {				free(tmp_opts);				goto out;			}			res = fuse_mount_fusermount(mountpoint, tmp_opts, 1);			free(tmp_opts);			if (res == -1)				res = fuse_mount_fusermount(mountpoint,							    mnt_opts, 0);		} else {			res = fuse_mount_fusermount(mountpoint, mnt_opts, 0);		}	}out:	free(mnt_opts);	free(mo.fsname);	free(mo.subtype);	free(mo.fusermount_opts);	free(mo.subtype_opt);	free(mo.kernel_opts);	free(mo.mtab_opts);	return res;}FUSE_SYMVER(".symver fuse_mount_compat22,fuse_mount@FUSE_2.2");FUSE_SYMVER(".symver fuse_unmount_compat22,fuse_unmount@FUSE_2.2");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美a级一区二区| 99精品视频一区二区| 国产精品亚洲а∨天堂免在线| 不卡的av电影| 日韩久久精品一区| 一区二区三区高清| 国产一区二区三区国产| 欧美在线小视频| 欧美国产日韩亚洲一区| 九九在线精品视频| 欧美日本精品一区二区三区| 亚洲女人小视频在线观看| 激情六月婷婷综合| 欧美精品在线一区二区三区| 日韩美女久久久| 懂色中文一区二区在线播放| 精品久久久久久久人人人人传媒 | 亚洲综合在线五月| 粉嫩蜜臀av国产精品网站| 日韩精品一区二区三区在线观看 | 肉丝袜脚交视频一区二区| 91一区二区在线| 中文字幕一区三区| 成人午夜精品一区二区三区| 久久久综合网站| 国产毛片精品国产一区二区三区| 精品日韩在线观看| 久久av中文字幕片| 精品国产91九色蝌蚪| 久久不见久久见免费视频7| 欧美一级xxx| 麻豆成人av在线| 欧美r级在线观看| 国产自产高清不卡| 精品国产污污免费网站入口| 麻豆一区二区三区| 久久久久久电影| 成+人+亚洲+综合天堂| 中文字幕亚洲一区二区va在线| 国产91精品一区二区麻豆亚洲| 国产欧美精品一区| 成人精品国产免费网站| 中文字幕一区二区三区在线播放 | 美女精品一区二区| 精品播放一区二区| 国产成人av影院| 亚洲精品亚洲人成人网 | 91丨九色丨蝌蚪丨老版| 一区精品在线播放| 在线观看精品一区| 青青青爽久久午夜综合久久午夜 | 蜜臀精品一区二区三区在线观看| 日韩欧美色电影| 国产精品1024| 亚洲一区在线视频| 欧美一区二区三区视频| 国产一区二区三区免费看 | 一区二区三区中文在线| 欧美另类一区二区三区| 韩国一区二区在线观看| 久久久国产综合精品女国产盗摄| 国产不卡在线播放| 亚洲尤物在线视频观看| 欧美va亚洲va香蕉在线| 成人免费精品视频| 三级亚洲高清视频| 国产欧美日韩三级| 777午夜精品视频在线播放| 国产一区二区不卡老阿姨| 亚洲另类在线一区| 日韩精品一区二区三区视频播放| av高清不卡在线| 免费人成精品欧美精品| 亚洲视频1区2区| 26uuu欧美| 欧美日韩一区二区三区在线看| 国产伦精一区二区三区| 三级一区在线视频先锋| 亚洲日本一区二区三区| 精品国产成人在线影院| 欧美在线免费播放| 国产馆精品极品| 美腿丝袜亚洲三区| 亚洲一级电影视频| 中文字幕中文字幕在线一区| 91精品国产91久久久久久一区二区| 国产999精品久久| 麻豆国产精品一区二区三区| 一区二区三区小说| 欧美国产精品久久| 精品va天堂亚洲国产| 国产成人午夜视频| 理论电影国产精品| 天天综合日日夜夜精品| 18成人在线观看| 国产网站一区二区| 精品精品国产高清a毛片牛牛| 欧美色涩在线第一页| a4yy欧美一区二区三区| 国产成人精品亚洲日本在线桃色| 蜜臀av一级做a爰片久久| 香蕉影视欧美成人| 亚洲成人激情av| 亚洲一区二区综合| 亚洲视频 欧洲视频| 亚洲欧洲国产专区| 国产日产精品一区| 国产日本亚洲高清| 中文字幕国产一区二区| 国产欧美日韩综合精品一区二区| www精品美女久久久tv| www国产精品av| 精品久久久久久无| 久久久91精品国产一区二区精品 | 日韩理论在线观看| 国产精品剧情在线亚洲| 国产欧美日产一区| 国产精品毛片久久久久久久| 欧美激情一区在线| 国产精品伦一区二区三级视频| 国产午夜一区二区三区| 2欧美一区二区三区在线观看视频| 欧美r级电影在线观看| 久久久久国产精品厨房| 亚洲国产精华液网站w| 国产精品免费看片| 亚洲日本一区二区| 亚洲a一区二区| 男人的天堂久久精品| 久久国产夜色精品鲁鲁99| 久久99精品久久久久| 成人黄色电影在线| 色哟哟欧美精品| 欧美一区二区三区四区在线观看| 精品国产免费人成电影在线观看四季| 欧美mv日韩mv国产网站app| 日本一区二区综合亚洲| 综合婷婷亚洲小说| 日日夜夜精品视频天天综合网| 蜜臀av一区二区| 成人免费视频国产在线观看| 色婷婷久久久亚洲一区二区三区| 欧美午夜一区二区三区| 日韩免费高清电影| 国产精品久久久久一区| 亚洲一区二区三区视频在线 | 一区二区三区色| 麻豆91小视频| av资源站一区| 日韩一区二区免费视频| 日本一区二区视频在线观看| 亚洲国产日产av| 国产成人精品1024| 欧美日韩免费视频| 日本一区二区免费在线| 亚洲综合一区二区三区| 国产主播一区二区| 在线亚洲精品福利网址导航| 精品免费一区二区三区| 亚洲欧美日韩电影| 精品一区二区三区久久久| 色综合久久久久综合体| 久久综合狠狠综合久久激情 | 欧美日韩的一区二区| 国产亚洲婷婷免费| 午夜精品在线视频一区| 99久久综合狠狠综合久久| 日韩精品一区二区在线| 亚洲高清三级视频| 成人国产精品免费观看动漫| 日韩一区二区三区电影在线观看| 中文字幕亚洲一区二区va在线| 九色porny丨国产精品| 欧美日韩一区高清| 亚洲精品国久久99热| 国产精品一区二区在线观看网站 | 爽好多水快深点欧美视频| 国产成人丝袜美腿| 欧美第一区第二区| 天天亚洲美女在线视频| 日本精品一区二区三区高清| 国产精品丝袜91| 国产河南妇女毛片精品久久久| 日韩欧美高清一区| 日韩精品三区四区| 欧美亚洲国产怡红院影院| 国产精品国产三级国产专播品爱网| 麻豆精品在线看| 日韩欧美在线不卡| 日韩激情一区二区| 欧美日韩色一区| 五月综合激情网| 欧美在线free| 亚洲高清视频中文字幕| 在线看不卡av| 一区二区三区四区激情| 91国产视频在线观看| 亚洲一区精品在线| 欧美少妇xxx| 午夜精品久久一牛影视|