/** * @file crt0.c * Userland executable startup code * * Copyright (C) 2018 Clyne Sullivan * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include extern int main(int, char **); static void stdio_init(void); /** * Entry point for userland programs. * Sets up stdio, then enters the program's main() before exiting with main()'s * return code. */ void _start(void) { stdio_init(); exit(main(0, 0)); } /** * Initializes file handles for stdout, stdin, and stderr. */ void stdio_init(void) { stderr = calloc(1, sizeof(FILE)); stderr->handle = 2; stderr->buffer = malloc(BUFSIZ); stderr->bufsize = BUFSIZ; stderr->ungetbuf = malloc(_PDCLIB_UNGETCBUFSIZE); stderr->status = _IOLBF | _PDCLIB_FWRITE | _PDCLIB_STATIC; stderr->next = NULL; stdout = calloc(1, sizeof(FILE)); stdout->handle = 1; stdout->buffer = malloc(BUFSIZ); stdout->bufsize = BUFSIZ; stdout->ungetbuf = malloc(_PDCLIB_UNGETCBUFSIZE); stdout->status = _IOLBF | _PDCLIB_FWRITE | _PDCLIB_STATIC; stdout->next = stderr; stdin = calloc(1, sizeof(FILE)); stdin->handle = 0; stdin->buffer = malloc(BUFSIZ); stdin->bufsize = BUFSIZ; stdin->ungetbuf = malloc(_PDCLIB_UNGETCBUFSIZE); stdin->status = _IOLBF | _PDCLIB_FREAD | _PDCLIB_STATIC; stdin->next = stdout; }