diff --git a/headers/compatibility/bsd/sys/time.h b/headers/compatibility/bsd/sys/time.h new file mode 100644 index 0000000000..6e71a66813 --- /dev/null +++ b/headers/compatibility/bsd/sys/time.h @@ -0,0 +1,29 @@ +/* + * Copyright 2016-2017 Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef _BSD_SYS_TIME_H_ +#define _BSD_SYS_TIME_H_ + + +#include_next + + +#ifdef _BSD_SOURCE + + +#ifdef __cplusplus +extern "C" { +#endif + +int lutimes(const char *path, const struct timeval times[2]); + +#ifdef __cplusplus +} +#endif + + +#endif + + +#endif /* _BSD_SYS_TIME_H_ */ diff --git a/headers/posix/sys/time.h b/headers/posix/sys/time.h index bb1277ddfe..dfa8d8cf23 100644 --- a/headers/posix/sys/time.h +++ b/headers/posix/sys/time.h @@ -44,7 +44,6 @@ extern int setitimer(int which, const struct itimerval *value, struct itimerval extern int gettimeofday(struct timeval *tv, void *tz); extern int utimes(const char *path, const struct timeval times[2]); -extern int lutimes(const char *path, const struct timeval times[2]); /* legacy */ #ifdef __cplusplus diff --git a/src/libs/bsd/Jamfile b/src/libs/bsd/Jamfile index d8e6c604a9..810ae74933 100644 --- a/src/libs/bsd/Jamfile +++ b/src/libs/bsd/Jamfile @@ -16,6 +16,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { fgetln.c getpass.c issetugid.c + lutimes.c progname.c pty.cpp signal.c diff --git a/src/libs/bsd/lutimes.c b/src/libs/bsd/lutimes.c new file mode 100644 index 0000000000..f43bbf8a83 --- /dev/null +++ b/src/libs/bsd/lutimes.c @@ -0,0 +1,23 @@ +/* + * Copyright, 2016-2017 Haiku, Inc. All rights reserved. + * Released under the terms of the MIT license. + * + * Authors: + * Alexander von Gluck IV, kallisti5@unixzen.com + */ + + +#include + +#include + + +extern int _utimes(const char* path, const struct timeval times[2], + bool traverseLink); + + +int +lutimes(const char* path, const struct timeval times[2]) +{ + return _utimes(path, times, false); +} diff --git a/src/system/libroot/posix/sys/utimes.c b/src/system/libroot/posix/sys/utimes.c index 09794ea3c4..ad844a9419 100644 --- a/src/system/libroot/posix/sys/utimes.c +++ b/src/system/libroot/posix/sys/utimes.c @@ -17,7 +17,10 @@ int -utimes(const char* path, const struct timeval times[2]) +_utimes(const char* path, const struct timeval times[2], bool traverseLink); + +extern int +_utimes(const char* path, const struct timeval times[2], bool traverseLink) { struct stat stat; status_t status; @@ -35,36 +38,17 @@ utimes(const char* path, const struct timeval times[2]) } // traverseLeafLink == true - status = _kern_write_stat(-1, path, true, &stat, sizeof(struct stat), - B_STAT_MODIFICATION_TIME | B_STAT_ACCESS_TIME); + status = _kern_write_stat(-1, path, traverseLink, &stat, + sizeof(struct stat), B_STAT_MODIFICATION_TIME | B_STAT_ACCESS_TIME); RETURN_AND_SET_ERRNO(status); } int -lutimes(const char* path, const struct timeval times[2]) +utimes(const char* path, const struct timeval times[2]) { - struct stat stat; - status_t status; - - if (times != NULL) { - stat.st_atim.tv_sec = times[0].tv_sec; - stat.st_atim.tv_nsec = times[0].tv_usec * 1000; - - stat.st_mtim.tv_sec = times[1].tv_sec; - stat.st_mtim.tv_nsec = times[1].tv_usec * 1000; - } else { - bigtime_t now = real_time_clock_usecs(); - stat.st_atim.tv_sec = stat.st_mtim.tv_sec = now / 1000000; - stat.st_atim.tv_nsec = stat.st_mtim.tv_nsec = (now % 1000000) * 1000; - } - - // traverseLeafLink == false - status = _kern_write_stat(-1, path, false, &stat, sizeof(struct stat), - B_STAT_MODIFICATION_TIME | B_STAT_ACCESS_TIME); - - RETURN_AND_SET_ERRNO(status); + return _utimes(path, times, true); }