xref: /haiku/src/system/libroot/posix/utime.c (revision ae9019359606f1db67632ef51a77ce70001d3770)
15af32e75SAxel Dörfler /*
26a9eee58SAxel Dörfler  * Copyright 2002-2009, Axel Dörfler, axeld@pinc-software.de.
35e2ef462SAxel Dörfler  * Distributed under the terms of the MIT License.
45af32e75SAxel Dörfler  */
55af32e75SAxel Dörfler 
65af32e75SAxel Dörfler 
76a9eee58SAxel Dörfler #include <utime.h>
86a9eee58SAxel Dörfler 
96a9eee58SAxel Dörfler #include <errno.h>
106a9eee58SAxel Dörfler #include <time.h>
116a9eee58SAxel Dörfler 
125e2ef462SAxel Dörfler #include <NodeMonitor.h>
135af32e75SAxel Dörfler 
14*ae901935SOliver Tappe #include <errno_private.h>
155af32e75SAxel Dörfler #include <syscalls.h>
165af32e75SAxel Dörfler 
175af32e75SAxel Dörfler 
185af32e75SAxel Dörfler #define RETURN_AND_SET_ERRNO(err) \
195af32e75SAxel Dörfler 	if (err < 0) { \
20*ae901935SOliver Tappe 		__set_errno(err); \
215af32e75SAxel Dörfler 		return -1; \
225af32e75SAxel Dörfler 	} \
235af32e75SAxel Dörfler 	return err;
245af32e75SAxel Dörfler 
255af32e75SAxel Dörfler 
265af32e75SAxel Dörfler int
275af32e75SAxel Dörfler utime(const char *path, const struct utimbuf *times)
285af32e75SAxel Dörfler {
295af32e75SAxel Dörfler 	struct stat stat;
305af32e75SAxel Dörfler 	status_t status;
315af32e75SAxel Dörfler 
325af32e75SAxel Dörfler 	if (times != NULL) {
336a9eee58SAxel Dörfler 		stat.st_atim.tv_sec = times->actime;
346a9eee58SAxel Dörfler 		stat.st_mtim.tv_sec = times->modtime;
356a9eee58SAxel Dörfler 		stat.st_atim.tv_nsec = stat.st_mtim.tv_nsec = 0;
366a9eee58SAxel Dörfler 	} else {
376a9eee58SAxel Dörfler 		bigtime_t now = real_time_clock_usecs();
386a9eee58SAxel Dörfler 		stat.st_atim.tv_sec = stat.st_mtim.tv_sec = now / 1000000;
396a9eee58SAxel Dörfler 		stat.st_atim.tv_nsec = stat.st_mtim.tv_nsec = (now % 1000000) * 1000;
406a9eee58SAxel Dörfler 	}
415af32e75SAxel Dörfler 
425af32e75SAxel Dörfler 	status = _kern_write_stat(-1, path, true, &stat, sizeof(struct stat),
435e2ef462SAxel Dörfler 		B_STAT_MODIFICATION_TIME | B_STAT_ACCESS_TIME);
445af32e75SAxel Dörfler 
455af32e75SAxel Dörfler 	RETURN_AND_SET_ERRNO(status);
465af32e75SAxel Dörfler }
475af32e75SAxel Dörfler 
48