11 typedef struct FStatStor {
27 struct stat_path_args {
42 rstfixup(struct stat *st, FStatStor *rst)
45 * Portability fixup - signextend if machine target
48 if (sizeof(st->st_ino) < sizeof(int64_t))
49 rst->ino = (int64_t)(int)st->st_ino;
51 rst->ino = st->st_ino;
53 if (sizeof(st->st_nlink) < sizeof(int64_t))
54 rst->nlink = (int64_t)(int)st->st_nlink;
56 rst->nlink = st->st_nlink;
58 if (sizeof(st->st_uid) < sizeof(int64_t))
59 rst->uid = (int64_t)(int)st->st_uid;
61 rst->uid = st->st_uid;
63 if (sizeof(st->st_gid) < sizeof(int64_t))
64 rst->gid = (int64_t)(int)st->st_gid;
66 rst->gid = st->st_gid;
68 rst->dev = st->st_dev;
69 rst->gen = st->st_gen;
70 rst->mode = st->st_mode;
72 if (sizeof(st->st_atime) < sizeof(int64_t)) {
73 rst->atime = (int64_t)(uint32_t)st->st_atime;
74 rst->mtime = (int64_t)(uint32_t)st->st_mtime;
75 rst->ctime = (int64_t)(uint32_t)st->st_ctime;
77 rst->atime = st->st_atime;
78 rst->mtime = st->st_mtime;
79 rst->ctime = st->st_ctime;
82 if (sizeof(st->st_size) < sizeof(int64_t))
83 rst->size = (int64_t)(int)st->st_size;
85 rst->size = st->st_size;
89 RuneSysCall_stat(struct stat_path_args *args, int *resp)
91 FStatStor *rst = args->lvs.s_Addr;
92 const char *path = args->path.s_Addr;
95 STRBOUNDSCHECK(&args->path, PATH_MAX);
96 if (stat(path, &st) == 0) {
107 RuneSysCall_lstat(struct stat_path_args *args, int *resp)
109 FStatStor *rst = args->lvs.s_Addr;
110 const char *path = args->path.s_Addr;
113 STRBOUNDSCHECK(&args->path, PATH_MAX);
114 if (lstat(path, &st) == 0) {
125 RuneSysCall_fstat(struct stat_fd_args *args, int *resp)
127 FStatStor *rst = args->lvs.s_Addr;
130 if (fstat(args->fd, &st) == 0) {
141 RuneSysCall_chmod(struct stat_path_args *args, int *resp)
143 FStatStor *rst = args->lvs.s_Addr;
144 const char *path = args->path.s_Addr;
146 STRBOUNDSCHECK(&args->path, PATH_MAX);
147 if (chmod(path, rst->mode) == 0) {
157 RuneSysCall_lchmod(struct stat_path_args *args, int *resp)
159 FStatStor *rst = args->lvs.s_Addr;
160 const char *path = args->path.s_Addr;
162 STRBOUNDSCHECK(&args->path, PATH_MAX);
163 if (lchmod(path, rst->mode) == 0) {
173 RuneSysCall_fchmod(struct stat_fd_args *args, int *resp)
175 FStatStor *rst = args->lvs.s_Addr;
177 if (fchmod(args->fd, rst->mode) == 0) {
187 RuneSysCall_chown(struct stat_path_args *args, int *resp)
189 FStatStor *rst = args->lvs.s_Addr;
190 const char *path = args->path.s_Addr;
192 STRBOUNDSCHECK(&args->path, PATH_MAX);
193 if (chown(path, rst->uid, rst->gid) == 0) {
203 RuneSysCall_lchown(struct stat_path_args *args, int *resp)
205 FStatStor *rst = args->lvs.s_Addr;
206 const char *path = args->path.s_Addr;
208 STRBOUNDSCHECK(&args->path, PATH_MAX);
209 if (lchown(path, rst->uid, rst->gid) == 0) {
219 RuneSysCall_fchown(struct stat_fd_args *args, int *resp)
221 FStatStor *rst = args->lvs.s_Addr;
223 if (fchown(args->fd, rst->uid, rst->gid) == 0) {
233 RuneSysCall_utimes(struct stat_path_args *args, int *resp)
235 FStatStor *rst = args->lvs.s_Addr;
236 const char *path = args->path.s_Addr;
237 struct timeval times[2];
239 STRBOUNDSCHECK(&args->path, PATH_MAX);
240 times[0].tv_sec = rst->atime;
241 times[0].tv_usec = (rst->atime == (runetime_t)-1 ? -1 : 0);
242 times[1].tv_sec = rst->mtime;
243 times[1].tv_usec = (rst->mtime == (runetime_t)-1 ? -1 : 0);
245 if (utimes(path, times) == 0) {
255 RuneSysCall_lutimes(struct stat_path_args *args, int *resp)
257 FStatStor *rst = args->lvs.s_Addr;
258 const char *path = args->path.s_Addr;
259 struct timeval times[2];
261 STRBOUNDSCHECK(&args->path, PATH_MAX);
262 times[0].tv_sec = rst->atime;
263 times[0].tv_usec = (rst->atime == (runetime_t)-1 ? -1 : 0);
264 times[1].tv_sec = rst->mtime;
265 times[1].tv_usec = (rst->mtime == (runetime_t)-1 ? -1 : 0);
267 if (lutimes(path, times) == 0) {
277 RuneSysCall_futimes(struct stat_fd_args *args, int *resp)
279 FStatStor *rst = args->lvs.s_Addr;
280 struct timeval times[2];
282 times[0].tv_sec = rst->atime;
283 times[0].tv_usec = (rst->atime == (runetime_t)-1 ? -1 : 0);
284 times[1].tv_sec = rst->mtime;
285 times[1].tv_usec = (rst->mtime == (runetime_t)-1 ? -1 : 0);
287 if (futimes(args->fd, times) == 0) {