aboutsummaryrefslogtreecommitdiff
path: root/src/os
diff options
context:
space:
mode:
Diffstat (limited to 'src/os')
-rw-r--r--src/os/fs.c48
-rw-r--r--src/os/os.h38
2 files changed, 86 insertions, 0 deletions
diff --git a/src/os/fs.c b/src/os/fs.c
index e03d06669d..89eb4c8691 100644
--- a/src/os/fs.c
+++ b/src/os/fs.c
@@ -189,6 +189,16 @@ int os_file_is_writable(const char *name)
return 0;
}
+bool os_get_file_size(const char *name, off_t *size)
+{
+ uv_stat_t statbuf;
+ if (os_stat((char_u *)name, &statbuf) == OK) {
+ *size = statbuf.st_size;
+ return true;
+ }
+ return false;
+}
+
int os_rename(const char_u *path, const char_u *new_path)
{
uv_fs_t request;
@@ -227,3 +237,41 @@ int os_remove(const char *path)
return result;
}
+bool os_get_file_info(const char *path, FileInfo *file_info)
+{
+ if (os_stat((char_u *)path, &(file_info->stat)) == OK) {
+ return true;
+ }
+ return false;
+}
+
+bool os_get_file_info_link(const char *path, FileInfo *file_info)
+{
+ uv_fs_t request;
+ int result = uv_fs_lstat(uv_default_loop(), &request, path, NULL);
+ file_info->stat = request.statbuf;
+ uv_fs_req_cleanup(&request);
+ if (result == kLibuvSuccess) {
+ return true;
+ }
+ return false;
+}
+
+bool os_get_file_info_fd(int file_descriptor, FileInfo *file_info)
+{
+ uv_fs_t request;
+ int result = uv_fs_fstat(uv_default_loop(), &request, file_descriptor, NULL);
+ file_info->stat = request.statbuf;
+ uv_fs_req_cleanup(&request);
+ if (result == kLibuvSuccess) {
+ return true;
+ }
+ return false;
+}
+
+bool os_file_info_id_equal(FileInfo *file_info_1, FileInfo *file_info_2)
+{
+ return file_info_1->stat.st_ino == file_info_2->stat.st_ino
+ && file_info_1->stat.st_dev == file_info_2->stat.st_dev;
+}
+
diff --git a/src/os/os.h b/src/os/os.h
index 67cda28348..b30872f06d 100644
--- a/src/os/os.h
+++ b/src/os/os.h
@@ -58,6 +58,12 @@ bool os_file_is_readonly(const char *name);
/// @return `2` for a directory which we have rights to write into.
int os_file_is_writable(const char *name);
+/// Get the size of a file in bytes.
+///
+/// @param[out] size pointer to an off_t to put the size into.
+/// @return `true` for success, `false` for failure.
+bool os_get_file_size(const char *name, off_t *size);
+
/// Rename a file or directory.
///
/// @return `OK` for success, `FAIL` for failure.
@@ -105,4 +111,36 @@ char *os_get_user_directory(const char *name);
/// @return OK on success, FAIL if an failure occured.
int os_stat(const char_u *name, uv_stat_t *statbuf);
+/// Struct which encapsulates stat information.
+typedef struct {
+ // TODO(stefan991): make stat private
+ uv_stat_t stat;
+} FileInfo;
+
+/// Get the file information for a given path
+///
+/// @param file_descriptor File descriptor of the file.
+/// @param[out] file_info Pointer to a FileInfo to put the information in.
+/// @return `true` on sucess, `false` for failure.
+bool os_get_file_info(const char *path, FileInfo *file_info);
+
+/// Get the file information for a given path without following links
+///
+/// @param path Path to the file.
+/// @param[out] file_info Pointer to a FileInfo to put the information in.
+/// @return `true` on sucess, `false` for failure.
+bool os_get_file_info_link(const char *path, FileInfo *file_info);
+
+/// Get the file information for a given file descriptor
+///
+/// @param file_descriptor File descriptor of the file.
+/// @param[out] file_info Pointer to a FileInfo to put the information in.
+/// @return `true` on sucess, `false` for failure.
+bool os_get_file_info_fd(int file_descriptor, FileInfo *file_info);
+
+/// Compare the inodes of two FileInfos
+///
+/// @return `true` if the two FileInfos represent the same file.
+bool os_file_info_id_equal(FileInfo *file_info_1, FileInfo *file_info_2);
+
#endif // NEOVIM_OS_OS_H