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>
26 Mono_Posix_FromStat (struct Mono_Posix_Stat
*from
, void *_to
)
28 struct stat
*to
= _to
;
29 memset (to
, 0, sizeof(*to
));
31 to
->st_dev
= from
->st_dev
;
32 to
->st_ino
= from
->st_ino
;
33 if (Mono_Posix_FromFilePermissions (from
->st_mode
, &to
->st_mode
) != 0) {
36 to
->st_nlink
= from
->st_nlink
;
37 to
->st_uid
= from
->st_uid
;
38 to
->st_gid
= from
->st_gid
;
39 to
->st_rdev
= from
->st_rdev
;
40 to
->st_size
= from
->st_size
;
41 to
->st_blksize
= from
->st_blksize
;
42 to
->st_blocks
= from
->st_blocks
;
43 to
->st_atime
= from
->st_atime_
;
44 to
->st_mtime
= from
->st_mtime_
;
45 to
->st_ctime
= from
->st_ctime_
;
46 #ifdef HAVE_STRUCT_STAT_ST_ATIM
47 to
->st_atim
.tv_nsec
= from
->st_atime_nsec
;
49 #ifdef HAVE_STRUCT_STAT_ST_MTIM
50 to
->st_mtim
.tv_nsec
= from
->st_mtime_nsec
;
52 #ifdef HAVE_STRUCT_STAT_ST_CTIM
53 to
->st_ctim
.tv_nsec
= from
->st_ctime_nsec
;
60 Mono_Posix_ToStat (void *_from
, struct Mono_Posix_Stat
*to
)
62 struct stat
*from
= _from
;
63 memset (to
, 0, sizeof(*to
));
65 to
->st_dev
= from
->st_dev
;
66 to
->st_ino
= from
->st_ino
;
67 if (Mono_Posix_ToFilePermissions (from
->st_mode
, &to
->st_mode
) != 0) {
70 to
->st_nlink
= from
->st_nlink
;
71 to
->st_uid
= from
->st_uid
;
72 to
->st_gid
= from
->st_gid
;
73 to
->st_rdev
= from
->st_rdev
;
74 to
->st_size
= from
->st_size
;
75 to
->st_blksize
= from
->st_blksize
;
76 to
->st_blocks
= from
->st_blocks
;
77 to
->st_atime_
= from
->st_atime
;
78 to
->st_mtime_
= from
->st_mtime
;
79 to
->st_ctime_
= from
->st_ctime
;
80 #ifdef HAVE_STRUCT_STAT_ST_ATIM
81 to
->st_atime_nsec
= from
->st_atim
.tv_nsec
;
83 #ifdef HAVE_STRUCT_STAT_ST_MTIM
84 to
->st_mtime_nsec
= from
->st_mtim
.tv_nsec
;
86 #ifdef HAVE_STRUCT_STAT_ST_CTIM
87 to
->st_ctime_nsec
= from
->st_ctim
.tv_nsec
;
94 Mono_Posix_Syscall_stat (const char *file_name
, struct Mono_Posix_Stat
*buf
)
103 r
= stat (file_name
, &_buf
);
104 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
110 Mono_Posix_Syscall_fstat (int filedes
, struct Mono_Posix_Stat
*buf
)
119 r
= fstat (filedes
, &_buf
);
120 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
126 Mono_Posix_Syscall_lstat (const char *file_name
, struct Mono_Posix_Stat
*buf
)
135 r
= lstat (file_name
, &_buf
);
136 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
143 Mono_Posix_Syscall_fstatat (gint32 dirfd
, const char *file_name
, struct Mono_Posix_Stat
*buf
, gint32 flags
)
148 if (Mono_Posix_FromAtFlags (flags
, &flags
) == -1)
155 r
= fstatat (dirfd
, file_name
, &_buf
, flags
);
156 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
163 Mono_Posix_Syscall_mknod (const char *pathname
, guint32 mode
, mph_dev_t dev
)
165 if (Mono_Posix_FromFilePermissions (mode
, &mode
) == -1)
167 return mknod (pathname
, mode
, dev
);
172 Mono_Posix_Syscall_mknodat (int dirfd
, const char *pathname
, guint32 mode
, mph_dev_t dev
)
174 if (Mono_Posix_FromFilePermissions (mode
, &mode
) == -1)
176 return mknodat (dirfd
, pathname
, mode
, dev
);
183 Mono_Posix_Syscall_get_utime_now ()
193 Mono_Posix_Syscall_get_utime_omit ()
202 static inline struct timespec
*
203 copy_utimens (struct timespec
* to
, struct Mono_Posix_Timespec
*from
)
206 to
[0].tv_sec
= from
[0].tv_sec
;
207 to
[0].tv_nsec
= from
[0].tv_nsec
;
208 to
[1].tv_sec
= from
[1].tv_sec
;
209 to
[1].tv_nsec
= from
[1].tv_nsec
;
218 Mono_Posix_Syscall_futimens(int fd
, struct Mono_Posix_Timespec
*tv
)
220 struct timespec _tv
[2];
221 struct timespec
*ptv
;
223 ptv
= copy_utimens (_tv
, tv
);
225 return futimens (fd
, ptv
);
227 #endif /* def HAVE_FUTIMENS */
229 #ifdef HAVE_UTIMENSAT
231 Mono_Posix_Syscall_utimensat(int dirfd
, const char *pathname
, struct Mono_Posix_Timespec
*tv
, int flags
)
233 struct timespec _tv
[2];
234 struct timespec
*ptv
;
236 ptv
= copy_utimens (_tv
, tv
);
238 return utimensat (dirfd
, pathname
, ptv
, flags
);
240 #endif /* def HAVE_UTIMENSAT */