ref: 895c2c914ce5ea912b0f1818bc173d7aadbee32e
parent: 5256bd97e16fe134d0e9b8b072997b4e9df6cbb0
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Sep 14 09:30:05 EDT 2021
libc: Fix arch/posix As part of the big integration some of the functions located in arch/posix were broken. This patch solves the problem and makes a better separation between portable and not portable parts of the code.
--- a/include/bits/darwin/sys.h
+++ b/include/bits/darwin/sys.h
@@ -6,6 +6,7 @@
#define O_APPEND 0x00000008
#define O_CREAT 0x00000200
+#define AT_FDCWD -100
#define CLOCKS_PER_SEC ((clock_t) 1000000)
#define RUSAGE_SELF 0
--- a/include/bits/dragonfly/sys.h
+++ b/include/bits/dragonfly/sys.h
@@ -6,6 +6,7 @@
#define O_APPEND 0x00000008
#define O_CREAT 0x00000200
+#define AT_FDCWD -100
#define CLOCKS_PER_SEC ((clock_t) 128)
#define RUSAGE_SELF 0
--- a/include/bits/linux/sys.h
+++ b/include/bits/linux/sys.h
@@ -6,6 +6,7 @@
#define O_APPEND 0x00000400
#define O_CREAT 0x00000040
+#define AT_FDCWD -100
#define CLOCKS_PER_SEC ((clock_t) 1000000)
#define RUSAGE_SELF 0
--- a/include/bits/netbsd/sys.h
+++ b/include/bits/netbsd/sys.h
@@ -6,6 +6,7 @@
#define O_APPEND 0x00000008
#define O_CREAT 0x00000200
+#define AT_FDCWD -100
#define CLOCKS_PER_SEC ((clock_t) 100)
#define RUSAGE_SELF 0
--- a/include/bits/openbsd/sys.h
+++ b/include/bits/openbsd/sys.h
@@ -6,6 +6,7 @@
#define O_APPEND 0x00000008
#define O_CREAT 0x00000200
+#define AT_FDCWD -100
#define CLOCKS_PER_SEC ((clock_t) 100)
#define RUSAGE_SELF 0
--- /dev/null
+++ b/src/libc/arch/posix/Makefile
@@ -1,0 +1,20 @@
+.POSIX:
+PROJECTDIR =../../../..
+RULES = user
+include $(PROJECTDIR)/scripts/rules.mk
+include $(SRCDIR)/libc/rules.mk
+
+OBJS=\
+ _getheap.$O\
+ _open.$O\
+ _systime.$O\
+ _tzone.$O\
+ clock.$O\
+ getenv.$O\
+ raise.$O\
+ signal.$O\
+ time.$O\
+
+all: $(OBJS)
+
+include deps.mk
--- a/src/libc/arch/posix/_open.c
+++ b/src/libc/arch/posix/_open.c
@@ -1,10 +1,10 @@
#include <stddef.h>
-#include "../../../syscall.h"
+#include <sys.h>
-#define AT_FDCWD -100
+#include "../../syscall.h"
-extern int _openat(int fd, const char *fname, int flags, int mode);
+extern int _openat(int, const char *, int, int);
int
_open(const char *fname, int flags, int mode)
--- /dev/null
+++ b/src/libc/arch/posix/_systime.c
@@ -1,0 +1,21 @@
+#include <time.h>
+
+#include "../../libc.h"
+
+time_t
+_systime(struct tm *tm)
+{
+ time_t t = 0;
+ int year = tm->tm_year + MINYEAR;
+
+ for (int i = EPOCH; i < year; ++i)
+ t += _daysyear(i) * SECDAY;
+ for (int i = 0; i < tm->tm_mon; ++i)
+ t += _daysmon[i] * SECDAY;
+
+ t += tm->tm_sec;
+ t += tm->tm_min * SECMIN;
+ t += tm->tm_hour * SECHOUR;
+ t += (tm->tm_mday-1) * SECDAY;
+ return t;
+}
--- a/src/libc/arch/posix/clock.c
+++ b/src/libc/arch/posix/clock.c
@@ -36,5 +36,5 @@
if (_getrusage(RUSAGE_SELF, &ru))
return -1;
- return TOCLOCK(ru.ru_utime) + TOCLOCK(ru_ru_stime);
+ return TOCLOCK(ru.ru_utime) + TOCLOCK(ru.ru_stime);
}
--- /dev/null
+++ b/src/libc/arch/posix/deps.mk
@@ -1,0 +1,7 @@
+#deps
+./_getheap.o: ./../../libc.h
+./_open.o: ./../../syscall.h
+./_systime.o: ./../../libc.h
+./_tzone.o: ./../../libc.h
+./clock.o: ./time.h
+./time.o: ./time.h
--- a/src/libc/arch/posix/getenv.c
+++ b/src/libc/arch/posix/getenv.c
@@ -1,5 +1,6 @@
#include <stdlib.h>
#include <string.h>
+
#undef getenv
extern char **_environ;
--- a/src/libc/arch/posix/raise.c
+++ b/src/libc/arch/posix/raise.c
@@ -1,5 +1,5 @@
-#include <stddef.h>
#include <signal.h>
+
#include <sys.h>
#undef raise
--- a/src/libc/arch/posix/signal.c
+++ b/src/libc/arch/posix/signal.c
@@ -1,17 +1,18 @@
-#include <stddef.h>
#include <signal.h>
+
#include <sys.h>
+
#undef signal
void
(*signal(int signum, void (*func)(int)))(int)
{
- struct sigaction sa = {
+ struct sigaction osa, sa = {
.sa_handler = func,
};
- if (_sigaction(signum, &sa, &sa) < 0)
+ if (_sigaction(signum, &sa, &osa) < 0)
return SIG_ERR;
- return sa.sa_handler;
+ return osa.sa_handler;
}
--- a/src/libc/arch/posix/time.c
+++ b/src/libc/arch/posix/time.c
@@ -1,7 +1,8 @@
#include <time.h>
-int
-_gettimeofday(struct timeval *restrict, void *tzp);
+#include "time.h"
+
+extern int _gettimeofday(struct timeval *restrict, void *);
time_t
time(time_t *t)
--- /dev/null
+++ b/src/libc/arch/posix/time.h
@@ -1,0 +1,4 @@
+struct timeval {
+ time_t tv_sec;
+ __suseconds_t tv_usec;
+};