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>
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 #ifdef HAVE_STRUCT_STAT_ST_ATIM
55 to
->st_atim
.tv_nsec
= from
->st_atime_nsec
;
57 #ifdef HAVE_STRUCT_STAT_ST_MTIM
58 to
->st_mtim
.tv_nsec
= from
->st_mtime_nsec
;
60 #ifdef HAVE_STRUCT_STAT_ST_CTIM
61 to
->st_ctim
.tv_nsec
= from
->st_ctime_nsec
;
68 Mono_Posix_ToStat (void *_from
, struct Mono_Posix_Stat
*to
)
70 struct stat
*from
= _from
;
71 memset (to
, 0, sizeof(*to
));
73 to
->st_dev
= from
->st_dev
;
74 to
->st_ino
= from
->st_ino
;
75 if (Mono_Posix_ToFilePermissions (from
->st_mode
, &to
->st_mode
) != 0) {
78 to
->st_nlink
= from
->st_nlink
;
79 to
->st_uid
= from
->st_uid
;
80 to
->st_gid
= from
->st_gid
;
81 to
->st_rdev
= from
->st_rdev
;
82 to
->st_size
= from
->st_size
;
84 to
->st_blksize
= from
->st_blksize
;
85 to
->st_blocks
= from
->st_blocks
;
87 to
->st_atime_
= from
->st_atime
;
88 to
->st_mtime_
= from
->st_mtime
;
89 to
->st_ctime_
= from
->st_ctime
;
90 #ifdef HAVE_STRUCT_STAT_ST_ATIM
91 to
->st_atime_nsec
= from
->st_atim
.tv_nsec
;
93 #ifdef HAVE_STRUCT_STAT_ST_MTIM
94 to
->st_mtime_nsec
= from
->st_mtim
.tv_nsec
;
96 #ifdef HAVE_STRUCT_STAT_ST_CTIM
97 to
->st_ctime_nsec
= from
->st_ctim
.tv_nsec
;
104 Mono_Posix_Syscall_stat (const char *file_name
, struct Mono_Posix_Stat
*buf
)
113 r
= stat (file_name
, &_buf
);
114 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
120 Mono_Posix_Syscall_fstat (int filedes
, struct Mono_Posix_Stat
*buf
)
129 r
= fstat (filedes
, &_buf
);
130 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
137 Mono_Posix_Syscall_lstat (const char *file_name
, struct Mono_Posix_Stat
*buf
)
146 r
= lstat (file_name
, &_buf
);
147 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
155 Mono_Posix_Syscall_fstatat (gint32 dirfd
, const char *file_name
, struct Mono_Posix_Stat
*buf
, gint32 flags
)
160 if (Mono_Posix_FromAtFlags (flags
, &flags
) == -1)
167 r
= fstatat (dirfd
, file_name
, &_buf
, flags
);
168 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
176 Mono_Posix_Syscall_mknod (const char *pathname
, guint32 mode
, mph_dev_t dev
)
178 if (Mono_Posix_FromFilePermissions (mode
, &mode
) == -1)
180 return mknod (pathname
, mode
, dev
);
186 Mono_Posix_Syscall_mknodat (int dirfd
, const char *pathname
, guint32 mode
, mph_dev_t dev
)
188 if (Mono_Posix_FromFilePermissions (mode
, &mode
) == -1)
190 return mknodat (dirfd
, pathname
, mode
, dev
);
197 Mono_Posix_Syscall_get_utime_now ()
207 Mono_Posix_Syscall_get_utime_omit ()
216 #if defined(HAVE_FUTIMENS) || defined(HAVE_UTIMENSAT)
217 static inline struct timespec
*
218 copy_utimens (struct timespec
* to
, struct Mono_Posix_Timespec
*from
)
221 to
[0].tv_sec
= from
[0].tv_sec
;
222 to
[0].tv_nsec
= from
[0].tv_nsec
;
223 to
[1].tv_sec
= from
[1].tv_sec
;
224 to
[1].tv_nsec
= from
[1].tv_nsec
;
234 Mono_Posix_Syscall_futimens(int fd
, struct Mono_Posix_Timespec
*tv
)
236 struct timespec _tv
[2];
237 struct timespec
*ptv
;
239 ptv
= copy_utimens (_tv
, tv
);
241 return futimens (fd
, ptv
);
243 #endif /* def HAVE_FUTIMENS */
245 #ifdef HAVE_UTIMENSAT
247 Mono_Posix_Syscall_utimensat(int dirfd
, const char *pathname
, struct Mono_Posix_Timespec
*tv
, int flags
)
249 struct timespec _tv
[2];
250 struct timespec
*ptv
;
252 ptv
= copy_utimens (_tv
, tv
);
254 return utimensat (dirfd
, pathname
, ptv
, flags
);
256 #endif /* def HAVE_UTIMENSAT */