diff --git a/ulib/Makefile b/ulib/Makefile index b91ce0d..9ca243b 100644 --- a/ulib/Makefile +++ b/ulib/Makefile @@ -16,6 +16,7 @@ SRCFILES := $(call GRABSRC, \ ubsan \ umalloc \ fs \ + time \ ) CFLAGS += -isystem $(ROOT)/share -isystem $(ROOT)/ulib -isystem $(ROOT)/std/include \ diff --git a/ulib/system/system.c b/ulib/system/system.c index 973d4e0..4f5ab1f 100644 --- a/ulib/system/system.c +++ b/ulib/system/system.c @@ -138,3 +138,7 @@ int32_t dev_stat(DevStat *devstatbuf, size_t idx) { int32_t dev_cmd(Dev_t *dev, uint64_t cmd, void *buf, size_t len, void *extra) { return syscall(SYS_DEV_CMD, (uint64_t)dev, (uint64_t)cmd, (uint64_t)buf, (uint64_t)len, (uint64_t)extra, 0); } + +int32_t time(Time *time) { + return syscall(SYS_TIME, (uint64_t)time, 0, 0, 0, 0, 0); +} diff --git a/ulib/system/system.h b/ulib/system/system.h index 41687db..37f9bc7 100644 --- a/ulib/system/system.h +++ b/ulib/system/system.h @@ -7,6 +7,7 @@ #include #include #include +#include void debugprint(const char *string); int32_t mman_map(uint8_t *addr, size_t size, uint64_t prot, uint64_t flags, uint8_t **out); @@ -41,5 +42,6 @@ int32_t dev_gethandle(Dev_t *dev, char *name); int32_t dev_listsize(void); int32_t dev_stat(DevStat *devstatbuf, size_t idx); int32_t dev_cmd(Dev_t *dev, uint64_t cmd, void *buf, size_t len, void *extra); +int32_t time(Time *time); #endif // ULIB_SYSTEM_SYSTEM_H_ diff --git a/ulib/time/time.c b/ulib/time/time.c new file mode 100644 index 0000000..977ce92 --- /dev/null +++ b/ulib/time/time.c @@ -0,0 +1,31 @@ +#include +#include +#include +#include + +bool time_isleap(uint32_t y) { + return ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)); +} + +const uint16_t days_before_month[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; + +timeunix_t time_tounix(Time *time) { + uint64_t days = 0; + for (uint32_t y = 1970; y < time->year; y++) { + days += time_isleap(y) ? 366 : 365; + } + + days += days_before_month[time->month - 1]; + + if (time->month > 2 && time_isleap(time->year)) { + days += 1; + } + + days += time->day - 1; + + uint64_t secs = days * 86400; + secs += time->hour * 3600; + secs += time->minute * 60; + secs += time->second; + return secs; +} diff --git a/ulib/time/time.h b/ulib/time/time.h new file mode 100644 index 0000000..8fc9f7e --- /dev/null +++ b/ulib/time/time.h @@ -0,0 +1,8 @@ +#ifndef ULIB_TIME_TIME_H_ +#define ULIB_TIME_TIME_H_ + +#include + +timeunix_t time_tounix(Time *time); + +#endif // ULIB_TIME_TIME_H_ diff --git a/ulib/ulib.h b/ulib/ulib.h index d51cef7..561b0ff 100644 --- a/ulib/ulib.h +++ b/ulib/ulib.h @@ -11,12 +11,13 @@ #include #include #include +#include +#include +#include