genode/repos/libports/src/server/fuse_fs/symlink.h

84 lines
1.5 KiB
C++

/*
* \brief Symlink file-system node
* \author Norman Feske
* \author Christian Helmuth
* \author Josef Soentgen
* \date 2013-11-26
*/
#ifndef _SYMLINK_H_
#define _SYMLINK_H_
/* local includes */
#include <node.h>
namespace File_system {
class Symlink;
}
class File_system::Symlink : public Node
{
private:
Node *_parent;
typedef Genode::Path<MAX_PATH_LEN> Path;
Path _path;
size_t _length() const
{
struct stat s;
int res = Fuse::fuse()->op.getattr(_path.base(), &s);
if (res != 0)
return 0;
return s.st_size;
}
public:
Symlink(Node *parent, char const *name, bool create = false)
:
Node(name),
_parent(parent),
_path(name, parent->name())
{ }
Status status()
{
struct stat s;
int res = Fuse::fuse()->op.getattr(_path.base(), &s);
if (res != 0)
return Status();
Status status;
status.inode = s.st_ino ? s.st_ino : 1;
status.size = s.st_size;
status.mode = File_system::Status::MODE_FILE;
return status;
}
size_t read(char *dst, size_t len, seek_off_t seek_offset)
{
int res = Fuse::fuse()->op.readlink(_path.base(), dst, len);
if (res != 0)
return 0;
return Genode::strlen(dst);
}
size_t write(char const *src, size_t len, seek_off_t seek_offset)
{
int res = Fuse::fuse()->op.symlink(src, _path.base());
if (res != 0)
return 0;
return len;
}
file_size_t length() const { return _length(); }
};
#endif /* _SYMLINK_H_ */