17#include <sys/resource.h>
30std::unique_ptr<struct stat> stat(
const std::string& pathname);
36void stat(
const std::string& pathname,
struct stat& st);
43bool isdir(
const std::string& pathname);
46bool isblk(
const std::string& pathname);
49bool ischr(
const std::string& pathname);
52bool isfifo(
const std::string& pathname);
55bool islnk(
const std::string& pathname);
58bool isreg(
const std::string& pathname);
61bool issock(
const std::string& pathname);
64time_t timestamp(
const std::string& file);
67time_t timestamp(
const std::string& file, time_t def);
70size_t size(
const std::string& file);
73size_t size(
const std::string& file,
size_t def);
76ino_t inode(
const std::string& file);
79ino_t inode(
const std::string& file, ino_t def);
82bool access(
const std::string& s,
int m);
85bool exists(
const std::string& s);
91void chdir(
const std::string& dir);
94void chroot(
const std::string& dir);
97mode_t umask(mode_t mask);
100std::string abspath(
const std::string& pathname);
115 MMap(
void* addr,
size_t length);
118 MMap& operator=(
const MMap&) =
delete;
121 size_t size()
const {
return length; }
126 operator const T*()
const {
return reinterpret_cast<const T*
>(addr); }
129 operator T*()
const {
return reinterpret_cast<T*
>(addr); }
187 void fstat(
struct stat& st);
188 void fchmod(mode_t mode);
190 void futimens(
const struct ::timespec ts[2]);
197 size_t read(
void* buf,
size_t count);
214 size_t write(
const void* buf,
size_t count);
216 template<
typename Container>
217 size_t write(
const Container& c)
219 return write(c.data(), c.size() *
sizeof(Container::value_type));
225 template<
typename Container>
237 template<
typename Container>
243 off_t lseek(off_t offset,
int whence=SEEK_SET);
245 size_t pread(
void* buf,
size_t count, off_t offset);
246 size_t pwrite(
const void* buf,
size_t count, off_t offset);
248 template<
typename Container>
249 size_t pwrite(
const Container& c, off_t offset)
251 return pwrite(c.data(), c.size() *
sizeof(
typename Container::value_type), offset);
254 void ftruncate(off_t length);
256 MMap mmap(
size_t length,
int prot,
int flags, off_t offset=0);
290 operator int()
const {
return fd; }
301 struct ::timespec ts[2];
316 std::string pathname;
332 const std::string&
name()
const {
return pathname; }
341 using NamedFileDescriptor::NamedFileDescriptor;
368 struct iterator :
public std::iterator<std::input_iterator_tag, struct dirent>
370 Path* path =
nullptr;
372 struct dirent* cur_entry =
nullptr;
380 : dir(o.dir), cur_entry(o.cur_entry)
383 o.cur_entry =
nullptr;
389 bool operator==(
const iterator& i)
const;
390 bool operator!=(
const iterator& i)
const;
391 struct dirent& operator*()
const {
return *cur_entry; }
392 struct dirent* operator->()
const {
return cur_entry; }
420 using ManagedNamedFileDescriptor::ManagedNamedFileDescriptor;
425 Path(
const char* pathname,
int flags=0, mode_t mode=0777);
429 Path(
const std::string& pathname,
int flags=0, mode_t mode=0777);
433 Path(
Path& parent,
const char* pathname,
int flags=0, mode_t mode=0777);
436 Path& operator=(
const Path&) =
delete;
440 void open(
int flags, mode_t mode=0777);
450 int openat(
const char* pathname,
int flags, mode_t mode=0777);
455 bool faccessat(
const char* pathname,
int mode,
int flags=0);
457 void fstatat(
const char* pathname,
struct stat& st);
463 void lstatat(
const char* pathname,
struct stat& st);
468 void unlinkat(
const char* pathname);
470 void mkdirat(
const char* pathname, mode_t mode=0777);
475 void symlinkat(
const char* target,
const char* linkpath);
477 std::string readlinkat(
const char* pathname);
486 static std::string mkdtemp(
const std::string& prefix);
487 static std::string mkdtemp(
const char* prefix);
488 static std::string mkdtemp(
char* pathname_template);
498 using ManagedNamedFileDescriptor::ManagedNamedFileDescriptor;
506 File(
const std::string& pathname);
509 File(
const std::string& pathname,
int flags, mode_t mode=0777);
511 File& operator=(
const File&) =
delete;
515 void open(
int flags, mode_t mode=0777);
523 static File mkstemp(
const std::string& prefix);
524 static File mkstemp(
const char* prefix);
525 static File mkstemp(
char* pathname_template);
537 bool m_unlink_on_exit =
true;
541 Tempfile(
const std::string& prefix);
562 bool m_rmtree_on_exit =
true;
566 Tempdir(
const std::string& prefix);
576std::string read_file(
const std::string &file);
584void write_file(
const std::string& file,
const std::string& data, mode_t mode=0777);
592void write_file(
const std::string& file,
const void* data,
size_t size, mode_t mode=0777);
603void write_file_atomically(
const std::string& file,
const std::string& data, mode_t mode=0777);
614void write_file_atomically(
const std::string& file,
const void* data,
size_t size, mode_t mode=0777);
618std::string mkdtemp(std::string templ);
622void mkFilePath(
const std::string& file);
630bool unlink_ifexists(
const std::string& file);
637bool rename_ifexists(
const std::string& src,
const std::string& dst);
647bool mkdir_ifmissing(
const char* pathname, mode_t mode=0777);
649bool mkdir_ifmissing(
const std::string& pathname, mode_t mode=0777);
657bool makedirs(
const std::string& pathname, mode_t=0777);
666std::string which(
const std::string& name);
669void unlink(
const std::string& pathname);
672void rmdir(
const std::string& pathname);
675void rmtree(
const std::string& pathname);
682bool rmtree_ifexists(
const std::string& pathname);
690void rename(
const std::string& src_pathname,
const std::string& dst_pathname);
695void touch(
const std::string& pathname, time_t ts);
700void clock_gettime(::clockid_t clk_id, struct ::timespec& ts);
705unsigned long long timesec_elapsed(
const struct ::timespec& begin,
const struct ::timespec& until);
713 struct ::timespec ts;
732void getrlimit(
int resource, struct ::rlimit& rlim);
735void setrlimit(
int resource,
const struct ::rlimit& rlim);
741 struct ::rlimit orig;
Common operations on file descriptors.
Definition: sys.h:144
void write_all_or_retry(const void *buf, size_t count)
Write all the data in buf, retrying partial writes.
void setfl(int flags)
Set open flags for the file.
bool ofd_setlk(struct ::flock &)
Open file description locks F_OFD_SETLK operation.
bool read_all_or_retry(void *buf, size_t count)
Read count bytes into bufr, retrying partial reads, stopping at EOF.
bool ofd_setlkw(struct ::flock &, bool retry_on_signal=true)
Open file description locks F_OFD_SETLKW operation.
bool ofd_getlk(struct ::flock &)
Open file description locks F_OFD_GETLK operation.
void write_all_or_throw(const void *buf, size_t count)
Write all the data in buf, throwing runtime_error in case of a partial write.
void close()
Close the file descriptor, setting its value to -1.
void read_all_or_throw(void *buf, size_t count)
Read all the data into buf, throwing runtime_error in case of a partial read.
int getfl()
Get open flags for the file.
bool is_open() const
Check if the file descriptor is open (that is, if it is not -1)
virtual void throw_runtime_error(const char *desc)
Throw a runtime_error unrelated from errno.
virtual void throw_error(const char *desc)
Throw an exception based on errno and the given message.
File in the file system.
Definition: sys.h:496
void open(int flags, mode_t mode=0777)
Wrapper around open(2)
File(const std::string &pathname, int flags, mode_t mode=0777)
Wrapper around open(2)
File(const std::string &pathname)
Create an unopened File object for the given pathname.
bool open_ifexists(int flags, mode_t mode=0777)
Wrap open(2) and return false instead of throwing an exception if open fails with ENOENT.
Wraps a mmapped memory area, unmapping it on destruction.
Definition: sys.h:108
File descriptor with a name.
Definition: sys.h:314
const std::string & name() const
Return the file pathname.
Definition: sys.h:332
virtual void throw_runtime_error(const char *desc)
Throw a runtime_error unrelated from errno.
virtual void throw_error(const char *desc)
Throw an exception based on errno and the given message.
RAII mechanism to save restore file times at the end of some file operations.
Definition: sys.h:298
Open a temporary directory.
Definition: sys.h:560
void rmtree_on_exit(bool val)
Change the rmtree-on-exit behaviour.
Open a temporary file.
Definition: sys.h:535
void unlink_on_exit(bool val)
Change the unlink-on-exit behaviour.
void unlink()
Unlink the file right now.
String functions.
Definition: benchmark.h:13
Access to clock_gettime.
Definition: sys.h:711
Clock(::clockid_t clk_id)
Initialize ts with the value of the given clock.
unsigned long long elapsed()
Return the number of nanoseconds elapsed since the last time ts was updated.
File descriptor that gets automatically closed in the object destructor.
Definition: sys.h:340
~ManagedNamedFileDescriptor()
The destructor closes the file descriptor, but does not check errors on ::close().
Override a soft resource limit during the lifetime of the object.
Definition: sys.h:739
void set(rlim_t rlim)
Change the limit value again.
Iterator for directory entries.
Definition: sys.h:369
Path open_path(int flags=0) const
Return a Path object for this entry.
Wrap a path on the file system opened with O_PATH.
Definition: sys.h:364
bool lstatat_ifexists(const char *pathname, struct stat &st)
lstatat, but in case of ENOENT returns false instead of throwing
Path(const std::string &pathname, int flags=0, mode_t mode=0777)
Open the given pathname with flags | O_PATH.
void lstatat(const char *pathname, struct stat &st)
fstatat with the AT_SYMLINK_NOFOLLOW flag set
int openat_ifexists(const char *pathname, int flags, mode_t mode=0777)
Same as openat, but returns -1 if the file does not exist.
void open(int flags, mode_t mode=0777)
Wrapper around open(2) with flags | O_PATH.
iterator begin()
Begin iterator on all directory entries.
bool fstatat_ifexists(const char *pathname, struct stat &st)
fstatat, but in case of ENOENT returns false instead of throwing
void rmdirat(const char *pathname)
unlinkat with the AT_REMOVEDIR flag set
void rmtree()
Delete the directory pointed to by this Path, with all its contents.
Path(const char *pathname, int flags=0, mode_t mode=0777)
Open the given pathname with flags | O_PATH.
iterator end()
End iterator on all directory entries.
Path(Path &parent, const char *pathname, int flags=0, mode_t mode=0777)
Open the given pathname calling parent.openat, with flags | O_PATH.