Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'support/sys-stat.c')
-rw-r--r--support/sys-stat.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/support/sys-stat.c b/support/sys-stat.c
new file mode 100644
index 00000000000..3ff4888316e
--- /dev/null
+++ b/support/sys-stat.c
@@ -0,0 +1,118 @@
+/*
+ * <sys/stat.h> wrapper functions.
+ *
+ * Authors:
+ * Jonathan Pryor (jonpryor@vt.edu)
+ *
+ * Copyright (C) 2004 Jonathan Pryor
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif /* ndef _GNU_SOURCE */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "map.h"
+#include "mph.h"
+
+G_BEGIN_DECLS
+
+struct Mono_Posix_Syscall_Stat {
+ /* dev_t */ mph_dev_t st_dev; /* device */
+ /* ino_t */ mph_ino_t st_ino; /* inode */
+ /* mode_t */ guint32 st_mode; /* protection */
+ guint32 _padding_; /* structure padding */
+ /* nlink_t */ mph_nlink_t st_nlink; /* number of hard links */
+ /* uid_t */ mph_uid_t st_uid; /* user ID of owner */
+ /* gid_t */ mph_gid_t st_gid; /* group ID of owner */
+ /* dev_t */ mph_dev_t st_rdev; /* device type (if inode device) */
+ /* off_t */ mph_off_t st_size; /* total size, in bytes */
+ /* blksize_t */ mph_blksize_t st_blksize; /* blocksize for filesystem I/O */
+ /* blkcnt_t */ mph_blkcnt_t st_blocks; /* number of blocks allocated */
+
+ /* st_atime, st_mtime, and st_ctime are macros (!), so use a slightly
+ * different name to appease CPP */
+
+ /* time_t */ mph_time_t st_atime_; /* time of last access */
+ /* time_t */ mph_time_t st_mtime_; /* time of last modification */
+ /* time_t */ mph_time_t st_ctime_; /* time of last status change */
+};
+
+static int
+copy_stat (struct Mono_Posix_Syscall_Stat *to, struct stat *from)
+{
+ if (Mono_Posix_ToFilePermissions (from->st_mode, &to->st_mode) == -1)
+ return -1;
+ to->st_dev = from->st_dev;
+ to->st_ino = from->st_ino;
+ to->st_nlink = from->st_nlink;
+ to->st_uid = from->st_uid;
+ to->st_gid = from->st_gid;
+ to->st_rdev = from->st_rdev;
+ to->st_size = from->st_size;
+ to->st_blksize = from->st_blksize;
+ to->st_blocks = from->st_blocks;
+ to->st_atime_ = from->st_atime;
+ to->st_mtime_ = from->st_mtime;
+ to->st_ctime_ = from->st_ctime;
+ return 0;
+}
+
+gint32
+Mono_Posix_Syscall_stat (const char *file_name, struct Mono_Posix_Syscall_Stat *buf)
+{
+ int r;
+ struct stat _buf;
+
+ if (buf == NULL) {
+ errno = EFAULT;
+ return -1;
+ }
+ r = stat (file_name, &_buf);
+ if (r != -1 && copy_stat (buf, &_buf) == -1)
+ r = -1;
+ return r;
+}
+
+gint32
+Mono_Posix_Syscall_fstat (int filedes, struct Mono_Posix_Syscall_Stat *buf)
+{
+ int r;
+ struct stat _buf;
+
+ if (buf == NULL) {
+ errno = EFAULT;
+ return -1;
+ }
+ r = fstat (filedes, &_buf);
+ if (r != -1 && copy_stat (buf, &_buf) == -1)
+ r = -1;
+ return r;
+}
+
+gint32
+Mono_Posix_Syscall_lstat (const char *file_name, struct Mono_Posix_Syscall_Stat *buf)
+{
+ int r;
+ struct stat _buf;
+
+ if (buf == NULL) {
+ errno = EFAULT;
+ return -1;
+ }
+ r = lstat (file_name, &_buf);
+ if (r != -1 && copy_stat (buf, &_buf) == -1)
+ r = -1;
+ return r;
+}
+
+G_END_DECLS
+
+/*
+ * vim: noexpandtab
+ */