mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-14 15:52:47 -05:00
fuse: introduction of fsp_fuse_env and major refactoring
This commit is contained in:
@ -102,61 +102,64 @@ struct fuse_context
|
||||
#define fuse_main(argc, argv, ops, data)\
|
||||
fuse_main_real(argc, argv, ops, sizeof *(ops), data)
|
||||
|
||||
FSP_FUSE_API int fsp_fuse_main_real(int argc, char *argv[],
|
||||
const struct fuse_operations *ops, size_t opsize, void *data,
|
||||
int environment);
|
||||
FSP_FUSE_API int fsp_fuse_is_lib_option(const char *opt,
|
||||
FSP_FUSE_MEMFN_P);
|
||||
FSP_FUSE_API struct fuse *fsp_fuse_new(struct fuse_chan *ch, struct fuse_args *args,
|
||||
const struct fuse_operations *ops, size_t opsize, void *data,
|
||||
int environment);
|
||||
FSP_FUSE_API void fsp_fuse_destroy(struct fuse *f);
|
||||
FSP_FUSE_API int fsp_fuse_loop(struct fuse *f);
|
||||
FSP_FUSE_API int fsp_fuse_loop_mt(struct fuse *f);
|
||||
FSP_FUSE_API void fsp_fuse_exit(struct fuse *f);
|
||||
FSP_FUSE_API struct fuse_context *fsp_fuse_get_context(void);
|
||||
FSP_FUSE_API int fsp_fuse_main_real(struct fsp_fuse_env *env,
|
||||
int argc, char *argv[],
|
||||
const struct fuse_operations *ops, size_t opsize, void *data);
|
||||
FSP_FUSE_API int fsp_fuse_is_lib_option(struct fsp_fuse_env *env,
|
||||
const char *opt);
|
||||
FSP_FUSE_API struct fuse *fsp_fuse_new(struct fsp_fuse_env *env,
|
||||
struct fuse_chan *ch, struct fuse_args *args,
|
||||
const struct fuse_operations *ops, size_t opsize, void *data);
|
||||
FSP_FUSE_API void fsp_fuse_destroy(struct fsp_fuse_env *env,
|
||||
struct fuse *f);
|
||||
FSP_FUSE_API int fsp_fuse_loop(struct fsp_fuse_env *env,
|
||||
struct fuse *f);
|
||||
FSP_FUSE_API int fsp_fuse_loop_mt(struct fsp_fuse_env *env,
|
||||
struct fuse *f);
|
||||
FSP_FUSE_API void fsp_fuse_exit(struct fsp_fuse_env *env,
|
||||
struct fuse *f);
|
||||
FSP_FUSE_API struct fuse_context *fsp_fuse_get_context(struct fsp_fuse_env *env);
|
||||
|
||||
static inline int fuse_main_real(int argc, char *argv[],
|
||||
const struct fuse_operations *ops, size_t opsize, void *data)
|
||||
{
|
||||
return fsp_fuse_main_real(argc, argv, ops, opsize, data, FSP_FUSE_ENVIRONMENT);
|
||||
return fsp_fuse_main_real(fsp_fuse_env(), argc, argv, ops, opsize, data);
|
||||
}
|
||||
|
||||
static inline int fuse_is_lib_option(const char *opt)
|
||||
{
|
||||
return fsp_fuse_is_lib_option(opt,
|
||||
FSP_FUSE_MEMFN_V);
|
||||
return fsp_fuse_is_lib_option(fsp_fuse_env(), opt);
|
||||
}
|
||||
|
||||
static inline struct fuse *fuse_new(struct fuse_chan *ch, struct fuse_args *args,
|
||||
const struct fuse_operations *ops, size_t opsize, void *data)
|
||||
{
|
||||
return fsp_fuse_new(ch, args, ops, opsize, data, FSP_FUSE_ENVIRONMENT);
|
||||
return fsp_fuse_new(fsp_fuse_env(), ch, args, ops, opsize, data);
|
||||
}
|
||||
|
||||
static inline void fuse_destroy(struct fuse *f)
|
||||
{
|
||||
fsp_fuse_destroy(f);
|
||||
fsp_fuse_destroy(fsp_fuse_env(), f);
|
||||
}
|
||||
|
||||
static inline int fuse_loop(struct fuse *f)
|
||||
{
|
||||
return fuse_loop(f);
|
||||
return fsp_fuse_loop(fsp_fuse_env(), f);
|
||||
}
|
||||
|
||||
static inline int fuse_loop_mt(struct fuse *f)
|
||||
{
|
||||
return fsp_fuse_loop_mt(f);
|
||||
return fsp_fuse_loop_mt(fsp_fuse_env(), f);
|
||||
}
|
||||
|
||||
static inline void fuse_exit(struct fuse *f)
|
||||
{
|
||||
fsp_fuse_exit(f);
|
||||
fsp_fuse_exit(fsp_fuse_env(), f);
|
||||
}
|
||||
|
||||
static inline struct fuse_context *fuse_get_context(void)
|
||||
{
|
||||
return fsp_fuse_get_context();
|
||||
return fsp_fuse_get_context(fsp_fuse_env());
|
||||
}
|
||||
|
||||
static inline int fuse_getgroups(int size, fuse_gid_t list[])
|
||||
|
@ -23,31 +23,13 @@
|
||||
#ifndef FUSE_COMMON_H_
|
||||
#define FUSE_COMMON_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include "winfsp_fuse.h"
|
||||
#include "fuse_opt.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if !defined(FSP_FUSE_API)
|
||||
#if defined(WINFSP_DLL_INTERNAL)
|
||||
#define FSP_FUSE_API __declspec(dllexport)
|
||||
#else
|
||||
#define FSP_FUSE_API __declspec(dllimport)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(FSP_FUSE_MEMFN_P)
|
||||
#define FSP_FUSE_MEMFN_P void *(*memalloc)(size_t), void (*memfree)(void *)
|
||||
#define FSP_FUSE_MEMFN_A memalloc, memfree
|
||||
#if defined(WINFSP_DLL_INTERNAL)
|
||||
#define FSP_FUSE_MEMFN_V MemAlloc, MemFree
|
||||
#else
|
||||
#define FSP_FUSE_MEMFN_V malloc, free
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define FUSE_MAJOR_VERSION 2
|
||||
#define FUSE_MINOR_VERSION 8
|
||||
#define FUSE_MAKE_VERSION(maj, min) ((maj) * 10 + (min))
|
||||
@ -65,108 +47,6 @@ extern "C" {
|
||||
#define FUSE_IOCTL_RETRY (1 << 2)
|
||||
#define FUSE_IOCTL_MAX_IOV 256
|
||||
|
||||
/*
|
||||
* FUSE uses a number of types (notably: struct stat) that are OS specific.
|
||||
* Furthermore there are sometimes multiple definitions of the same type even
|
||||
* within the same OS. This is certainly true on Windows, where these types
|
||||
* are not even native.
|
||||
*
|
||||
* For this reason we will define our own fuse_* types which represent the
|
||||
* types as the WinFsp DLL expects to see them. When the file is included
|
||||
* by FUSE clients in different environments we will translate between their
|
||||
* understanding of the types and ours.
|
||||
*/
|
||||
#if defined(_MSC_VER)
|
||||
typedef uint32_t fuse_uid_t;
|
||||
typedef uint32_t fuse_gid_t;
|
||||
typedef int32_t fuse_pid_t;
|
||||
|
||||
typedef uint64_t fuse_dev_t;
|
||||
typedef uint64_t fuse_ino_t;
|
||||
typedef uint32_t fuse_mode_t;
|
||||
typedef uint32_t fuse_nlink_t;
|
||||
typedef int64_t fuse_off_t;
|
||||
|
||||
typedef uint64_t fuse_fsblkcnt_t;
|
||||
typedef uint64_t fuse_fsfilcnt_t;
|
||||
typedef int32_t fuse_blksize_t;
|
||||
typedef int32_t fuse_blkcnt_t;
|
||||
|
||||
struct fuse_timespec
|
||||
{
|
||||
time_t tv_sec;
|
||||
int tv_nsec;
|
||||
};
|
||||
|
||||
struct fuse_stat
|
||||
{
|
||||
fuse_dev_t st_dev;
|
||||
fuse_ino_t st_ino;
|
||||
fuse_mode_t st_mode;
|
||||
fuse_nlink_t st_nlink;
|
||||
fuse_uid_t st_uid;
|
||||
fuse_gid_t st_gid;
|
||||
fuse_dev_t st_rdev;
|
||||
fuse_off_t st_size;
|
||||
struct fuse_timespec st_atim;
|
||||
struct fuse_timespec st_mtim;
|
||||
struct fuse_timespec st_ctim;
|
||||
fuse_blksize_t st_blksize;
|
||||
fuse_blkcnt_t st_blocks;
|
||||
struct fuse_timespec st_birthtim;
|
||||
};
|
||||
|
||||
struct fuse_statvfs
|
||||
{
|
||||
unsigned int f_bsize;
|
||||
unsigned int f_frsize;
|
||||
fuse_fsblkcnt_t f_blocks;
|
||||
fuse_fsblkcnt_t f_bfree;
|
||||
fuse_fsblkcnt_t f_bavail;
|
||||
fuse_fsfilcnt_t f_files;
|
||||
fuse_fsfilcnt_t f_ffree;
|
||||
fuse_fsfilcnt_t f_favail;
|
||||
unsigned int f_fsid;
|
||||
unsigned int f_flag;
|
||||
unsigned int f_namemax;
|
||||
};
|
||||
|
||||
#define FSP_FUSE_ENVIRONMENT 'W'
|
||||
|
||||
#elif defined(__CYGWIN__)
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/types.h>
|
||||
#include <utime.h>
|
||||
|
||||
#define fuse_uid_t uid_t
|
||||
#define fuse_gid_t gid_t
|
||||
#define fuse_pid_t pid_t
|
||||
|
||||
#define fuse_dev_t dev_t
|
||||
#define fuse_ino_t ino_t
|
||||
#define fuse_mode_t mode_t
|
||||
#define fuse_nlink_t nlink_t
|
||||
#define fuse_off_t off_t
|
||||
|
||||
#define fuse_fsblkcnt_t fsblkcnt_t
|
||||
#define fuse_fsfilcnt_t fsfilcnt_t
|
||||
#define fuse_blksize_t blksize_t
|
||||
#define fuse_blkcnt_t blkcnt_t
|
||||
|
||||
#define fuse_timespec timespec
|
||||
|
||||
#define fuse_stat stat
|
||||
#define fuse_statvfs statvfs
|
||||
|
||||
#define FSP_FUSE_ENVIRONMENT 'C'
|
||||
|
||||
#else
|
||||
#error unsupported environment
|
||||
#endif
|
||||
|
||||
struct fuse_file_info
|
||||
{
|
||||
int flags;
|
||||
@ -197,33 +77,34 @@ struct fuse_session;
|
||||
struct fuse_chan;
|
||||
struct fuse_pollhandle;
|
||||
|
||||
FSP_FUSE_API int fsp_fuse_version(void);
|
||||
FSP_FUSE_API struct fuse_chan *fsp_fuse_mount(const char *mountpoint, struct fuse_args *args);
|
||||
FSP_FUSE_API void fsp_fuse_unmount(const char *mountpoint, struct fuse_chan *ch);
|
||||
FSP_FUSE_API int fsp_fuse_parse_cmdline(struct fuse_args *args, char **mountpoint,
|
||||
int *multithreaded, int *foreground,
|
||||
FSP_FUSE_MEMFN_P);
|
||||
FSP_FUSE_API int fsp_fuse_version(struct fsp_fuse_env *env);
|
||||
FSP_FUSE_API struct fuse_chan *fsp_fuse_mount(struct fsp_fuse_env *env,
|
||||
const char *mountpoint, struct fuse_args *args);
|
||||
FSP_FUSE_API void fsp_fuse_unmount(struct fsp_fuse_env *env,
|
||||
const char *mountpoint, struct fuse_chan *ch);
|
||||
FSP_FUSE_API int fsp_fuse_parse_cmdline(struct fsp_fuse_env *env,
|
||||
struct fuse_args *args, char **mountpoint,
|
||||
int *multithreaded, int *foreground);
|
||||
|
||||
static inline int fuse_version(void)
|
||||
{
|
||||
return fsp_fuse_version();
|
||||
return fsp_fuse_version(fsp_fuse_env());
|
||||
}
|
||||
|
||||
static inline struct fuse_chan *fuse_mount(const char *mountpoint, struct fuse_args *args)
|
||||
{
|
||||
return fsp_fuse_mount(mountpoint, args);
|
||||
return fsp_fuse_mount(fsp_fuse_env(), mountpoint, args);
|
||||
}
|
||||
|
||||
static inline void fuse_unmount(const char *mountpoint, struct fuse_chan *ch)
|
||||
{
|
||||
fsp_fuse_unmount(mountpoint, ch);
|
||||
fsp_fuse_unmount(fsp_fuse_env(), mountpoint, ch);
|
||||
}
|
||||
|
||||
static inline int fuse_parse_cmdline(struct fuse_args *args, char **mountpoint,
|
||||
int *multithreaded, int *foreground)
|
||||
{
|
||||
return fsp_fuse_parse_cmdline(args, mountpoint, multithreaded, foreground,
|
||||
FSP_FUSE_MEMFN_V);
|
||||
return fsp_fuse_parse_cmdline(fsp_fuse_env(), args, mountpoint, multithreaded, foreground);
|
||||
}
|
||||
|
||||
static inline void fuse_pollhandle_destroy(struct fuse_pollhandle *ph)
|
||||
|
@ -23,32 +23,12 @@
|
||||
#ifndef FUSE_OPT_H_
|
||||
#define FUSE_OPT_H_
|
||||
|
||||
#if !defined(WINFSP_DLL_INTERNAL)
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
#include "winfsp_fuse.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if !defined(FSP_FUSE_API)
|
||||
#if defined(WINFSP_DLL_INTERNAL)
|
||||
#define FSP_FUSE_API __declspec(dllexport)
|
||||
#else
|
||||
#define FSP_FUSE_API __declspec(dllimport)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(FSP_FUSE_MEMFN_P)
|
||||
#define FSP_FUSE_MEMFN_P void *(*memalloc)(size_t), void (*memfree)(void *)
|
||||
#define FSP_FUSE_MEMFN_A memalloc, memfree
|
||||
#if defined(WINFSP_DLL_INTERNAL)
|
||||
#define FSP_FUSE_MEMFN_V MemAlloc, MemFree
|
||||
#else
|
||||
#define FSP_FUSE_MEMFN_V malloc, free
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define FUSE_OPT_KEY(templ, key) { templ, -1, key }
|
||||
#define FUSE_OPT_END { NULL, 0, 0 }
|
||||
|
||||
@ -76,63 +56,56 @@ struct fuse_args
|
||||
typedef int (*fuse_opt_proc_t)(void *data, const char *arg, int key,
|
||||
struct fuse_args *outargs);
|
||||
|
||||
FSP_FUSE_API int fsp_fuse_opt_parse(struct fuse_args *args, void *data,
|
||||
const struct fuse_opt opts[], fuse_opt_proc_t proc,
|
||||
FSP_FUSE_MEMFN_P);
|
||||
FSP_FUSE_API int fsp_fuse_opt_add_arg(struct fuse_args *args, const char *arg,
|
||||
FSP_FUSE_MEMFN_P);
|
||||
FSP_FUSE_API int fsp_fuse_opt_insert_arg(struct fuse_args *args, int pos, const char *arg,
|
||||
FSP_FUSE_MEMFN_P);
|
||||
FSP_FUSE_API void fsp_fuse_opt_free_args(struct fuse_args *args,
|
||||
FSP_FUSE_MEMFN_P);
|
||||
FSP_FUSE_API int fsp_fuse_opt_add_opt(char **opts, const char *opt,
|
||||
FSP_FUSE_MEMFN_P);
|
||||
FSP_FUSE_API int fsp_fuse_opt_add_opt_escaped(char **opts, const char *opt,
|
||||
FSP_FUSE_MEMFN_P);
|
||||
FSP_FUSE_API int fsp_fuse_opt_match(const struct fuse_opt opts[], const char *opt,
|
||||
FSP_FUSE_MEMFN_P);
|
||||
FSP_FUSE_API int fsp_fuse_opt_parse(struct fsp_fuse_env *env,
|
||||
struct fuse_args *args, void *data,
|
||||
const struct fuse_opt opts[], fuse_opt_proc_t proc);
|
||||
FSP_FUSE_API int fsp_fuse_opt_add_arg(struct fsp_fuse_env *env,
|
||||
struct fuse_args *args, const char *arg);
|
||||
FSP_FUSE_API int fsp_fuse_opt_insert_arg(struct fsp_fuse_env *env,
|
||||
struct fuse_args *args, int pos, const char *arg);
|
||||
FSP_FUSE_API void fsp_fuse_opt_free_args(struct fsp_fuse_env *env,
|
||||
struct fuse_args *args);
|
||||
FSP_FUSE_API int fsp_fuse_opt_add_opt(struct fsp_fuse_env *env,
|
||||
char **opts, const char *opt);
|
||||
FSP_FUSE_API int fsp_fuse_opt_add_opt_escaped(struct fsp_fuse_env *env,
|
||||
char **opts, const char *opt);
|
||||
FSP_FUSE_API int fsp_fuse_opt_match(struct fsp_fuse_env *env,
|
||||
const struct fuse_opt opts[], const char *opt);
|
||||
|
||||
static inline int fuse_opt_parse(struct fuse_args *args, void *data,
|
||||
const struct fuse_opt opts[], fuse_opt_proc_t proc)
|
||||
{
|
||||
return fsp_fuse_opt_parse(args, data, opts, proc,
|
||||
FSP_FUSE_MEMFN_V);
|
||||
return fsp_fuse_opt_parse(fsp_fuse_env(), args, data, opts, proc);
|
||||
}
|
||||
|
||||
static inline int fuse_opt_add_arg(struct fuse_args *args, const char *arg)
|
||||
{
|
||||
return fsp_fuse_opt_add_arg(args, arg,
|
||||
FSP_FUSE_MEMFN_V);
|
||||
return fsp_fuse_opt_add_arg(fsp_fuse_env(), args, arg);
|
||||
}
|
||||
|
||||
static inline int fuse_opt_insert_arg(struct fuse_args *args, int pos, const char *arg)
|
||||
{
|
||||
return fsp_fuse_opt_insert_arg(args, pos, arg,
|
||||
FSP_FUSE_MEMFN_V);
|
||||
return fsp_fuse_opt_insert_arg(fsp_fuse_env(), args, pos, arg);
|
||||
}
|
||||
|
||||
static inline void fuse_opt_free_args(struct fuse_args *args)
|
||||
{
|
||||
fsp_fuse_opt_free_args(args,
|
||||
FSP_FUSE_MEMFN_V);
|
||||
fsp_fuse_opt_free_args(fsp_fuse_env(), args);
|
||||
}
|
||||
|
||||
static inline int fuse_opt_add_opt(char **opts, const char *opt)
|
||||
{
|
||||
return fsp_fuse_opt_add_opt(opts, opt,
|
||||
FSP_FUSE_MEMFN_V);
|
||||
return fsp_fuse_opt_add_opt(fsp_fuse_env(), opts, opt);
|
||||
}
|
||||
|
||||
static inline int fuse_opt_add_opt_escaped(char **opts, const char *opt)
|
||||
{
|
||||
return fsp_fuse_opt_add_opt_escaped(opts, opt,
|
||||
FSP_FUSE_MEMFN_V);
|
||||
return fsp_fuse_opt_add_opt_escaped(fsp_fuse_env(), opts, opt);
|
||||
}
|
||||
|
||||
static inline int fuse_opt_match(const struct fuse_opt opts[], const char *opt)
|
||||
{
|
||||
return fsp_fuse_opt_match(opts, opt,
|
||||
FSP_FUSE_MEMFN_V);
|
||||
return fsp_fuse_opt_match(fsp_fuse_env(), opts, opt);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
162
inc/fuse/winfsp_fuse.h
Normal file
162
inc/fuse/winfsp_fuse.h
Normal file
@ -0,0 +1,162 @@
|
||||
/**
|
||||
* @file fuse/winfsp_fuse.h
|
||||
* WinFsp FUSE compatible API.
|
||||
*
|
||||
* @copyright 2015-2016 Bill Zissimopoulos
|
||||
*/
|
||||
/*
|
||||
* This file is part of WinFsp.
|
||||
*
|
||||
* You can redistribute it and/or modify it under the terms of the
|
||||
* GNU Affero General Public License version 3 as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* Licensees holding a valid commercial license may use this file in
|
||||
* accordance with the commercial license agreement provided with the
|
||||
* software.
|
||||
*/
|
||||
|
||||
#ifndef FUSE_WINFSP_FUSE_H_INCLUDED
|
||||
#define FUSE_WINFSP_FUSE_H_INCLUDED
|
||||
|
||||
#include <stdint.h>
|
||||
#if !defined(WINFSP_DLL_INTERNAL)
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(WINFSP_DLL_INTERNAL)
|
||||
#define FSP_FUSE_API __declspec(dllexport)
|
||||
#else
|
||||
#define FSP_FUSE_API __declspec(dllimport)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* FUSE uses a number of types (notably: struct stat) that are OS specific.
|
||||
* Furthermore there are sometimes multiple definitions of the same type even
|
||||
* within the same OS. This is certainly true on Windows, where these types
|
||||
* are not even native.
|
||||
*
|
||||
* For this reason we will define our own fuse_* types which represent the
|
||||
* types as the WinFsp DLL expects to see them. When the file is included
|
||||
* by FUSE clients in different environments we will translate between their
|
||||
* understanding of the types and ours.
|
||||
*/
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
|
||||
typedef uint32_t fuse_uid_t;
|
||||
typedef uint32_t fuse_gid_t;
|
||||
typedef int32_t fuse_pid_t;
|
||||
|
||||
typedef uint64_t fuse_dev_t;
|
||||
typedef uint64_t fuse_ino_t;
|
||||
typedef uint32_t fuse_mode_t;
|
||||
typedef uint32_t fuse_nlink_t;
|
||||
typedef int64_t fuse_off_t;
|
||||
|
||||
typedef uint64_t fuse_fsblkcnt_t;
|
||||
typedef uint64_t fuse_fsfilcnt_t;
|
||||
typedef int32_t fuse_blksize_t;
|
||||
typedef int32_t fuse_blkcnt_t;
|
||||
|
||||
struct fuse_timespec
|
||||
{
|
||||
time_t tv_sec;
|
||||
int tv_nsec;
|
||||
};
|
||||
|
||||
struct fuse_stat
|
||||
{
|
||||
fuse_dev_t st_dev;
|
||||
fuse_ino_t st_ino;
|
||||
fuse_mode_t st_mode;
|
||||
fuse_nlink_t st_nlink;
|
||||
fuse_uid_t st_uid;
|
||||
fuse_gid_t st_gid;
|
||||
fuse_dev_t st_rdev;
|
||||
fuse_off_t st_size;
|
||||
struct fuse_timespec st_atim;
|
||||
struct fuse_timespec st_mtim;
|
||||
struct fuse_timespec st_ctim;
|
||||
fuse_blksize_t st_blksize;
|
||||
fuse_blkcnt_t st_blocks;
|
||||
struct fuse_timespec st_birthtim;
|
||||
};
|
||||
|
||||
struct fuse_statvfs
|
||||
{
|
||||
unsigned int f_bsize;
|
||||
unsigned int f_frsize;
|
||||
fuse_fsblkcnt_t f_blocks;
|
||||
fuse_fsblkcnt_t f_bfree;
|
||||
fuse_fsblkcnt_t f_bavail;
|
||||
fuse_fsfilcnt_t f_files;
|
||||
fuse_fsfilcnt_t f_ffree;
|
||||
fuse_fsfilcnt_t f_favail;
|
||||
unsigned int f_fsid;
|
||||
unsigned int f_flag;
|
||||
unsigned int f_namemax;
|
||||
};
|
||||
|
||||
#if defined(WINFSP_DLL_INTERNAL)
|
||||
#define FSP_FUSE_ENV_INIT { 'W', MemAlloc, MemFree }
|
||||
#else
|
||||
#define FSP_FUSE_ENV_INIT { 'W', malloc, free }
|
||||
#endif
|
||||
|
||||
#elif defined(__CYGWIN__)
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/types.h>
|
||||
#include <utime.h>
|
||||
|
||||
#define fuse_uid_t uid_t
|
||||
#define fuse_gid_t gid_t
|
||||
#define fuse_pid_t pid_t
|
||||
|
||||
#define fuse_dev_t dev_t
|
||||
#define fuse_ino_t ino_t
|
||||
#define fuse_mode_t mode_t
|
||||
#define fuse_nlink_t nlink_t
|
||||
#define fuse_off_t off_t
|
||||
|
||||
#define fuse_fsblkcnt_t fsblkcnt_t
|
||||
#define fuse_fsfilcnt_t fsfilcnt_t
|
||||
#define fuse_blksize_t blksize_t
|
||||
#define fuse_blkcnt_t blkcnt_t
|
||||
|
||||
#define fuse_timespec timespec
|
||||
|
||||
#define fuse_stat stat
|
||||
#define fuse_statvfs statvfs
|
||||
|
||||
#define FSP_FUSE_ENV_INIT { 'C', malloc, free }
|
||||
|
||||
#else
|
||||
#error unsupported environment
|
||||
#endif
|
||||
|
||||
struct fsp_fuse_env
|
||||
{
|
||||
unsigned environment;
|
||||
void *(*memalloc)(size_t);
|
||||
void (*memfree)(void *);
|
||||
};
|
||||
|
||||
static inline struct fsp_fuse_env *fsp_fuse_env(void)
|
||||
{
|
||||
static struct fsp_fuse_env env = FSP_FUSE_ENV_INIT;
|
||||
return &env;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user