summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/__readonly.c19
-rw-r--r--src/__undefined.c5
-rw-r--r--src/_forced/_Exit.h4
-rw-r--r--src/_forced/close.h6
-rw-r--r--src/_forced/getpid.h3
-rw-r--r--src/_forced/isatty.h3
-rw-r--r--src/_forced/kill.h2
-rw-r--r--src/_forced/mmap.h11
-rw-r--r--src/_forced/mprotect.h9
-rw-r--r--src/_forced/munmap.h4
-rw-r--r--src/_forced/open.h12
-rw-r--r--src/_forced/rmdir.h2
-rw-r--r--src/_forced/sigaction.h18
-rw-r--r--src/_forced/stat.h7
-rw-r--r--src/_forced/strtoumax.h10
-rw-r--r--src/_forced/unlink.h2
-rw-r--r--src/_forced/vfwscanf.h4
-rw-r--r--src/_forced/vswscanf.h6
-rw-r--r--src/_forced/wcslen.h8
-rw-r--r--src/_forced/write.h6
-rw-r--r--src/signal/raise.c12
-rw-r--r--src/signal/signal.c5
-rw-r--r--src/stdio/__printf.c11
-rw-r--r--src/stdio/fclose.c15
-rw-r--r--src/stdio/fflush.c11
-rw-r--r--src/stdio/freopen.c20
-rw-r--r--src/stdio/remove.c28
-rw-r--r--src/stdlib/__jkmalloc.c49
-rw-r--r--src/stdlib/_jkmalloc.h4
-rw-r--r--src/stdlib/aligned_alloc.c2
-rw-r--r--src/stdlib/calloc.c2
-rw-r--r--src/stdlib/exit.c4
-rw-r--r--src/stdlib/free.c2
-rw-r--r--src/stdlib/getenv.c10
-rw-r--r--src/stdlib/malloc.c2
-rw-r--r--src/stdlib/realloc.c2
-rw-r--r--src/stdlib/wcstombs.c7
-rw-r--r--src/wchar/fwscanf.c5
-rw-r--r--src/wchar/swscanf.c5
39 files changed, 174 insertions, 163 deletions
diff --git a/src/__readonly.c b/src/__readonly.c
index 74837a91..f2d33c38 100644
--- a/src/__readonly.c
+++ b/src/__readonly.c
@@ -1,24 +1,19 @@
+#include <limits.h>
#include <stdlib.h>
#include "_readonly.h"
+#include "stdlib/_jkmalloc.h"
+#include "_forced/mprotect.h"
-#ifdef _POSIX_C_SOURCE
-#include <sys/mman.h>
-#include <limits.h>
-#else
-#include "_syscall.h"
-#define mprotect(__ptr, __len, __prot) __syscall(__sys_mprotect, __ptr, __len, __prot)
-#define PROT_READ 1
-#define PROT_WRITE 2
-#define PAGESIZE 4096
+#ifndef PAGESIZE
+#define PAGESIZE 4096
#endif
void* __readonly(ro_action_t action, void *ptr)
{
switch (action) {
case RO_ALLOC:
- /* set magic to JK_READONLY */
- /* set label to ptr */
- return malloc(PAGESIZE);
+ return __jkmalloc(NULL, NULL, 0, NULL, 1, PAGESIZE, 0, ptr);
+
case RO_FREE:
free(ptr);
diff --git a/src/__undefined.c b/src/__undefined.c
index 40026dac..6f619393 100644
--- a/src/__undefined.c
+++ b/src/__undefined.c
@@ -3,10 +3,7 @@
#include <stdarg.h>
#include "_safety.h"
-#if __STDC_VERSION__ < 199901L
-static _Noreturn void _Exit(int);
-#include "stdlib/_Exit.c"
-#endif
+#include "_forced/_Exit.h"
_Noreturn void __undefined(const char *fmt, ...)
{
diff --git a/src/_forced/_Exit.h b/src/_forced/_Exit.h
new file mode 100644
index 00000000..0ffc1ba3
--- /dev/null
+++ b/src/_forced/_Exit.h
@@ -0,0 +1,4 @@
+#if __STDC_VERSION__ < 199901L
+static _Noreturn void _Exit(int);
+#include "stdlib/_Exit.c"
+#endif
diff --git a/src/_forced/close.h b/src/_forced/close.h
new file mode 100644
index 00000000..512a66bc
--- /dev/null
+++ b/src/_forced/close.h
@@ -0,0 +1,6 @@
+#ifdef _POSIX_SOURCE
+#include <unistd.h>
+#else
+#include "_syscall.h"
+#define close(_fd) __scall1(close, _fd)
+#endif
diff --git a/src/_forced/getpid.h b/src/_forced/getpid.h
new file mode 100644
index 00000000..4ad048df
--- /dev/null
+++ b/src/_forced/getpid.h
@@ -0,0 +1,3 @@
+#include "_syscall.h"
+#define getpid() __scall0(getpid)
+
diff --git a/src/_forced/isatty.h b/src/_forced/isatty.h
new file mode 100644
index 00000000..0d0a073e
--- /dev/null
+++ b/src/_forced/isatty.h
@@ -0,0 +1,3 @@
+#include "_syscall.h"
+#define isatty(_fd) (-1) /*ioctl(_fd, TCFLSH, 0) */
+#define TCFLSH 0x540B
diff --git a/src/_forced/kill.h b/src/_forced/kill.h
new file mode 100644
index 00000000..a4fd9c32
--- /dev/null
+++ b/src/_forced/kill.h
@@ -0,0 +1,2 @@
+#include "_syscall.h"
+#define kill(pid, sig) __scall2(kill, pid, sig)
diff --git a/src/_forced/mmap.h b/src/_forced/mmap.h
new file mode 100644
index 00000000..65c1ef01
--- /dev/null
+++ b/src/_forced/mmap.h
@@ -0,0 +1,11 @@
+#include "_syscall.h"
+
+#define mmap(_a, _l, _p, _fl, _fd, _o) (void*)__syscall(__sys_mmap, _a, _l, _p, _fl, _fd, _o)
+
+#define PROT_NONE 0x0
+#define PROT_READ 0x1
+#define PROT_WRITE 0x2
+#define MAP_PRIVATE 0x02
+#define MAP_FAILED (void*)(-1)
+#define MAP_ANONYMOUS (0x20)
+
diff --git a/src/_forced/mprotect.h b/src/_forced/mprotect.h
new file mode 100644
index 00000000..5abbe5ed
--- /dev/null
+++ b/src/_forced/mprotect.h
@@ -0,0 +1,9 @@
+#ifdef _POSIX_C_SOURCE
+#include <sys/mman.h>
+#else
+#include "_syscall.h"
+#define mprotect(__ptr, __len, __prot) __syscall(__sys_mprotect, __ptr, __len, __prot)
+#define PROT_NONE 0x0
+#define PROT_READ 0x1
+#define PROT_WRITE 0x2
+#endif
diff --git a/src/_forced/munmap.h b/src/_forced/munmap.h
new file mode 100644
index 00000000..9580100d
--- /dev/null
+++ b/src/_forced/munmap.h
@@ -0,0 +1,4 @@
+#include "_syscall.h"
+
+#define munmap(_a, _l) __syscall(__sys_munmap, _a, _l)
+
diff --git a/src/_forced/open.h b/src/_forced/open.h
new file mode 100644
index 00000000..1764d52e
--- /dev/null
+++ b/src/_forced/open.h
@@ -0,0 +1,12 @@
+#ifdef _POSIX_SOURCE
+#include <fcntl.h>
+#else
+#include "_syscall.h"
+#define open(_p, _f, _m) __scall3(open, _p, _f, _m)
+#define O_RDONLY 00
+#define O_WRONLY 01
+#define O_CREAT 0100
+#define O_TRUNC 01000
+#define O_APPEND 02000
+#define O_RDWR 02
+#endif
diff --git a/src/_forced/rmdir.h b/src/_forced/rmdir.h
new file mode 100644
index 00000000..28ced29f
--- /dev/null
+++ b/src/_forced/rmdir.h
@@ -0,0 +1,2 @@
+#include "_syscall.h"
+#define rmdir(_f) __scall1(rmdir, _f)
diff --git a/src/_forced/sigaction.h b/src/_forced/sigaction.h
new file mode 100644
index 00000000..33398c49
--- /dev/null
+++ b/src/_forced/sigaction.h
@@ -0,0 +1,18 @@
+/* TODO: appropriate #ifdefs */
+
+#define SA_RESTART 0x10000000
+#define SA_RESTORER 0x04000000
+
+typedef unsigned long pid_t;
+typedef unsigned long uid_t;
+typedef unsigned long clock_t;
+#include "signal/sigset_t.h"
+#include "signal/union_sigval.h"
+#include "signal/siginfo_t.h"
+
+#define _POSIX_C_SOURCE 199506L
+#include "signal/struct_sigaction.h"
+
+static int sigaction(int, const struct sigaction * restrict, struct sigaction * restrict);
+
+#include "signal/sigaction.c"
diff --git a/src/_forced/stat.h b/src/_forced/stat.h
new file mode 100644
index 00000000..e0a75dcc
--- /dev/null
+++ b/src/_forced/stat.h
@@ -0,0 +1,7 @@
+#include "_syscall.h"
+struct stat {
+ int st_mode;
+ char padding[1024];
+};
+#define stat(_f, _b) __scall2(stat, _f, _b)
+#define S_ISDIR(_m) ((_m) & 0x00)
diff --git a/src/_forced/strtoumax.h b/src/_forced/strtoumax.h
new file mode 100644
index 00000000..d6f9883e
--- /dev/null
+++ b/src/_forced/strtoumax.h
@@ -0,0 +1,10 @@
+#if __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+#else
+#include "stdint/intmax_t.h"
+#include "stdint/uintmax_t.h"
+#include "stdint/intptr_t.h"
+#include "stdint/UINTMAX_MAX.h"
+#define strtoumax __strtoumax
+#include "inttypes/strtoumax.c"
+#endif
diff --git a/src/_forced/unlink.h b/src/_forced/unlink.h
new file mode 100644
index 00000000..240c6dd6
--- /dev/null
+++ b/src/_forced/unlink.h
@@ -0,0 +1,2 @@
+#include "_syscall.h"
+#define unlink(_f) __scall1(unlink, _f)
diff --git a/src/_forced/vfwscanf.h b/src/_forced/vfwscanf.h
new file mode 100644
index 00000000..305c06d2
--- /dev/null
+++ b/src/_forced/vfwscanf.h
@@ -0,0 +1,4 @@
+#if __STDC_VERSION__ < 199901L
+#define vfwscanf __vfwscanf
+#include "vfwscanf.c"
+#endif
diff --git a/src/_forced/vswscanf.h b/src/_forced/vswscanf.h
new file mode 100644
index 00000000..1915bc22
--- /dev/null
+++ b/src/_forced/vswscanf.h
@@ -0,0 +1,6 @@
+
+#if __STDC_VERSION__ < 199901L
+#define vswscanf __vswscanf
+#include "vswscanf.c"
+#endif
+
diff --git a/src/_forced/wcslen.h b/src/_forced/wcslen.h
new file mode 100644
index 00000000..665f6afa
--- /dev/null
+++ b/src/_forced/wcslen.h
@@ -0,0 +1,8 @@
+
+#ifdef __STDC_VERSION__
+#include <wchar.h>
+#else
+static size_t wcslen(const wchar_t *);
+#include "wchar/wcslen.c"
+#endif
+
diff --git a/src/_forced/write.h b/src/_forced/write.h
new file mode 100644
index 00000000..dced4529
--- /dev/null
+++ b/src/_forced/write.h
@@ -0,0 +1,6 @@
+#ifdef _POSIX_SOURCE
+#include <unistd.h>
+#else
+#include "_syscall.h"
+#define write(_fd, _buf, _size) __scall3(write, _fd, _buf, _size)
+#endif
diff --git a/src/signal/raise.c b/src/signal/raise.c
index 7d40b9c8..0547e4a1 100644
--- a/src/signal/raise.c
+++ b/src/signal/raise.c
@@ -1,16 +1,8 @@
-#ifndef _POSIX_SOURCE
-#define _POSIX_SOURCE
-#define POSIX_FORCED
-#endif
-
#include <signal.h>
#include "stdlib/_stdlib.h"
-#ifdef POSIX_FORCED
-#include "_syscall.h"
-#define kill(pid, sig) __scall2(kill, pid, sig)
-#define getpid() __scall0(getpid)
-#endif
+#include "_forced/kill.h"
+#include "_forced/getpid.h"
#include "_safety.h"
diff --git a/src/signal/signal.c b/src/signal/signal.c
index 4bd74744..f55e2e57 100644
--- a/src/signal/signal.c
+++ b/src/signal/signal.c
@@ -5,6 +5,10 @@
/** set a signal handler **/
+#if 0
+#include "_forced/sigaction.h"
+
+#else
/* TODO: remove this very Linux-specific crap */
typedef struct __siginfo siginfo_t;
struct linux_sigaction {
@@ -16,6 +20,7 @@
#define sigaction(_sig, _act, _oact, _size) __scall4(sigaction, _sig, _act, _oact, _size)
#define SA_RESTART 0x10000000
#define SA_RESTORER 0x04000000
+#endif
__attribute__((noinline, target("no-sse")))
void (*signal(int sig, void (*func)(int)))(int)
diff --git a/src/stdio/__printf.c b/src/stdio/__printf.c
index 7fa7a46b..1ee488d7 100644
--- a/src/stdio/__printf.c
+++ b/src/stdio/__printf.c
@@ -10,16 +10,7 @@
#include <unistd.h>
#endif
-#if __STDC_VERSION__ >= 199901L
-#include <inttypes.h>
-#else
-#include "stdint/intmax_t.h"
-#include "stdint/uintmax_t.h"
-#include "stdint/intptr_t.h"
-#include "stdint/UINTMAX_MAX.h"
-#define strtoumax __strtoumax
-#include "inttypes/strtoumax.c"
-#endif
+#include "_forced/strtoumax.h"
#include "_stdio.h"
diff --git a/src/stdio/fclose.c b/src/stdio/fclose.c
index 37198fcb..cb4499ac 100644
--- a/src/stdio/fclose.c
+++ b/src/stdio/fclose.c
@@ -1,23 +1,10 @@
-#ifndef _POSIX_SOURCE
-#define _POSIX_SOURCE
-#define POSIX_FORCED
-#endif
-
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#if 0
-#include <sys/types.h>
-#include <unistd.h>
-#endif
#include "_stdio.h"
-#ifdef POSIX_FORCED
-#include "_syscall.h"
-#define close(_fd) __scall1(close, _fd)
-#endif
+#include "_forced/close.h"
/** close a file stream **/
diff --git a/src/stdio/fflush.c b/src/stdio/fflush.c
index 6c1e78f5..2250aaaf 100644
--- a/src/stdio/fflush.c
+++ b/src/stdio/fflush.c
@@ -1,15 +1,6 @@
-#ifndef _POSIX_SOURCE
-#define _POSIX_SOURCE
-#define POSIX_FORCED
-#endif
-
#include <stdio.h>
#include "_stdio.h"
-
-#ifdef POSIX_FORCED
-#include "_syscall.h"
-#define write(_fd, _buf, _size) __scall3(write, _fd, _buf, _size)
-#endif
+#include "_forced/write.h"
/** flush buffered writes **/
diff --git a/src/stdio/freopen.c b/src/stdio/freopen.c
index f23d53af..60394ca6 100644
--- a/src/stdio/freopen.c
+++ b/src/stdio/freopen.c
@@ -1,25 +1,9 @@
-#ifndef _POSIX_SOURCE
-#define _POSIX_SOURCE
-#define POSIX_FORCED
-#endif
-
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include "_stdio.h"
-
-#ifdef POSIX_FORCED
-#include "_syscall.h"
-#define open(_p, _f, _m) __scall3(open, _p, _f, _m)
-#define isatty(_fd) (-1) /*ioctl(_fd, TCFLSH, 0) */
-#define TCFLSH 0x540B
-#define O_RDONLY 00
-#define O_WRONLY 01
-#define O_CREAT 0100
-#define O_TRUNC 01000
-#define O_APPEND 02000
-#define O_RDWR 02
-#endif
+#include "_forced/open.h"
+#include "_forced/isatty.h"
/** reopen a file stream with a new file **/
diff --git a/src/stdio/remove.c b/src/stdio/remove.c
index 8b6c5925..e52132de 100644
--- a/src/stdio/remove.c
+++ b/src/stdio/remove.c
@@ -1,42 +1,22 @@
-#ifndef _POSIX_SOURCE
-#define _POSIX_SOURCE
-#define POSIX_FORCED
-#endif
-
#include <stdio.h>
#include "_stdio.h"
-
-#if 0
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#endif
-
-#ifdef POSIX_FORCED
-#include "_syscall.h"
-#define stat(_f, _b) __scall2(stat, _f, _b)
-#define rmdir(_f) __scall1(rmdir, _f)
-#define unlink(_f) __scall1(unlink, _f)
-#endif
+#include "_forced/stat.h"
+#include "_forced/rmdir.h"
+#include "_forced/unlink.h"
/** delete a file **/
int remove(const char *filename)
{
- /* struct stat st; */
+ struct stat st;
SIGNAL_SAFE(0);
- /*
stat(filename, &st);
if (S_ISDIR(st.st_mode)) {
return rmdir(filename);
}
return unlink(filename);
- */
-
- (void)filename;
- return -1;
}
/***
diff --git a/src/stdlib/__jkmalloc.c b/src/stdlib/__jkmalloc.c
index b97fa10c..c55842ea 100644
--- a/src/stdlib/__jkmalloc.c
+++ b/src/stdlib/__jkmalloc.c
@@ -11,43 +11,14 @@
#include <sys/mman.h>
#include <unistd.h>
#else
-#include "_syscall.h"
+#include "_forced/sigaction.h"
+#include "_forced/mmap.h"
+#include "_forced/munmap.h"
+#include "_forced/mprotect.h"
#define sysconf(__n) 4096
-
-#define mprotect(__ptr, __len, __prot) __syscall(__sys_mprotect, __ptr, __len, __prot)
-#define mmap(_a, _l, _p, _fl, _fd, _o) (void*)__syscall(__sys_mmap, _a, _l, _p, _fl, _fd, _o)
-#define munmap(_a, _l) __syscall(__sys_munmap, _a, _l)
-#define open(_p, _a, _m) __syscall(__sys_open, _p, _a, _m)
-
-typedef unsigned long pid_t;
-typedef unsigned long uid_t;
-typedef unsigned long clock_t;
-#include "signal/sigset_t.h"
-#include "signal/union_sigval.h"
-#include "signal/siginfo_t.h"
-
-#define _POSIX_C_SOURCE 199506L
-#include "signal/struct_sigaction.h"
-
-static int sigaction(int, const struct sigaction * restrict, struct sigaction * restrict);
-
-#include "signal/sigaction.c"
-
-#define SA_RESTART 0x10000000
-#define SA_RESTORER 0x04000000
-
-#define O_RDWR 02
-#define PROT_NONE 0x0
-#define PROT_READ 0x1
-#define PROT_WRITE 0x2
-#define MAP_PRIVATE 0x02
-#define MAP_FAILED (void*)(-1)
-#define MAP_ANONYMOUS (0x20)
#define psiginfo(x, y) fprintf(stderr, "%s (%p)\n", (char*)(y), (void*)(x))
-
#define sigemptyset(x) memset(x, 0, sizeof(*x))
-
#endif
#include "_jkmalloc.h"
@@ -195,7 +166,7 @@ static void jk_sigsegv(int sig)
}
*/
-void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr, size_t alignment, size_t size1, size_t size2)
+void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr, size_t alignment, size_t size1, size_t size2, const char *user)
{
static int sa_set = 0;
if (!sa_set) {
@@ -296,7 +267,7 @@ void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr,
__jk_error("Attempt to reallocate() incorrect address", ptr, &src);
}
- void *newptr = __jkmalloc(NULL, NULL, 0, NULL, alignment, size1, size2);
+ void *newptr = __jkmalloc(NULL, NULL, 0, NULL, alignment, size1, size2, user);
if (newptr != NULL) {
memmove(newptr, ptr, b->size);
free(ptr);
@@ -345,7 +316,11 @@ void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr,
if (file) {
under->tlen = snprintf(under->trace, __jk_pagesize - sizeof(*under), "+++ %s() (%s:%ju)", func, file, line);
- memmove(over->trace, under->trace, under->tlen + 1);
+ memcpy(over->trace, under->trace, under->tlen + 1);
+ over->tlen = under->tlen;
+ } else if (user) {
+ under->tlen = snprintf(under->trace, __jk_pagesize - sizeof(*under), "Read-only memory for %s", user);
+ memcpy(over->trace, under->trace, under->tlen + 1);
over->tlen = under->tlen;
} else {
under->trace[0] = '\0';
@@ -372,7 +347,7 @@ int (jk_memalign)(void **ptr, size_t a, size_t n)
return EINVAL;
}
- if (((*ptr) = __jkmalloc(NULL, NULL, 0, NULL, a, n, 0)) == NULL) {
+ if (((*ptr) = __jkmalloc(NULL, NULL, 0, NULL, a, n, 0, NULL)) == NULL) {
return errno;
}
diff --git a/src/stdlib/_jkmalloc.h b/src/stdlib/_jkmalloc.h
index 8786acea..c6088024 100644
--- a/src/stdlib/_jkmalloc.h
+++ b/src/stdlib/_jkmalloc.h
@@ -1,6 +1,8 @@
#ifndef ___JKMALLOC_H__
#define ___JKMALLOC_H__
-void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr, size_t alignment, size_t size1 , size_t size2);
+#include <inttypes.h>
+
+void* __jkmalloc(const char *file, const char *func, uintmax_t line, void *ptr, size_t alignment, size_t size1 , size_t size2, const char *user);
#endif
diff --git a/src/stdlib/aligned_alloc.c b/src/stdlib/aligned_alloc.c
index f699014b..6fa28e9f 100644
--- a/src/stdlib/aligned_alloc.c
+++ b/src/stdlib/aligned_alloc.c
@@ -5,7 +5,7 @@
void *aligned_alloc(size_t alignment, size_t size)
{
SIGNAL_SAFE(0);
- return __jkmalloc(NULL, NULL, 0, NULL, alignment, size, 0);
+ return __jkmalloc(NULL, NULL, 0, NULL, alignment, size, 0, NULL);
}
/*
diff --git a/src/stdlib/calloc.c b/src/stdlib/calloc.c
index b5203a57..f7d24dc0 100644
--- a/src/stdlib/calloc.c
+++ b/src/stdlib/calloc.c
@@ -9,7 +9,7 @@ void * calloc(size_t nmemb, size_t size)
{
SIGNAL_SAFE(0);
- return __jkmalloc(NULL, NULL, 0, NULL, 1, nmemb, size);
+ return __jkmalloc(NULL, NULL, 0, NULL, 1, nmemb, size, NULL);
}
/***
diff --git a/src/stdlib/exit.c b/src/stdlib/exit.c
index 42af83c7..e6423891 100644
--- a/src/stdlib/exit.c
+++ b/src/stdlib/exit.c
@@ -3,9 +3,7 @@
#include "_stdlib.h"
#include "_syscall.h"
-#if __STDC_VERSION__ < 199901L
-#include "_Exit.c"
-#endif
+#include "_forced/_Exit.h"
/** cause normal program termination **/
_Noreturn void exit(int status)
diff --git a/src/stdlib/free.c b/src/stdlib/free.c
index 47c04dd0..3662adb3 100644
--- a/src/stdlib/free.c
+++ b/src/stdlib/free.c
@@ -9,7 +9,7 @@ void free(void * ptr)
SIGNAL_SAFE(0);
if (ptr) {
- __jkmalloc(NULL, NULL, 0, ptr, 0, 0, 0);
+ __jkmalloc(NULL, NULL, 0, ptr, 0, 0, 0, NULL);
}
}
diff --git a/src/stdlib/getenv.c b/src/stdlib/getenv.c
index 989a5f84..c85c1922 100644
--- a/src/stdlib/getenv.c
+++ b/src/stdlib/getenv.c
@@ -1,6 +1,7 @@
#include <stdlib.h>
#include <string.h>
#include "_stdlib.h"
+#include "_readonly.h"
/** get an environment variable **/
@@ -8,13 +9,20 @@ char * getenv(const char * name)
{
size_t len = 0;
size_t i = 0;
+ static char *variable = NULL;
SIGNAL_SAFE(0);
+ if (variable == NULL) {
+ variable = __readonly(RO_ALLOC, "getenv");
+ }
len = strlen(name);
for (i = 0; environ[i] != NULL; i++) {
if (!strncmp(environ[i], name, len) && environ[i][len] == '=') {
- return environ[i] + len + 1;
+ __readonly(RO_UNLOCK, variable);
+ strcpy(variable, environ[i] + len + 1);
+ __readonly(RO_LOCK, variable);
+ return variable;
}
}
diff --git a/src/stdlib/malloc.c b/src/stdlib/malloc.c
index d372fd6b..ebac8d39 100644
--- a/src/stdlib/malloc.c
+++ b/src/stdlib/malloc.c
@@ -7,7 +7,7 @@ void * malloc(size_t size)
{
SIGNAL_SAFE(0);
- return __jkmalloc(NULL, NULL, 0, NULL, 1, size, 0);
+ return __jkmalloc(NULL, NULL, 0, NULL, 1, size, 0, NULL);
}
/***
diff --git a/src/stdlib/realloc.c b/src/stdlib/realloc.c
index 17696bbf..35e12d26 100644
--- a/src/stdlib/realloc.c
+++ b/src/stdlib/realloc.c
@@ -8,7 +8,7 @@ void * realloc(void * ptr, size_t size)
{
SIGNAL_SAFE(0);
- return __jkmalloc(NULL, NULL, 0, ptr, 1, size, 0);
+ return __jkmalloc(NULL, NULL, 0, ptr, 1, size, 0, NULL);
}
/***
diff --git a/src/stdlib/wcstombs.c b/src/stdlib/wcstombs.c
index 76958ae9..31946fca 100644
--- a/src/stdlib/wcstombs.c
+++ b/src/stdlib/wcstombs.c
@@ -1,12 +1,7 @@
#include <stdlib.h>
#include "_stdlib.h"
-#ifdef __STDC_VERSION__
-#include <wchar.h>
-#else
-static size_t wcslen(const wchar_t *);
-#include "wchar/wcslen.c"
-#endif
+#include "_forced/wcslen.h"
/** convert wide character string to multibyte string **/
diff --git a/src/wchar/fwscanf.c b/src/wchar/fwscanf.c
index b691ef53..3f160df6 100644
--- a/src/wchar/fwscanf.c
+++ b/src/wchar/fwscanf.c
@@ -4,10 +4,7 @@
#include <stdio.h>
#include <stdarg.h>
-#if __STDC_VERSION__ < 199901L
-#define vfwscanf __vfwscanf
-#include "vfwscanf.c"
-#endif
+#include "_forced/vfwscanf.h"
int fwscanf(FILE * restrict stream, const wchar_t * restrict format, ...)
{
diff --git a/src/wchar/swscanf.c b/src/wchar/swscanf.c
index 81726bff..d8988a33 100644
--- a/src/wchar/swscanf.c
+++ b/src/wchar/swscanf.c
@@ -3,10 +3,7 @@
#include <stdarg.h>
#include <wchar.h>
-#if __STDC_VERSION__ < 199901L
-#define vswscanf __vswscanf
-#include "vswscanf.c"
-#endif
+#include "_forced/vswscanf.h"
int swscanf(const wchar_t * restrict s, const wchar_t * restrict format, ...)
{