diff options
Diffstat (limited to 'libc/misc')
-rw-r--r-- | libc/misc/time/Makefile | 2 | ||||
-rw-r--r-- | libc/misc/time/adjtime.c | 51 | ||||
-rw-r--r-- | libc/misc/time/utimes.c | 16 |
3 files changed, 68 insertions, 1 deletions
diff --git a/libc/misc/time/Makefile b/libc/misc/time/Makefile index ec8199c69..76adb2e2f 100644 --- a/libc/misc/time/Makefile +++ b/libc/misc/time/Makefile @@ -25,7 +25,7 @@ include $(TOPDIR)Rules.mak LIBC=$(TOPDIR)libc.a CSRC=localtime.c gmtime.c asctime.c ctime.c asc_conv.c tm_conv.c mktime.c \ - localtime_r.c gmtime_r.c asctime_r.c ctime_r.c + localtime_r.c gmtime_r.c asctime_r.c ctime_r.c utimes.c adjtime.c COBJS=$(patsubst %.c,%.o, $(CSRC)) OBJS=$(COBJS) diff --git a/libc/misc/time/adjtime.c b/libc/misc/time/adjtime.c new file mode 100644 index 000000000..12c1a2a40 --- /dev/null +++ b/libc/misc/time/adjtime.c @@ -0,0 +1,51 @@ +#include <limits.h> +#include <sys/time.h> +#include <sys/timex.h> +#include <errno.h> + +#define MAX_SEC (LONG_MAX / 1000000L - 2) +#define MIN_SEC (LONG_MIN / 1000000L + 2) + +#ifndef MOD_OFFSET +#define modes mode +#endif + +int +adjtime(const struct timeval * itv, struct timeval * otv) +{ + struct timex tntx; + + if (itv) + { + struct timeval tmp; + + /* We will do some check here. */ + tmp.tv_sec = itv->tv_sec + itv->tv_usec / 1000000L; + tmp.tv_usec = itv->tv_usec % 1000000L; + if (tmp.tv_sec > MAX_SEC || tmp.tv_sec < MIN_SEC) + { + errno = EINVAL; + return -1; + } + tntx.offset = tmp.tv_usec + tmp.tv_sec * 1000000L; + tntx.modes = ADJ_OFFSET_SINGLESHOT; + } + else + { + tntx.modes = 0; + } + if (adjtimex(&tntx) < 0) return -1; + if (otv) { + if (tntx.offset < 0) + { + otv->tv_usec = -(-tntx.offset % 1000000); + otv->tv_sec = -(-tntx.offset / 1000000); + } + else + { + otv->tv_usec = tntx.offset % 1000000; + otv->tv_sec = tntx.offset / 1000000; + } + } + return 0; +} diff --git a/libc/misc/time/utimes.c b/libc/misc/time/utimes.c new file mode 100644 index 000000000..364bf83e7 --- /dev/null +++ b/libc/misc/time/utimes.c @@ -0,0 +1,16 @@ +#include <utime.h> +#include <sys/time.h> + +int utimes(const char *path, struct timeval tvp[2]) +{ + struct utimbuf buf, *times; + + if (tvp) { + times = &buf; + times->actime = tvp[0].tv_sec; + times->modtime = tvp[1].tv_sec; + } + else + times = NULL; + return utime(path, times); +} |