From bb2dd23f315bafa7b0b64845c2fe25d7a0893b10 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sat, 16 Jul 2016 18:07:24 +0200 Subject: Got Lua running \o/ --- gdb_cmd | 2 + src/bin/lua/lua.c | 63 +++++++++------- src/common/libc/printf.c | 56 ++++++++++---- src/lib/include/setjmp.h | 5 +- src/lib/include/stdio.h | 26 ++++--- src/lib/libc/malloc.c | 13 +++- src/lib/libc/readline.c | 1 + src/lib/libc/setjmp.s | 75 +++++++++---------- src/lib/libc/start.c | 3 +- src/lib/libc/stdio.c | 191 +++++++++++++++++++++++++++++++---------------- src/lib/libc/stdlib.c | 2 +- src/sysbin/login/main.c | 3 +- 12 files changed, 271 insertions(+), 169 deletions(-) diff --git a/gdb_cmd b/gdb_cmd index 994e6c0..1db6ff3 100644 --- a/gdb_cmd +++ b/gdb_cmd @@ -1,3 +1,5 @@ target remote localhost:1234 symbol-file build/kernel.bin break core/sys.c:panic_do +break user/process.c:764 +break user/process.c:773 diff --git a/src/bin/lua/lua.c b/src/bin/lua/lua.c index 545d23d..8f64451 100644 --- a/src/bin/lua/lua.c +++ b/src/bin/lua/lua.c @@ -4,6 +4,11 @@ ** See Copyright Notice in lua.h */ +// {{ Customization for Kogata +#define LUA_USE_READLINE 1 +// Other customization includes: removing static qualifiers +// }} + #define lua_c #include "lprefix.h" @@ -98,15 +103,15 @@ -static lua_State *globalL = NULL; +lua_State *globalL = NULL; -static const char *progname = LUA_PROGNAME; +const char *progname = LUA_PROGNAME; /* ** Hook set by signal function to stop the interpreter. */ -static void lstop (lua_State *L, lua_Debug *ar) { +void lstop (lua_State *L, lua_Debug *ar) { (void)ar; /* unused arg. */ lua_sethook(L, NULL, 0, 0); /* reset hook */ luaL_error(L, "interrupted!"); @@ -119,13 +124,13 @@ static void lstop (lua_State *L, lua_Debug *ar) { ** this function only sets a hook that, when called, will stop the ** interpreter. */ -static void laction (int i) { +void laction (int i) { signal(i, SIG_DFL); /* if another SIGINT happens, terminate process */ lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); } -static void print_usage (const char *badoption) { +void print_usage (const char *badoption) { lua_writestringerror("%s: ", progname); if (badoption[1] == 'e' || badoption[1] == 'l') lua_writestringerror("'%s' needs argument\n", badoption); @@ -150,7 +155,7 @@ static void print_usage (const char *badoption) { ** Prints an error message, adding the program name in front of it ** (if present) */ -static void l_message (const char *pname, const char *msg) { +void l_message (const char *pname, const char *msg) { if (pname) lua_writestringerror("%s: ", pname); lua_writestringerror("%s\n", msg); } @@ -161,7 +166,7 @@ static void l_message (const char *pname, const char *msg) { ** message on the top of the stack. It assumes that the error object ** is a string, as it was either generated by Lua or by 'msghandler'. */ -static int report (lua_State *L, int status) { +int report (lua_State *L, int status) { if (status != LUA_OK) { const char *msg = lua_tostring(L, -1); l_message(progname, msg); @@ -174,7 +179,7 @@ static int report (lua_State *L, int status) { /* ** Message handler used to run all chunks */ -static int msghandler (lua_State *L) { +int msghandler (lua_State *L) { const char *msg = lua_tostring(L, 1); if (msg == NULL) { /* is error object not a string? */ if (luaL_callmeta(L, 1, "__tostring") && /* does it have a metamethod */ @@ -193,7 +198,7 @@ static int msghandler (lua_State *L) { ** Interface to 'lua_pcall', which sets appropriate message function ** and C-signal handler. Used to run all chunks. */ -static int docall (lua_State *L, int narg, int nres) { +int docall (lua_State *L, int narg, int nres) { int status; int base = lua_gettop(L) - narg; /* function index */ lua_pushcfunction(L, msghandler); /* push message handler */ @@ -207,7 +212,7 @@ static int docall (lua_State *L, int narg, int nres) { } -static void print_version (void) { +void print_version (void) { lua_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT)); lua_writeline(); } @@ -221,7 +226,7 @@ static void print_version (void) { ** other arguments (before the script name) go to negative indices. ** If there is no script name, assume interpreter's name as base. */ -static void createargtable (lua_State *L, char **argv, int argc, int script) { +void createargtable (lua_State *L, char **argv, int argc, int script) { int i, narg; if (script == argc) script = 0; /* no script name? */ narg = argc - (script + 1); /* number of positive indices */ @@ -234,18 +239,18 @@ static void createargtable (lua_State *L, char **argv, int argc, int script) { } -static int dochunk (lua_State *L, int status) { +int dochunk (lua_State *L, int status) { if (status == LUA_OK) status = docall(L, 0, 0); return report(L, status); } -static int dofile (lua_State *L, const char *name) { +int dofile (lua_State *L, const char *name) { return dochunk(L, luaL_loadfile(L, name)); } -static int dostring (lua_State *L, const char *s, const char *name) { +int dostring (lua_State *L, const char *s, const char *name) { return dochunk(L, luaL_loadbuffer(L, s, strlen(s), name)); } @@ -254,7 +259,7 @@ static int dostring (lua_State *L, const char *s, const char *name) { ** Calls 'require(name)' and stores the result in a global variable ** with the given name. */ -static int dolibrary (lua_State *L, const char *name) { +int dolibrary (lua_State *L, const char *name) { int status; lua_getglobal(L, "require"); lua_pushstring(L, name); @@ -268,7 +273,7 @@ static int dolibrary (lua_State *L, const char *name) { /* ** Returns the string to be used as a prompt by the interpreter. */ -static const char *get_prompt (lua_State *L, int firstline) { +const char *get_prompt (lua_State *L, int firstline) { const char *p; lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2"); p = lua_tostring(L, -1); @@ -286,7 +291,7 @@ static const char *get_prompt (lua_State *L, int firstline) { ** message at the top of the stack ends with the above mark for ** incomplete statements. */ -static int incomplete (lua_State *L, int status) { +int incomplete (lua_State *L, int status) { if (status == LUA_ERRSYNTAX) { size_t lmsg; const char *msg = lua_tolstring(L, -1, &lmsg); @@ -302,7 +307,7 @@ static int incomplete (lua_State *L, int status) { /* ** Prompt the user, read a line, and push it into the Lua stack. */ -static int pushline (lua_State *L, int firstline) { +int pushline (lua_State *L, int firstline) { char buffer[LUA_MAXINPUT]; char *b = buffer; size_t l; @@ -327,7 +332,7 @@ static int pushline (lua_State *L, int firstline) { ** Try to compile line on the stack as 'return ;'; on return, stack ** has either compiled chunk or original line (if compilation failed). */ -static int addreturn (lua_State *L) { +int addreturn (lua_State *L) { const char *line = lua_tostring(L, -1); /* original line */ const char *retline = lua_pushfstring(L, "return %s;", line); int status = luaL_loadbuffer(L, retline, strlen(retline), "=stdin"); @@ -345,7 +350,7 @@ static int addreturn (lua_State *L) { /* ** Read multiple lines until a complete Lua statement */ -static int multiline (lua_State *L) { +int multiline (lua_State *L) { for (;;) { /* repeat until gets a complete statement */ size_t len; const char *line = lua_tolstring(L, 1, &len); /* get what it has */ @@ -367,7 +372,7 @@ static int multiline (lua_State *L) { ** the final status of load/call with the resulting function (if any) ** in the top of the stack. */ -static int loadline (lua_State *L) { +int loadline (lua_State *L) { int status; lua_settop(L, 0); if (!pushline(L, 1)) @@ -383,7 +388,7 @@ static int loadline (lua_State *L) { /* ** Prints (calling the Lua 'print' function) any values on the stack */ -static void l_print (lua_State *L) { +void l_print (lua_State *L) { int n = lua_gettop(L); if (n > 0) { /* any result to be printed? */ luaL_checkstack(L, LUA_MINSTACK, "too many results to print"); @@ -400,7 +405,7 @@ static void l_print (lua_State *L) { ** Do the REPL: repeatedly read (load) a line, evaluate (call) it, and ** print any results. */ -static void doREPL (lua_State *L) { +void doREPL (lua_State *L) { int status; const char *oldprogname = progname; progname = NULL; /* no 'progname' on errors in interactive mode */ @@ -419,7 +424,7 @@ static void doREPL (lua_State *L) { /* ** Push on the stack the contents of table 'arg' from 1 to #arg */ -static int pushargs (lua_State *L) { +int pushargs (lua_State *L) { int i, n; if (lua_getglobal(L, "arg") != LUA_TTABLE) luaL_error(L, "'arg' is not a table"); @@ -432,7 +437,7 @@ static int pushargs (lua_State *L) { } -static int handle_script (lua_State *L, char **argv) { +int handle_script (lua_State *L, char **argv) { int status; const char *fname = argv[0]; if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0) @@ -460,7 +465,7 @@ static int handle_script (lua_State *L, char **argv) { ** any invalid argument). 'first' returns the first not-handled argument ** (either the script name or a bad argument in case of error). */ -static int collectargs (char **argv, int *first) { +int collectargs (char **argv, int *first) { int args = 0; int i; for (i = 1; argv[i] != NULL; i++) { @@ -509,7 +514,7 @@ static int collectargs (char **argv, int *first) { ** Processes options 'e' and 'l', which involve running Lua code. ** Returns 0 if some code raises an error. */ -static int runargs (lua_State *L, char **argv, int n) { +int runargs (lua_State *L, char **argv, int n) { int i; for (i = 1; i < n; i++) { int option = argv[i][1]; @@ -529,7 +534,7 @@ static int runargs (lua_State *L, char **argv, int n) { } -static int handle_luainit (lua_State *L) { +int handle_luainit (lua_State *L) { const char *name = "=" LUA_INITVARVERSION; const char *init = getenv(name + 1); if (init == NULL) { @@ -548,7 +553,7 @@ static int handle_luainit (lua_State *L) { ** Main body of stand-alone interpreter (to be called in protected mode). ** Reads the options and handles them all. */ -static int pmain (lua_State *L) { +int pmain (lua_State *L) { int argc = (int)lua_tointeger(L, 1); char **argv = (char **)lua_touserdata(L, 2); int script; diff --git a/src/common/libc/printf.c b/src/common/libc/printf.c index d1671c3..0498b2d 100644 --- a/src/common/libc/printf.c +++ b/src/common/libc/printf.c @@ -1,4 +1,5 @@ #include +#include #include @@ -29,31 +30,56 @@ int vsnprintf(char *buff, size_t len, const char* format, va_list ap){ for(i = 0; format[i] != '\0' ; i++) { if (format[i] == '%') { i++; + int u = 0; + int l = 0; + bool spec = true; + while (spec) { + switch(format[i]) { + case 'l': { + l++; + i++; + break; + } + case 'u': { + u = 1; + i++; + break; + } + default: + spec = false; + } + } switch(format[i]) { case '%': PUTCHAR('%'); break; - case 'i':; case 'd': { - int integer = va_arg(ap,int); - int cpt2 = 0; - char buff_int[16]; + if (u) { + // TODO + } else { + long long int integer; + if (l == 0) integer = va_arg(ap, int); + if (l == 1) integer = va_arg(ap, long int); + if (l == 2) integer = va_arg(ap, long long int); - if (integer<0) - PUTCHAR('-'); + int cpt2 = 0; + char buff_int[32]; - do { - int m10 = integer%10; - m10 = (m10 < 0)? -m10:m10; - buff_int[cpt2++] = (char)('0'+ m10); - integer = integer/10; - } while(integer != 0); + if (integer<0) + PUTCHAR('-'); - for(cpt2 = cpt2 - 1; cpt2 >= 0; cpt2--) - PUTCHAR(buff_int[cpt2]); + do { + int m10 = integer%10; + m10 = (m10 < 0)? -m10:m10; + buff_int[cpt2++] = (char)('0'+ m10); + integer = integer/10; + } while(integer != 0); - break; + for(cpt2 = cpt2 - 1; cpt2 >= 0; cpt2--) + PUTCHAR(buff_int[cpt2]); + } + break; } case 'c': { int value = va_arg(ap,int); diff --git a/src/lib/include/setjmp.h b/src/lib/include/setjmp.h index 46c3b5d..904ae4a 100644 --- a/src/lib/include/setjmp.h +++ b/src/lib/include/setjmp.h @@ -2,10 +2,7 @@ #include -struct _jmp_buf { - uint32_t stuff[10]; // 40 bytes -}; -typedef struct _jmp_buf jmp_buf; +typedef uint32_t jmp_buf[10]; int setjmp(jmp_buf env); diff --git a/src/lib/include/stdio.h b/src/lib/include/stdio.h index c6b636d..a67553c 100644 --- a/src/lib/include/stdio.h +++ b/src/lib/include/stdio.h @@ -2,6 +2,8 @@ #include +#include + #include #include @@ -11,7 +13,10 @@ void setup_libc_stdio(); //TODO below struct file_t { - // TODO + fd_t fd; + stat_t st; + int mode; + int flags; }; typedef struct file_t FILE; @@ -47,15 +52,15 @@ int fclose(FILE* f); extern FILE *stdin, *stdout, *stderr; -#define BUFSIZ 0 +#define BUFSIZ 1024 void setbuf(FILE *stream, char *buf); void setbuffer(FILE *stream, char *buf, size_t size); void setlinebuf(FILE *stream); int setvbuf(FILE *stream, char *buf, int mode, size_t size); -#define _IOFBF 0 -#define _IOLBF 1 -#define _IONBF 2 +#define _IOFBF 1 +#define _IOLBF 2 +#define _IONBF 4 typedef size_t fpos_t; //TODO @@ -65,9 +70,9 @@ void rewind(FILE *stream); int fgetpos(FILE *stream, fpos_t *pos); int fsetpos(FILE *stream, const fpos_t *pos); -#define SEEK_SET 0 -#define SEEK_CUR 1 -#define SEEK_END 2 +#define SEEK_SET 1 +#define SEEK_CUR 2 +#define SEEK_END 4 #define L_tmpnam 128 FILE *tmpfile(void); @@ -76,11 +81,10 @@ char *tmpnam(char *s); int rename(const char *old, const char *new); int remove(const char *pathname); - int printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...); -int dprintf(int fd, const char *format, ...); -int sprintf(char *str, const char *format, ...); +int vfprintf(FILE *stream, const char *format, va_list ap); + /* vim: set ts=4 sw=4 tw=0 noet :*/ diff --git a/src/lib/libc/malloc.c b/src/lib/libc/malloc.c index 473404b..fd37f76 100644 --- a/src/lib/libc/malloc.c +++ b/src/lib/libc/malloc.c @@ -54,7 +54,10 @@ void malloc_setup() { void* malloc(size_t size) { if (size == 0) return 0; - return slab_alloc(mem_allocator, size); + //dbg_printf("malloc 0x%p -> ", size); + void* ret = slab_alloc(mem_allocator, size); + //dbg_printf("0x%p\n", ret); + return ret; } void* calloc(size_t nmemb, size_t sz) { @@ -64,10 +67,16 @@ void* calloc(size_t nmemb, size_t sz) { } void* realloc(void* ptr, size_t sz) { - return slab_realloc(mem_allocator, ptr, sz); + //dbg_printf("realloc 0x%p 0x%p -> ", ptr, sz); + void* ret = slab_realloc(mem_allocator, ptr, sz); + //dbg_printf("0x%p\n", ret); + return ret; } void free(void* ptr) { + if (ptr == 0) return; + + //dbg_printf("free 0x%p\n", ptr); slab_free(mem_allocator, ptr); } diff --git a/src/lib/libc/readline.c b/src/lib/libc/readline.c index 20c2007..c93bfe2 100644 --- a/src/lib/libc/readline.c +++ b/src/lib/libc/readline.c @@ -21,6 +21,7 @@ char *readline(const char* prompt) { // readline_history *h = &stdio_history; puts(prompt); + fflush(stdout); char* buf = malloc(READLINE_MAX_LEN); if (buf == NULL) return NULL; diff --git a/src/lib/libc/setjmp.s b/src/lib/libc/setjmp.s index 164cc5b..a9b5f48 100644 --- a/src/lib/libc/setjmp.s +++ b/src/lib/libc/setjmp.s @@ -1,24 +1,18 @@ [GLOBAL setjmp] setjmp: - ; Store general purpose registers - ; (in new stack frame) - mov [esp+4], eax - mov [esp+8], ebx - mov [esp+12], ecx - mov [esp+16], edx - mov [esp+20], edi - mov [esp+24], esi - mov [esp+28], ebp - mov [esp+32], esp - - ; Store flags - pushf - pop eax - mov [esp+36], eax + ; get return address + mov edx, [esp] + ; get address of jmpbuf structure + mov ecx, [esp+4] - ; Store return address - mov eax, [esp] - mov [esp+40], eax + ; Store general purpose registers + mov [ecx], ebx + mov [ecx+4], edx + mov [ecx+8], ebp + mov [ecx+12], esp + mov [ecx+16], esi + mov [ecx+20], edi + mov [ecx+24], eax ; return 0 xor eax, eax @@ -27,27 +21,26 @@ setjmp: [GLOBAL longjmp] longjmp: - ; on previous stack, resume return address - mov eax, [esp+32] - mov ebx, [esp+40] - mov [eax], ebx - - ; resume flags - mov eax, [esp+36] - push eax - popf - - ; load return value in eax - mov eax, [esp+44] - ; resume geneal purpose registers, except eax/esp - mov ebx, [esp+8] - mov ecx, [esp+12] - mov edx, [esp+16] - mov edi, [esp+20] - mov esi, [esp+24] - mov ebp, [esp+28] - - ; resume previous esp - mov esp, [esp+32] - ; return as if we were the setjmp call + ; get address of jmpbuf structure + mov ecx, [esp+4] + ; get retun value + mov eax, [esp+8] + + ; load general purpose registers + ; (edx contains the return address) + mov ebx, [ecx] + mov edx, [ecx+4] + mov ebp, [ecx+8] + mov esp, [ecx+12] + mov esi, [ecx+16] + mov edi, [ecx+20] + + ; make sure return value is nonzero + test eax, eax + jnz _doret + inc eax +_doret: + ; store back return address + mov [esp], edx ret + diff --git a/src/lib/libc/start.c b/src/lib/libc/start.c index 185d90f..49bf6a3 100644 --- a/src/lib/libc/start.c +++ b/src/lib/libc/start.c @@ -12,8 +12,9 @@ void __libc_start() { setup_libc_stdio(); // TODO : more setup ? yes, for args, for env... + char *argv[] = {"bin"}; - int ret = main(0, 0); + int ret = main(1, argv); sc_exit(ret); } diff --git a/src/lib/libc/stdio.c b/src/lib/libc/stdio.c index 8d4577e..c849683 100644 --- a/src/lib/libc/stdio.c +++ b/src/lib/libc/stdio.c @@ -10,15 +10,31 @@ FILE *stdin = 0; FILE *stdout = 0; FILE *stderr = 0; -void setup_libc_stdio() { - fd_t tty_io = STD_FD_TTY_STDIO; - // fd_t tty_in = STD_FD_STDIN; - // fd_t tty_out = STD_FD_STDOUT; - // fd_t tty_err = STD_FD_STDERR; +FILE libc_tty_stdio, libc_stdin, libc_stdout, libc_stderr; - // TODO - if (true) { - sc_fctl(tty_io, FC_SET_BLOCKING, 0); +void setup_libc_stdio() { + if (sc_stat_open(STD_FD_TTY_STDIO, &libc_tty_stdio.st)) { + libc_tty_stdio.fd = STD_FD_TTY_STDIO; + sc_fctl(libc_tty_stdio.fd, FC_SET_BLOCKING, 0); + // TODO: initialize libc_tty_stdio as a TTY + stdin = &libc_tty_stdio; + stdout = &libc_tty_stdio; + stderr = &libc_tty_stdio; + } + if (sc_stat_open(STD_FD_STDIN, &libc_stdin.st)) { + libc_stdin.fd = STD_FD_STDIN; + // TODO: initialize + stdin = &libc_stdin; + } + if (sc_stat_open(STD_FD_STDOUT, &libc_stdout.st)) { + libc_stdout.fd = STD_FD_STDOUT; + // TODO: initialize + stdout = &libc_stdout; + } + if (sc_stat_open(STD_FD_STDERR, &libc_stderr.st)) { + libc_stderr.fd = STD_FD_STDERR; + // TODO: initialize + stderr = &libc_stderr; } } @@ -37,13 +53,12 @@ int puts(const char* s) { int printf(const char* fmt, ...) { va_list ap; - char buffer[256]; va_start(ap, fmt); - vsnprintf(buffer, 256, fmt, ap); + int ret = vfprintf(stdout, fmt, ap); va_end(ap); - return puts(buffer); + return ret; } // ================== @@ -51,14 +66,59 @@ int printf(const char* fmt, ...) { // ================== -int fgetc(FILE *stream) { +FILE *fopen(const char *path, const char *mode) { // TODO return 0; } -char *fgets(char *s, int size, FILE *stream) { +FILE *freopen(const char *path, const char *mode, FILE *stream) { // TODO return 0; } +int fclose(FILE* f) { + // TODO + return 0; +} + + +// --------------- +// INPUT FUNCTIONS +// --------------- + +size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) { + if (stream == NULL || stream->fd == 0) return 0; + + // TODO buffering + // TODO position + return sc_read(stream->fd, 0, size * nmemb, ptr); +} + +int fgetc(FILE *stream) { + // TODO buffering && ungetc + char x; + if (fread(&x, 1, 1, stream)) { + return x; + } else { + return EOF; + } +} +char *fgets(char *s, int size, FILE *stream) { + int l = 0; + while (l < size - 1) { + int c = fgetc(stream); + if (c == EOF) { + break; + } else if (c == '\b') { + if (l > 0) l--; + // TODO if terminal write back space or something + } else { + s[l] = c; + l++; + if (c == '\n') break; + } + } + s[l] = 0; + return s; +} int getc(FILE *stream) { // TODO return 0; @@ -68,77 +128,90 @@ int ungetc(int c, FILE *stream) { return 0; } +// ---------------- +// OUTPUT FUNCTIONS +// ---------------- + +size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) { + if (stream == NULL || stream->fd == 0) return 0; + + // TODO buffering + // TODO position + return sc_write(stream->fd, 0, size * nmemb, ptr); +} + int fputc(int c, FILE *stream) { - // TODO - return 0; + unsigned char x = c; + return fwrite(&x, 1, 1, stream); } int fputs(const char *s, FILE *stream) { - // TODO - return 0; + return fwrite(s, strlen(s), 1, stream); } int putc(int c, FILE *stream) { - // TODO - return 0; + return fputc(c, stream); } -FILE *fopen(const char *path, const char *mode) { - // TODO - return 0; +int fprintf(FILE *stream, const char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + int ret = vfprintf(stream, fmt, ap); + va_end(ap); + + return ret; } -FILE *freopen(const char *path, const char *mode, FILE *stream) { - // TODO - return 0; +int vfprintf(FILE *stream, const char *format, va_list ap) { + char buf[1024]; + vsnprintf(buf, 1024, format, ap); + + return fputs(buf, stream); } -void clearerr(FILE *stream) { - // TODO +// buffering + +void setbuf(FILE *stream, char *buf) { + setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ); } -int feof(FILE *stream) { +void setbuffer(FILE *stream, char *buf, size_t size) { // TODO - return 0; } -int ferror(FILE *stream) { +void setlinebuf(FILE *stream) { + setvbuf(stream, NULL, _IOLBF, 0); +} +int setvbuf(FILE *stream, char *buf, int mode, size_t size) { // TODO return 0; } -int fileno(FILE *stream) { + +int fflush(FILE* f) { // TODO return 0; } +// --------------------- +// COMPLICATED FUNCTIONS +// --------------------- -size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) { +void clearerr(FILE *stream) { // TODO - return 0; } -size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) { +int feof(FILE *stream) { // TODO return 0; } - -int fflush(FILE* f) { +int ferror(FILE *stream) { // TODO return 0; } -int fclose(FILE* f) { +int fileno(FILE *stream) { // TODO return 0; } -void setbuf(FILE *stream, char *buf) { - // TODO -} -void setbuffer(FILE *stream, char *buf, size_t size) { - // TODO -} -void setlinebuf(FILE *stream) { - // TODO -} -int setvbuf(FILE *stream, char *buf, int mode, size_t size) { - // TODO - return 0; -} +// ------------------ +// POSITION FUNCTIONS +// ------------------ int fseek(FILE *stream, long offset, int whence) { @@ -161,6 +234,10 @@ int fsetpos(FILE *stream, const fpos_t *pos) { return 0; } +// --------------------- +// PATH & FILE FUNCTIONS +// --------------------- + FILE *tmpfile(void) { // TODO return 0; @@ -181,18 +258,4 @@ int remove(const char *pathname) { -int fprintf(FILE *stream, const char *format, ...) { - // TODO - return 0; -} -int dprintf(int fd, const char *format, ...) { - // TODO - return 0; -} -int sprintf(char *str, const char *format, ...) { - // TODO - return 0; -} - - /* vim: set ts=4 sw=4 tw=0 noet :*/ diff --git a/src/lib/libc/stdlib.c b/src/lib/libc/stdlib.c index 540d53c..7d08cd1 100644 --- a/src/lib/libc/stdlib.c +++ b/src/lib/libc/stdlib.c @@ -57,7 +57,7 @@ double strtod(const char *nptr, char **endptr) { for (int i = 0; i < exp; i++) val /= 10; } } - if (endptr != NULL) *endptr = (char*)(p-1); + if (endptr != NULL) *endptr = (char*)p; return val * sign; } diff --git a/src/sysbin/login/main.c b/src/sysbin/login/main.c index c4cd260..d86eb39 100644 --- a/src/sysbin/login/main.c +++ b/src/sysbin/login/main.c @@ -41,7 +41,8 @@ int main(int argc, char **argv) { && sc_bind_fd(shell_pid, STD_FD_TTY_STDIO, tc.b); if (!ok) PANIC("[login] Could not bind to shell process."); - ok = sc_proc_exec(shell_pid, "sys:/bin/shell.bin"); + // ok = sc_proc_exec(shell_pid, "sys:/bin/shell.bin"); + ok = sc_proc_exec(shell_pid, "root:/bin/lua.bin"); if (!ok) PANIC("[login] Could not run shell.bin"); proc_status_t s; -- cgit v1.2.3