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
;
34 unsigned int to_st_mode
;
35 if (Mono_Posix_FromFilePermissions (from
->st_mode
, &to_st_mode
) != 0) {
39 to
->st_mode
= to_st_mode
;
40 to
->st_nlink
= from
->st_nlink
;
41 to
->st_uid
= from
->st_uid
;
42 to
->st_gid
= from
->st_gid
;
43 to
->st_rdev
= from
->st_rdev
;
44 to
->st_size
= from
->st_size
;
45 to
->st_blksize
= from
->st_blksize
;
46 to
->st_blocks
= from
->st_blocks
;
47 to
->st_atime
= from
->st_atime_
;
48 to
->st_mtime
= from
->st_mtime_
;
49 to
->st_ctime
= from
->st_ctime_
;
50 #ifdef HAVE_STRUCT_STAT_ST_ATIM
51 to
->st_atim
.tv_nsec
= from
->st_atime_nsec
;
53 #ifdef HAVE_STRUCT_STAT_ST_MTIM
54 to
->st_mtim
.tv_nsec
= from
->st_mtime_nsec
;
56 #ifdef HAVE_STRUCT_STAT_ST_CTIM
57 to
->st_ctim
.tv_nsec
= from
->st_ctime_nsec
;
64 Mono_Posix_ToStat (void *_from
, struct Mono_Posix_Stat
*to
)
66 struct stat
*from
= _from
;
67 memset (to
, 0, sizeof(*to
));
69 to
->st_dev
= from
->st_dev
;
70 to
->st_ino
= from
->st_ino
;
71 if (Mono_Posix_ToFilePermissions (from
->st_mode
, &to
->st_mode
) != 0) {
74 to
->st_nlink
= from
->st_nlink
;
75 to
->st_uid
= from
->st_uid
;
76 to
->st_gid
= from
->st_gid
;
77 to
->st_rdev
= from
->st_rdev
;
78 to
->st_size
= from
->st_size
;
79 to
->st_blksize
= from
->st_blksize
;
80 to
->st_blocks
= from
->st_blocks
;
81 to
->st_atime_
= from
->st_atime
;
82 to
->st_mtime_
= from
->st_mtime
;
83 to
->st_ctime_
= from
->st_ctime
;
84 #ifdef HAVE_STRUCT_STAT_ST_ATIM
85 to
->st_atime_nsec
= from
->st_atim
.tv_nsec
;
87 #ifdef HAVE_STRUCT_STAT_ST_MTIM
88 to
->st_mtime_nsec
= from
->st_mtim
.tv_nsec
;
90 #ifdef HAVE_STRUCT_STAT_ST_CTIM
91 to
->st_ctime_nsec
= from
->st_ctim
.tv_nsec
;
98 Mono_Posix_Syscall_stat (const char *file_name
, struct Mono_Posix_Stat
*buf
)
107 r
= stat (file_name
, &_buf
);
108 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
114 Mono_Posix_Syscall_fstat (int filedes
, struct Mono_Posix_Stat
*buf
)
123 r
= fstat (filedes
, &_buf
);
124 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
130 Mono_Posix_Syscall_lstat (const char *file_name
, struct Mono_Posix_Stat
*buf
)
139 r
= lstat (file_name
, &_buf
);
140 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
147 Mono_Posix_Syscall_fstatat (gint32 dirfd
, const char *file_name
, struct Mono_Posix_Stat
*buf
, gint32 flags
)
152 if (Mono_Posix_FromAtFlags (flags
, &flags
) == -1)
159 r
= fstatat (dirfd
, file_name
, &_buf
, flags
);
160 if (r
!= -1 && Mono_Posix_ToStat (&_buf
, buf
) == -1)
167 Mono_Posix_Syscall_mknod (const char *pathname
, guint32 mode
, mph_dev_t dev
)
169 if (Mono_Posix_FromFilePermissions (mode
, &mode
) == -1)
171 return mknod (pathname
, mode
, dev
);
176 Mono_Posix_Syscall_mknodat (int dirfd
, const char *pathname
, guint32 mode
, mph_dev_t dev
)
178 if (Mono_Posix_FromFilePermissions (mode
, &mode
) == -1)
180 return mknodat (dirfd
, pathname
, mode
, dev
);
187 Mono_Posix_Syscall_get_utime_now ()
197 Mono_Posix_Syscall_get_utime_omit ()
206 static inline struct timespec
*
207 copy_utimens (struct timespec
* to
, struct Mono_Posix_Timespec
*from
)
210 to
[0].tv_sec
= from
[0].tv_sec
;
211 to
[0].tv_nsec
= from
[0].tv_nsec
;
212 to
[1].tv_sec
= from
[1].tv_sec
;
213 to
[1].tv_nsec
= from
[1].tv_nsec
;
222 Mono_Posix_Syscall_futimens(int fd
, struct Mono_Posix_Timespec
*tv
)
224 struct timespec _tv
[2];
225 struct timespec
*ptv
;
227 ptv
= copy_utimens (_tv
, tv
);
229 return futimens (fd
, ptv
);
231 #endif /* def HAVE_FUTIMENS */
233 #ifdef HAVE_UTIMENSAT
235 Mono_Posix_Syscall_utimensat(int dirfd
, const char *pathname
, struct Mono_Posix_Timespec
*tv
, int flags
)
237 struct timespec _tv
[2];
238 struct timespec
*ptv
;
240 ptv
= copy_utimens (_tv
, tv
);
242 return utimensat (dirfd
, pathname
, ptv
, flags
);
244 #endif /* def HAVE_UTIMENSAT */