161 lines
5.6 KiB
C
161 lines
5.6 KiB
C
|
/*
|
||
|
* Copyright (c) 2011 by Michael Berlin, Zuse Institute Berlin
|
||
|
*
|
||
|
* Licensed under the BSD License, see LICENSE file for details.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef CPP_INCLUDE_FUSE_FUSE_ADAPTER_H_
|
||
|
#define CPP_INCLUDE_FUSE_FUSE_ADAPTER_H_
|
||
|
|
||
|
#include <sys/types.h>
|
||
|
#define FUSE_USE_VERSION 26
|
||
|
#include <fuse.h>
|
||
|
|
||
|
#include <boost/scoped_ptr.hpp>
|
||
|
#include <list>
|
||
|
#include <string>
|
||
|
|
||
|
#include "libxtreemfs/system_user_mapping_unix.h"
|
||
|
#include "xtfsutil/xtfsutil_server.h"
|
||
|
#include "xtreemfs/GlobalTypes.pb.h"
|
||
|
|
||
|
namespace xtreemfs {
|
||
|
class Client;
|
||
|
class FuseOptions;
|
||
|
class UserMapping;
|
||
|
class Volume;
|
||
|
|
||
|
namespace pbrpc {
|
||
|
class Stat;
|
||
|
class UserCredentials;
|
||
|
} // namespace pbrpc
|
||
|
|
||
|
/** Uses fuse_interrupted() to check if an operation was cancelled by the user
|
||
|
* and stops retrying to execute the request then.
|
||
|
*
|
||
|
* Always returns 0, if called from a non-Fuse thread. */
|
||
|
int CheckIfOperationInterrupted();
|
||
|
|
||
|
class FuseAdapter {
|
||
|
public:
|
||
|
/** Creates a new instance of FuseAdapter, but does not create any libxtreemfs
|
||
|
* Client yet.
|
||
|
*
|
||
|
* Use Start() to actually create the client and mount the volume given in
|
||
|
* options. May modify options.
|
||
|
*/
|
||
|
explicit FuseAdapter(FuseOptions* options);
|
||
|
|
||
|
~FuseAdapter();
|
||
|
|
||
|
/** Create client, open volume and start needed threads.
|
||
|
* @return Returns a list of additional "-o<option>" Fuse options which may be
|
||
|
* generated after processing the "options" parameter and have to be
|
||
|
* considered before starting Fuse.
|
||
|
* @remark Ownership of the list elements is transferred to the caller. */
|
||
|
void Start(std::list<char*>* required_fuse_options);
|
||
|
|
||
|
/** Shutdown threads, close Volume and Client and blocks until all threads are
|
||
|
* stopped. */
|
||
|
void Stop();
|
||
|
|
||
|
/** After successfully executing fuse_new, tell libxtreemfs to use
|
||
|
* fuse_interrupted() if a request was cancelled by the user. */
|
||
|
void SetInterruptQueryFunction() const;
|
||
|
|
||
|
void GenerateUserCredentials(
|
||
|
uid_t uid,
|
||
|
gid_t gid,
|
||
|
pid_t pid,
|
||
|
xtreemfs::pbrpc::UserCredentials* user_credentials);
|
||
|
|
||
|
/** Generate UserCredentials using information from fuse context or the
|
||
|
* current process (in that case set fuse_context to NULL). */
|
||
|
void GenerateUserCredentials(
|
||
|
struct fuse_context* fuse_context,
|
||
|
xtreemfs::pbrpc::UserCredentials* user_credentials);
|
||
|
|
||
|
/** Fill a Fuse stat object with information from an XtreemFS stat. */
|
||
|
void ConvertXtreemFSStatToFuse(const xtreemfs::pbrpc::Stat& xtreemfs_stat,
|
||
|
struct stat* fuse_stat);
|
||
|
|
||
|
/** Converts given UNIX file handle flags into XtreemFS symbols. */
|
||
|
xtreemfs::pbrpc::SYSTEM_V_FCNTL ConvertFlagsUnixToXtreemFS(int flags);
|
||
|
|
||
|
/** Converts from XtreemFS error codes to the system ones. */
|
||
|
int ConvertXtreemFSErrnoToFuse(xtreemfs::pbrpc::POSIXErrno xtreemfs_errno);
|
||
|
|
||
|
// Fuse operations as called by placeholder functions in fuse_operations.h. */
|
||
|
int statfs(const char *path, struct statvfs *statv);
|
||
|
int getattr(const char *path, struct stat *statbuf);
|
||
|
int getxattr(const char *path, const char *name, char *value, size_t size);
|
||
|
|
||
|
/** Creates CachedDirectoryEntries struct and let fi->fh point to it. */
|
||
|
int opendir(const char *path, struct fuse_file_info *fi);
|
||
|
|
||
|
/** Uses the Fuse readdir offset approach to handle readdir requests in chunks
|
||
|
* instead of one large request. */
|
||
|
int readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset,
|
||
|
struct fuse_file_info *fi);
|
||
|
|
||
|
/** Deletes CachedDirectoryEntries struct which is hold by fi->fh. */
|
||
|
int releasedir(const char *path, struct fuse_file_info *fi);
|
||
|
|
||
|
int utime(const char *path, struct utimbuf *ubuf);
|
||
|
int utimens(const char *path, const struct timespec tv[2]);
|
||
|
int create(const char *path, mode_t mode, struct fuse_file_info *fi);
|
||
|
int mknod(const char *path, mode_t mode, dev_t device);
|
||
|
int mkdir(const char *path, mode_t mode);
|
||
|
int open(const char *path, struct fuse_file_info *fi);
|
||
|
int truncate(const char *path, off_t newsize);
|
||
|
int ftruncate(const char *path, off_t offset, struct fuse_file_info *fi);
|
||
|
int write(const char *path, const char *buf, size_t size, off_t offset,
|
||
|
struct fuse_file_info *fi);
|
||
|
int flush(const char *path, struct fuse_file_info *fi);
|
||
|
int read(const char *path, char *buf, size_t size, off_t offset,
|
||
|
struct fuse_file_info *fi);
|
||
|
int access(const char *path, int mask);
|
||
|
int unlink(const char *path);
|
||
|
int fgetattr(const char *path, struct stat *statbuf,
|
||
|
struct fuse_file_info *fi);
|
||
|
int release(const char *path, struct fuse_file_info *fi);
|
||
|
|
||
|
int readlink(const char *path, char *buf, size_t size);
|
||
|
int rmdir(const char *path);
|
||
|
int symlink(const char *path, const char *link);
|
||
|
int rename(const char *path, const char *newpath);
|
||
|
int link(const char *path, const char *newpath);
|
||
|
int chmod(const char *path, mode_t mode);
|
||
|
int chown(const char *path, uid_t uid, gid_t gid);
|
||
|
|
||
|
int setxattr(const char *path, const char *name, const char *value,
|
||
|
size_t size, int flags);
|
||
|
int listxattr(const char *path, char *list, size_t size);
|
||
|
int removexattr(const char *path, const char *name);
|
||
|
|
||
|
int lock(const char* path, struct fuse_file_info *fi, int cmd,
|
||
|
struct flock* flock);
|
||
|
|
||
|
private:
|
||
|
/** Contains all needed options to mount the requested volume. */
|
||
|
FuseOptions* options_;
|
||
|
|
||
|
/** Translates between local and remote usernames and groups. */
|
||
|
SystemUserMappingUnix system_user_mapping_;
|
||
|
|
||
|
/** Created libxtreemfs Client. */
|
||
|
boost::scoped_ptr<Client> client_;
|
||
|
|
||
|
/** Opened libxtreemfs Volume. */
|
||
|
Volume* volume_;
|
||
|
|
||
|
/** Server for processing commands sent from the xtfsutil tool
|
||
|
via xctl files. */
|
||
|
XtfsUtilServer xctl_;
|
||
|
};
|
||
|
|
||
|
} // namespace xtreemfs
|
||
|
|
||
|
#endif // CPP_INCLUDE_FUSE_FUSE_ADAPTER_H_
|