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

📄 mount.fuse.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 GPL.  See the file COPYING.*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <errno.h>static char *progname;static char *xstrdup(const char *s){	char *t = strdup(s);	if (!t) {		fprintf(stderr, "%s: failed to allocate memory\n", progname);		exit(1);	}	return t;}static void *xrealloc(void *oldptr, size_t size){	void *ptr = realloc(oldptr, size);	if (!ptr) {		fprintf(stderr, "%s: failed to allocate memory\n", progname);		exit(1);	}	return ptr;}static void add_arg(char **cmdp, const char *opt){	size_t optlen = strlen(opt);	size_t cmdlen = *cmdp ? strlen(*cmdp) : 0;	char *cmd = xrealloc(*cmdp, cmdlen + optlen * 4 + 4);	char *s;	s = cmd + cmdlen;	if (*cmdp)		*s++ = ' ';	*s++ = '\'';	for (; *opt; opt++) {		if (*opt == '\'') {			*s++ = '\'';			*s++ = '\\';			*s++ = '\'';			*s++ = '\'';		} else			*s++ = *opt;	}	*s++ = '\'';	*s = '\0';	*cmdp = cmd;}int main(int argc, char *argv[]){	char *type = NULL;	char *source;	const char *mountpoint;	char *basename;	char *options = NULL;	char *command = NULL;	char *setuid = NULL;	int i;	progname = argv[0];	basename = strrchr(argv[0], '/');	if (basename)		basename++;	else		basename = argv[0];	if (strncmp(basename, "mount.fuse.", 11) == 0)		type = basename + 11;	if (strncmp(basename, "mount.fuseblk.", 14) == 0)		type = basename + 14;	if (type && !type[0])		type = NULL;	if (argc < 3) {		fprintf(stderr,			"usage: %s %s destination [-t type] [-o opt[,opts...]]\n",			progname, type ? "source" : "type#[source]");		exit(1);	}	source = argv[1];	if (!source[0])		source = NULL;	mountpoint = argv[2];	for (i = 3; i < argc; i++) {		if (strcmp(argv[i], "-v") == 0) {			continue;		} else if (strcmp(argv[i], "-t") == 0) {			i++;			if (i == argc) {				fprintf(stderr,					"%s: missing argument to option '-t'\n",					progname);				exit(1);			}			type = argv[i];			if (strncmp(type, "fuse.", 5) == 0)				type += 5;			else if (strncmp(type, "fuseblk.", 8) == 0)				type += 8;			if (!type[0]) {				fprintf(stderr,					"%s: empty type given as argument to option '-t'\n",					progname);				exit(1);			}		} else	if (strcmp(argv[i], "-o") == 0) {			char *opts;			char *opt;			i++;			if (i == argc)				break;			opts = xstrdup(argv[i]);			opt = strtok(opts, ",");			while (opt) {				int j;				int ignore = 0;				const char *ignore_opts[] = { "",							      "user",							      "nouser",							      "users",							      "auto",							      "noauto",							      "_netdev",							      NULL};				if (strncmp(opt, "setuid=", 7) == 0) {					setuid = xstrdup(opt + 7);					ignore = 1;				}				for (j = 0; ignore_opts[j]; j++)					if (strcmp(opt, ignore_opts[j]) == 0)						ignore = 1;				if (!ignore) {					int oldlen =						options ? strlen(options) : 0;					options = xrealloc(options, oldlen + 1 + strlen(opt) + 1);					if (!oldlen)						strcpy(options, opt);					else {						strcat(options, ",");						strcat(options, opt);					}				}				opt = strtok(NULL, ",");			}		}	}	if (!type) {		type = xstrdup(source);		source = strchr(type, '#');		if (source)			*source++ = '\0';		if (!type[0]) {			fprintf(stderr, "%s: empty filesystem type\n",				progname);			exit(1);		}	}	add_arg(&command, type);	if (source)		add_arg(&command, source);	add_arg(&command, mountpoint);	if (options) {		add_arg(&command, "-o");		add_arg(&command, options);	}	if (setuid && setuid[0]) {		char *sucommand = command;		command = NULL;		add_arg(&command, "su");		add_arg(&command, "-");		add_arg(&command, setuid);		add_arg(&command, "-c");		add_arg(&command, sucommand);	} else if (!getenv("HOME")) {		/* Hack to make filesystems work in the boot environment */		setenv("HOME", "/root", 0);	}	execl("/bin/sh", "/bin/sh", "-c", command, NULL);	fprintf(stderr, "%s: failed to execute /bin/sh: %s\n", progname,		strerror(errno));	return 1;}

⌨️ 快捷键说明

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