#include <luna/Ignore.h>
#include <stdio.h>
#include <unistd.h>

extern char** environ;

extern "C" FILE* _fdopen_impl(int, const char*, int);
extern "C" void _init_stdio();

typedef void initfunc_t(void);
extern initfunc_t *__init_array_start[], *__init_array_end[];

static void handle_init_array(void)
{
    for (initfunc_t** p = __init_array_start; p != __init_array_end; p++) (*p)();
}

extern "C"
{
    void libc_init(int argc, char** argv, int envc, char** envp)
    {
        ignore(argc, argv, envc);
        environ = envp;

        _init_stdio();

        stdin = _fdopen_impl(STDIN_FILENO, "r", _IOLBF);
        stdout = _fdopen_impl(STDOUT_FILENO, "w", _IOLBF);
        stderr = _fdopen_impl(STDERR_FILENO, "w", _IONBF);

        handle_init_array();
    }
}