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

📄 iconv.c

📁 UNIX/LINUX下面的用户文件系统
💻 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 + -