2 * <sys/stat.h> wrapper functions.
5 * Jonathan Pryor (jonpryor@vt.edu)
7 * Copyright (C) 2004-2006 Jonathan Pryor
12 #endif /* ndef _GNU_SOURCE */
14 #include <sys/types.h>
22 #include "mph.h" /* Don't remove or move after map.h! Works around issues with Android SDK unified headers */
28 Mono_Posix_FromStat (struct Mono_Posix_Stat
*from
, void *_to
)
30 struct stat
*to
= _to
;
31 memset (to
, 0, sizeof(*to
));
33 to
->st_dev
= from
->st_dev
;
34 to
->st_ino
= from
->st_ino
;
36 unsigned int to_st_mode
;
37 if (Mono_Posix_FromFilePermissions (from
->st_mode
, &to_st_mode
) != 0) {
41 to
->st_mode
= to_st_mode
;
42 to
->st_nlink
= from
->st_nlink
;
43 to
->st_uid
= from
->st_uid
;
44 to
->st_gid
= from
->st_gid
;
45 to
->st_rdev
= from
->st_rdev
;
46 to
->st_size
= from
->st_size
;
48 to
->st_blksize
= from
->st_blksize
;
49 to
->st_blocks
= from
->st_blocks
;
51 to
->st_atime
= from
->st_atime_
;
52 to
->st_mtime
= from
->st_mtime_
;
53 to
->st_ctime
= from
->st_ctime_
;
54 #if HAVE_STRUCT_STAT_ST_ATIMESPEC
55 to
->st_atimespec
.tv_sec
= from
->st_atime_
;
56 to
->st_atimespec
.tv_nsec
= from
->st_atime_nsec
;
57 to
->st_mtimespec
.tv_sec
= from
->st_mtime_
;
58 to
->st_mtimespec
.tv_nsec
= from
->st_mtime_nsec
;
59 to
->st_ctimespec
.tv_sec
= from
->st_ctime_
;
60 to
->st_ctimespec
.tv_nsec
= from
->st_ctime_nsec
;
62 # ifdef HAVE_STRUCT_STAT_ST_ATIM
63 to
->st_atim
.tv_nsec
= from
->st_atime_nsec
;
65 # ifdef HAVE_STRUCT_STAT_ST_MTIM
66 to
->st_mtim
.tv_nsec
= from
->st_mtime_nsec
;
68 # ifdef HAVE_STRUCT_STAT_ST_CTIM
69 to
->st_ctim
.tv_nsec
= from
->st_ctime_nsec
;
76 Mono_Posix_ToStat (void *_from
, struct Mono_Posix_Stat
*to
)
78 struct stat
*from
= _from
;
79 memset (to
, 0, sizeof(*to
));
81 to
->st_dev
= from
->st_dev
;
82 to
->st_ino
= from
->st_ino
;
83 if (Mono_Posix_ToFilePermissions (from
->st_mode
, &to
->st_mode
) != 0) {
86 to
->st_nlink
= from
->st_nlink
;
87 to
->st_uid
= from
->st_uid
;
88 to
->st_gid
= from
->st_gid
;
89 to
->st_rdev
= from
->st_rdev
;
90 to
->st_size
= from
->st_size
;
92 to
->st_blksize
= from
->st_blksize
;
93 to
->st_blocks
= from
->st_blocks
;
95 to
->st_atime_
= from
->st_atime
;
96 to
->st_mtime_
= from
->st_mtime
;
97 to
->st_ctime_
= from
->st_ctime
;
98 #if HAVE_STRUCT_STAT_ST_ATIMESPEC
99 to
->st_atime_nsec
= from
->st_atimespec
.tv_nsec
;
100 to
->st_mtime_nsec
= from
->st_mtimespec
.tv_nsec
;
101 to
->st_ctime_nsec
= from
->st_ctimespec
.tv_nsec
;
103 # ifdef HAVE_STRUCT_STAT_ST_ATIM
104 to
->st_atime_nsec
= from
->st_atim
.tv_nsec
;
106 # ifdef HAVE_STRUCT_STAT_ST_MTIM
107 to
->st_mtime_nsec
= from
->st_mtim
.tv_nsec
;
109 # ifdef HAVE_STRUCT_STAT_ST_CTIM
110 to
->st_ctime_nsec
= from
->st_ctim
.tv_nsec
;
117 Mono_Posix_Syscall_stat (const char *file_name
, struct Mono_Posix_Stat
*buf
)
126 r
= stat (file_name
, &_buf
);
127 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
133 Mono_Posix_Syscall_fstat (int filedes
, struct Mono_Posix_Stat
*buf
)
142 r
= fstat (filedes
, &_buf
);
143 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
150 Mono_Posix_Syscall_lstat (const char *file_name
, struct Mono_Posix_Stat
*buf
)
159 r
= lstat (file_name
, &_buf
);
160 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
168 Mono_Posix_Syscall_fstatat (gint32 dirfd
, const char *file_name
, struct Mono_Posix_Stat
*buf
, gint32 flags
)
173 if (Mono_Posix_FromAtFlags (flags
, &flags
) == -1)
180 r
= fstatat (dirfd
, file_name
, &_buf
, flags
);
181 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
189 Mono_Posix_Syscall_mknod (const char *pathname
, guint32 mode
, mph_dev_t dev
)
191 if (Mono_Posix_FromFilePermissions (mode
, &mode
) == -1)
193 return mknod (pathname
, mode
, dev
);
199 Mono_Posix_Syscall_mknodat (int dirfd
, const char *pathname
, guint32 mode
, mph_dev_t dev
)
201 if (Mono_Posix_FromFilePermissions (mode
, &mode
) == -1)
203 return mknodat (dirfd
, pathname
, mode
, dev
);
210 Mono_Posix_Syscall_get_utime_now ()
220 Mono_Posix_Syscall_get_utime_omit ()
229 #if defined(HAVE_FUTIMENS) || defined(HAVE_UTIMENSAT)
230 static inline struct timespec
*
231 copy_utimens (struct timespec
* to
, struct Mono_Posix_Timespec
*from
)
234 to
[0].tv_sec
= from
[0].tv_sec
;
235 to
[0].tv_nsec
= from
[0].tv_nsec
;
236 to
[1].tv_sec
= from
[1].tv_sec
;
237 to
[1].tv_nsec
= from
[1].tv_nsec
;
247 Mono_Posix_Syscall_futimens(int fd
, struct Mono_Posix_Timespec
*tv
)
249 struct timespec _tv
[2];
250 struct timespec
*ptv
;
252 ptv
= copy_utimens (_tv
, tv
);
254 return futimens (fd
, ptv
);
256 #endif /* def HAVE_FUTIMENS */
258 #ifdef HAVE_UTIMENSAT
260 Mono_Posix_Syscall_utimensat(int dirfd
, const char *pathname
, struct Mono_Posix_Timespec
*tv
, int flags
)
262 struct timespec _tv
[2];
263 struct timespec
*ptv
;
265 ptv
= copy_utimens (_tv
, tv
);
267 return utimensat (dirfd
, pathname
, ptv
, flags
);
269 #endif /* def HAVE_UTIMENSAT */