xref: /haiku/src/system/libroot/posix/utime.c (revision 5af32e752606778be5dd7379f319fe43cb3f6b8c)
1*5af32e75SAxel Dörfler /*
2*5af32e75SAxel Dörfler ** Copyright 2002-2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3*5af32e75SAxel Dörfler ** Distributed under the terms of the Haiku License.
4*5af32e75SAxel Dörfler */
5*5af32e75SAxel Dörfler 
6*5af32e75SAxel Dörfler 
7*5af32e75SAxel Dörfler #include <fs_interface.h>
8*5af32e75SAxel Dörfler 
9*5af32e75SAxel Dörfler #include <utime.h>
10*5af32e75SAxel Dörfler #include <time.h>
11*5af32e75SAxel Dörfler #include <errno.h>
12*5af32e75SAxel Dörfler #include <syscalls.h>
13*5af32e75SAxel Dörfler 
14*5af32e75SAxel Dörfler 
15*5af32e75SAxel Dörfler #define RETURN_AND_SET_ERRNO(err) \
16*5af32e75SAxel Dörfler 	if (err < 0) { \
17*5af32e75SAxel Dörfler 		errno = err; \
18*5af32e75SAxel Dörfler 		return -1; \
19*5af32e75SAxel Dörfler 	} \
20*5af32e75SAxel Dörfler 	return err;
21*5af32e75SAxel Dörfler 
22*5af32e75SAxel Dörfler 
23*5af32e75SAxel Dörfler int
24*5af32e75SAxel Dörfler utime(const char *path, const struct utimbuf *times)
25*5af32e75SAxel Dörfler {
26*5af32e75SAxel Dörfler 	struct stat stat;
27*5af32e75SAxel Dörfler 	status_t status;
28*5af32e75SAxel Dörfler 
29*5af32e75SAxel Dörfler 	if (times != NULL) {
30*5af32e75SAxel Dörfler 		stat.st_atime = times->actime;
31*5af32e75SAxel Dörfler 		stat.st_mtime = times->modtime;
32*5af32e75SAxel Dörfler 	} else
33*5af32e75SAxel Dörfler 		stat.st_atime = stat.st_mtime = time(NULL);
34*5af32e75SAxel Dörfler 
35*5af32e75SAxel Dörfler 	status = _kern_write_stat(-1, path, true, &stat, sizeof(struct stat),
36*5af32e75SAxel Dörfler 		FS_WRITE_STAT_MTIME | FS_WRITE_STAT_ATIME);
37*5af32e75SAxel Dörfler 
38*5af32e75SAxel Dörfler 	RETURN_AND_SET_ERRNO(status);
39*5af32e75SAxel Dörfler }
40*5af32e75SAxel Dörfler 
41