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

📄 iconv.c

📁 FUSE文件系统开发工具,将内核层面的文件系统开发过程平移到应用层面上来。
💻 C
📖 第 1 页 / 共 2 页
字号:
	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_utimens(ic->next, newpath, ts);		free(newpath);	}	return err;}static int iconv_create(const char *path, mode_t mode,			struct fuse_file_info *fi){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_create(ic->next, newpath, mode, fi);		free(newpath);	}	return err;}static int iconv_open_file(const char *path, struct fuse_file_info *fi){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_open(ic->next, newpath, fi);		free(newpath);	}	return err;}static int iconv_read(const char *path, char *buf, size_t size, off_t offset,		      struct fuse_file_info *fi){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_read(ic->next, newpath, buf, size, offset, fi);		free(newpath);	}	return err;}static int iconv_write(const char *path, const char *buf, size_t size,		       off_t offset, struct fuse_file_info *fi){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_write(ic->next, newpath, buf, size, offset, fi);		free(newpath);	}	return err;}static int iconv_statfs(const char *path, struct statvfs *stbuf){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_statfs(ic->next, newpath, stbuf);		free(newpath);	}	return err;}static int iconv_flush(const char *path, struct fuse_file_info *fi){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_flush(ic->next, newpath, fi);		free(newpath);	}	return err;}static int iconv_release(const char *path, struct fuse_file_info *fi){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_release(ic->next, newpath, fi);		free(newpath);	}	return err;}static int iconv_fsync(const char *path, int isdatasync,		       struct fuse_file_info *fi){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_fsync(ic->next, newpath, isdatasync, fi);		free(newpath);	}	return err;}static int iconv_fsyncdir(const char *path, int isdatasync,			  struct fuse_file_info *fi){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_fsyncdir(ic->next, newpath, isdatasync, fi);		free(newpath);	}	return err;}static int iconv_setxattr(const char *path, const char *name,			  const char *value, size_t size, int flags){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_setxattr(ic->next, newpath, name, value, size,				       flags);		free(newpath);	}	return err;}static int iconv_getxattr(const char *path, const char *name, char *value,			  size_t size){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_getxattr(ic->next, newpath, name, value, size);		free(newpath);	}	return err;}static int iconv_listxattr(const char *path, char *list, size_t size){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_listxattr(ic->next, newpath, list, size);		free(newpath);	}	return err;}static int iconv_removexattr(const char *path, const char *name){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_removexattr(ic->next, newpath, name);		free(newpath);	}	return err;}static int iconv_lock(const char *path, struct fuse_file_info *fi, int cmd,		      struct flock *lock){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_lock(ic->next, newpath, fi, cmd, lock);		free(newpath);	}	return err;}static int iconv_bmap(const char *path, size_t blocksize, uint64_t *idx){	struct iconv *ic = iconv_get();	char *newpath;	int err = iconv_convpath(ic, path, &newpath, 0);	if (!err) {		err = fuse_fs_bmap(ic->next, newpath, blocksize, idx);		free(newpath);	}	return err;}static void *iconv_init(struct fuse_conn_info *conn){	struct iconv *ic = iconv_get();	fuse_fs_init(ic->next, conn);	return ic;}static void iconv_destroy(void *data){	struct iconv *ic = data;	fuse_fs_destroy(ic->next);	iconv_close(ic->tofs);	iconv_close(ic->fromfs);	pthread_mutex_destroy(&ic->lock);	free(ic->from_code);	free(ic->to_code);	free(ic);}static struct fuse_operations iconv_oper = {	.destroy	= iconv_destroy,	.init		= iconv_init,	.getattr	= iconv_getattr,	.fgetattr	= iconv_fgetattr,	.access		= iconv_access,	.readlink	= iconv_readlink,	.opendir	= iconv_opendir,	.readdir	= iconv_readdir,	.releasedir	= iconv_releasedir,	.mknod		= iconv_mknod,	.mkdir		= iconv_mkdir,	.symlink	= iconv_symlink,	.unlink		= iconv_unlink,	.rmdir		= iconv_rmdir,	.rename		= iconv_rename,	.link		= iconv_link,	.chmod		= iconv_chmod,	.chown		= iconv_chown,	.truncate	= iconv_truncate,	.ftruncate	= iconv_ftruncate,	.utimens	= iconv_utimens,	.create		= iconv_create,	.open		= iconv_open_file,	.read		= iconv_read,	.write		= iconv_write,	.statfs		= iconv_statfs,	.flush		= iconv_flush,	.release	= iconv_release,	.fsync		= iconv_fsync,	.fsyncdir	= iconv_fsyncdir,	.setxattr	= iconv_setxattr,	.getxattr	= iconv_getxattr,	.listxattr	= iconv_listxattr,	.removexattr	= iconv_removexattr,	.lock		= iconv_lock,	.bmap		= iconv_bmap,};static struct fuse_opt iconv_opts[] = {	FUSE_OPT_KEY("-h", 0),	FUSE_OPT_KEY("--help", 0),	{ "from_code=%s", offsetof(struct iconv, from_code), 0 },	{ "to_code=%s", offsetof(struct iconv, to_code), 1 },	FUSE_OPT_END};static void iconv_help(void){	char *old = strdup(setlocale(LC_CTYPE, ""));	char *charmap = strdup(nl_langinfo(CODESET));	setlocale(LC_CTYPE, old);	free(old);	fprintf(stderr,"    -o from_code=CHARSET   original encoding of file names (default: UTF-8)\n""    -o to_code=CHARSET	    new encoding of the file names (default: %s)\n",		charmap);	free(charmap);}static int iconv_opt_proc(void *data, const char *arg, int key,			  struct fuse_args *outargs){	(void) data; (void) arg; (void) outargs;	if (!key) {		iconv_help();		return -1;	}	return 1;}static struct fuse_fs *iconv_new(struct fuse_args *args,				 struct fuse_fs *next[]){	struct fuse_fs *fs;	struct iconv *ic;	char *old = NULL;	const char *from;	const char *to;	ic = calloc(1, sizeof(struct iconv));	if (ic == NULL) {		fprintf(stderr, "fuse-iconv: memory allocation failed\n");		return NULL;	}	if (fuse_opt_parse(args, ic, iconv_opts, iconv_opt_proc) == -1)		goto out_free;	if (!next[0] || next[1]) {		fprintf(stderr, "fuse-iconv: exactly one next filesystem required\n");		goto out_free;	}	from = ic->from_code ? ic->from_code : "UTF-8";	to = ic->to_code ? ic->to_code : "";	/* FIXME: detect charset equivalence? */	if (!to[0])		old = strdup(setlocale(LC_CTYPE, ""));	ic->tofs = iconv_open(from, to);	if (ic->tofs == (iconv_t) -1) {		fprintf(stderr, "fuse-iconv: cannot convert from %s to %s\n",			to, from);		goto out_free;	}	ic->fromfs = iconv_open(to, from);	if (ic->tofs == (iconv_t) -1) {		fprintf(stderr, "fuse-iconv: cannot convert from %s to %s\n",			from, to);		goto out_iconv_close_to;	}	if (old) {		setlocale(LC_CTYPE, old);		free(old);	}	ic->next = next[0];	fs = fuse_fs_new(&iconv_oper, sizeof(iconv_oper), ic);	if (!fs)		goto out_iconv_close_from;	return fs;out_iconv_close_from:	iconv_close(ic->fromfs);out_iconv_close_to:	iconv_close(ic->tofs);out_free:	free(ic->from_code);	free(ic->to_code);	free(ic);	return NULL;}FUSE_REGISTER_MODULE(iconv, iconv_new);

⌨️ 快捷键说明

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