From 736e8525259e0f562dc5dda3f7756ea738667b74 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 8 Feb 2019 02:38:21 +0100 Subject: [PATCH] LibC: Implement enough missing stuff to get bash-5.0 running. :^) --- Kernel/Process.cpp | 1 - Launcher/.gitignore | 2 +- Launcher/Launcher | Bin 67172 -> 0 bytes LibC/Makefile | 1 + LibC/fcntl.h | 25 +++++++++++++++++++++++++ LibC/float.h | 0 LibC/locale.cpp | 13 +++++++++++++ LibC/locale.h | 1 + LibC/setjmp.asm | 4 ++-- LibC/stat.cpp | 8 ++++++++ LibC/stdbool.h | 13 +++++++++++++ LibC/stdint.h | 2 ++ LibC/stdio.cpp | 6 ++++++ LibC/stdio.h | 1 + LibC/stdlib.cpp | 11 +++++++++++ LibC/stdlib.h | 3 +++ LibC/string.cpp | 10 ++++++++++ LibC/string.h | 1 + LibC/sys/stat.h | 9 +++++++++ LibC/time.cpp | 5 ++++- LibC/time.h | 3 +++ LibC/ulimit.cpp | 1 - LibC/unistd.cpp | 5 +++++ LibC/unistd.h | 35 ++++------------------------------- Userland/ls.cpp | 1 + Userland/sh.cpp | 1 + 26 files changed, 125 insertions(+), 37 deletions(-) delete mode 100755 Launcher/Launcher create mode 100644 LibC/float.h create mode 100644 LibC/locale.cpp create mode 100644 LibC/stdbool.h diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index e1244c2d14e..5eb3116beb9 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -1678,7 +1678,6 @@ bool Process::validate_write(void* address, size_t size) const if (check_kernel_memory_access(LinearAddress((dword)address), true)) return true; } - ASSERT(size); if (!size) return false; LinearAddress first_address((dword)address); diff --git a/Launcher/.gitignore b/Launcher/.gitignore index ea286a24a65..3065890cba8 100644 --- a/Launcher/.gitignore +++ b/Launcher/.gitignore @@ -1,3 +1,3 @@ *.o *.d -FontEditor +Launcher diff --git a/Launcher/Launcher b/Launcher/Launcher deleted file mode 100755 index 80b31262b4d845560aff9b3ebac06cc5936b79ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67172 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�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 diff --git a/LibC/Makefile b/LibC/Makefile index 3254a55339f..e7758391b42 100644 --- a/LibC/Makefile +++ b/LibC/Makefile @@ -44,6 +44,7 @@ LIBC_OBJS = \ gui.o \ sys/select.o \ poll.o \ + locale.o \ entry.o ASM_OBJS = setjmp.no diff --git a/LibC/fcntl.h b/LibC/fcntl.h index 5181ff22df9..fd6b7108232 100644 --- a/LibC/fcntl.h +++ b/LibC/fcntl.h @@ -25,6 +25,31 @@ __BEGIN_DECLS #define O_NOFOLLOW 00400000 #define O_CLOEXEC 02000000 +#define S_IFMT 0170000 +#define S_IFDIR 0040000 +#define S_IFCHR 0020000 +#define S_IFBLK 0060000 +#define S_IFREG 0100000 +#define S_IFIFO 0010000 +#define S_IFLNK 0120000 +#define S_IFSOCK 0140000 + +#define S_ISUID 04000 +#define S_ISGID 02000 +#define S_ISVTX 01000 +#define S_IRUSR 0400 +#define S_IWUSR 0200 +#define S_IXUSR 0100 +#define S_IRGRP 0040 +#define S_IWGRP 0020 +#define S_IXGRP 0010 +#define S_IROTH 0004 +#define S_IWOTH 0002 +#define S_IXOTH 0001 + +#define S_IRWXG (S_IRWXU >> 3) +#define S_IRWXO (S_IRWXG >> 3) + int fcntl(int fd, int cmd, ...); __END_DECLS diff --git a/LibC/float.h b/LibC/float.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/LibC/locale.cpp b/LibC/locale.cpp new file mode 100644 index 00000000000..8b7eb312ddb --- /dev/null +++ b/LibC/locale.cpp @@ -0,0 +1,13 @@ +#include +#include +#include + +extern "C" { + +char* setlocale(int category, const char* locale) +{ + dbgprintf("FIXME(LibC): setlocale(%d, %s)\n", category, locale); + return nullptr; +} + +} diff --git a/LibC/locale.h b/LibC/locale.h index d5e4530d09c..5243769a830 100644 --- a/LibC/locale.h +++ b/LibC/locale.h @@ -5,6 +5,7 @@ enum { LC_ALL, LC_NUMERIC, + LC_CTYPE, }; __BEGIN_DECLS diff --git a/LibC/setjmp.asm b/LibC/setjmp.asm index 7f1f13feec8..68d08ef7d92 100644 --- a/LibC/setjmp.asm +++ b/LibC/setjmp.asm @@ -3,7 +3,7 @@ global setjmp setjmp: mov eax, [esp + 4] - mov [eax * 4], ebx + mov [eax + 0 * 4], ebx mov [eax + 1 * 4], esi mov [eax + 2 * 4], edi mov [eax + 3 * 4], ebp @@ -18,7 +18,7 @@ global longjmp longjmp: mov edx, [esp + 4] mov eax, [esp + 8] - mov ebx, [edx * 4] + mov ebx, [edx + 0 * 4] mov esi, [edx + 1 * 4] mov edi, [edx + 2 * 4] mov ebp, [edx + 3 * 4] diff --git a/LibC/stat.cpp b/LibC/stat.cpp index 47bfe01e6a0..22414cda4e6 100644 --- a/LibC/stat.cpp +++ b/LibC/stat.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include #include extern "C" { @@ -21,5 +23,11 @@ int chmod(const char* pathname, mode_t mode) __RETURN_WITH_ERRNO(rc, rc, -1); } +int fchmod(int fd, mode_t mode) +{ + dbgprintf("FIXME(LibC): fchmod(%d, %o)\n", fd, mode); + ASSERT_NOT_REACHED(); +} + } diff --git a/LibC/stdbool.h b/LibC/stdbool.h new file mode 100644 index 00000000000..aa00f3430a5 --- /dev/null +++ b/LibC/stdbool.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +__BEGIN_DECLS + +#define bool _Bool +#define true 1 +#define false 0 +#define __bool_true_false_are_Defined 1 + +__END_DECLS + diff --git a/LibC/stdint.h b/LibC/stdint.h index 29af12f654c..4ff57745bed 100644 --- a/LibC/stdint.h +++ b/LibC/stdint.h @@ -14,6 +14,8 @@ typedef signed int int32_t; typedef signed short int16_t; typedef signed char int8_t; +typedef uint32_t uintptr_t; + #define INT8_MIN (-128) #define INT16_MIN (-32767-1) #define INT32_MIN (-2147483647-1) diff --git a/LibC/stdio.cpp b/LibC/stdio.cpp index ca9cd549b3c..d3d4f6df525 100644 --- a/LibC/stdio.cpp +++ b/LibC/stdio.cpp @@ -365,5 +365,11 @@ int fclose(FILE* stream) return rc; } +int rename(const char* oldpath, const char* newpath) +{ + dbgprintf("FIXME(LibC): rename(%s, %s)\n", oldpath, newpath); + ASSERT_NOT_REACHED(); +} + } diff --git a/LibC/stdio.h b/LibC/stdio.h index 11816f61820..fac01d731b2 100644 --- a/LibC/stdio.h +++ b/LibC/stdio.h @@ -70,6 +70,7 @@ int fscanf(FILE*, const char* fmt, ...); int setvbuf(FILE*, char* buf, int mode, size_t); void setbuf(FILE*, char* buf); void setlinebuf(FILE*); +int rename(const char* oldpath, const char* newpath); __END_DECLS diff --git a/LibC/stdlib.cpp b/LibC/stdlib.cpp index 7afa23b98ab..06e48cf4cfc 100644 --- a/LibC/stdlib.cpp +++ b/LibC/stdlib.cpp @@ -267,6 +267,17 @@ int system(const char* command) return execl("/bin/sh", "sh", "-c", command, nullptr); } +char* mktemp(char*) +{ + ASSERT_NOT_REACHED(); +} + +void* bsearch(const void* key, const void* base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) +{ + dbgprintf("FIXME(LibC): bsearch(%p, %p, %u, %u, %p)\n", key, base, nmemb, size, compar); + ASSERT_NOT_REACHED(); +} + div_t div(int numerator, int denominator) { div_t result; diff --git a/LibC/stdlib.h b/LibC/stdlib.h index 27f4d2dc81b..bc673b0a023 100644 --- a/LibC/stdlib.h +++ b/LibC/stdlib.h @@ -7,6 +7,7 @@ __BEGIN_DECLS #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 +#define MB_CUR_MAX 1 void* malloc(size_t) __MALLOC; void free(void*); @@ -22,6 +23,8 @@ char* ptsname(int fd); int ptsname_r(int fd, char* buffer, size_t); int abs(int); int system(const char* command); +char* mktemp(char*); +void* bsearch(const void* key, const void* base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); #define RAND_MAX 32767 int rand(); diff --git a/LibC/string.cpp b/LibC/string.cpp index 2c0ea877536..dbea2a5b3ba 100644 --- a/LibC/string.cpp +++ b/LibC/string.cpp @@ -285,5 +285,15 @@ char* strstr(const char* haystack, const char* needle) return const_cast(haystack); } +char* strpbrk(const char* s, const char* accept) +{ + while (*s) + if(strchr(accept, *s++)) + return (char*)--s; + return nullptr; +} + + + } diff --git a/LibC/string.h b/LibC/string.h index 7783731d918..bfeca32abc0 100644 --- a/LibC/string.h +++ b/LibC/string.h @@ -28,6 +28,7 @@ size_t strspn(const char*, const char* accept); size_t strcspn(const char*, const char* reject); char* strerror(int errnum); char* strsignal(int signum); +char* strpbrk(const char*, const char* accept); __END_DECLS diff --git a/LibC/sys/stat.h b/LibC/sys/stat.h index b1f6d860a73..f5a8980fe55 100644 --- a/LibC/sys/stat.h +++ b/LibC/sys/stat.h @@ -2,11 +2,20 @@ #include #include +#include __BEGIN_DECLS +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) + mode_t umask(mode_t); int chmod(const char* pathname, mode_t); +int fchmod(int fd, mode_t); int mkdir(const char* pathname, mode_t); inline dev_t makedev(unsigned int major, unsigned int minor) { return (minor & 0xffu) | (major << 8u) | ((minor & ~0xffu) << 12u); } diff --git a/LibC/time.cpp b/LibC/time.cpp index cecc161f44a..9c3ddaa0dde 100644 --- a/LibC/time.cpp +++ b/LibC/time.cpp @@ -83,7 +83,10 @@ struct tm* localtime(const time_t* t) return &tm_buf; } -long timezone = 0; +long timezone; +long altzone; +char* tzname[2]; +int daylight; void tzset() { diff --git a/LibC/time.h b/LibC/time.h index 45f17cd4f5c..9433f276c62 100644 --- a/LibC/time.h +++ b/LibC/time.h @@ -23,6 +23,9 @@ struct tm { }; extern long timezone; +extern long altzone; +extern char* tzname[2]; +extern int daylight; int gettimeofday(struct timeval*, struct timezone* tz); struct tm* localtime(const time_t*); diff --git a/LibC/ulimit.cpp b/LibC/ulimit.cpp index cfc3d824338..77f551498a4 100644 --- a/LibC/ulimit.cpp +++ b/LibC/ulimit.cpp @@ -11,4 +11,3 @@ long ulimit(int cmd, long newlimit) } } - diff --git a/LibC/unistd.cpp b/LibC/unistd.cpp index 71a57a290e3..e0123fe63ad 100644 --- a/LibC/unistd.cpp +++ b/LibC/unistd.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -186,6 +187,10 @@ int chdir(const char* path) char* getcwd(char* buffer, size_t size) { + if (!buffer) { + size = size ? size : PATH_MAX; + buffer = (char*)malloc(size); + } int rc = syscall(SC_getcwd, buffer, size); __RETURN_WITH_ERRNO(rc, buffer, nullptr); } diff --git a/LibC/unistd.h b/LibC/unistd.h index a3355cbc99f..99f18bad675 100644 --- a/LibC/unistd.h +++ b/LibC/unistd.h @@ -73,37 +73,10 @@ enum { #define HOST_NAME_MAX 64 -#define S_IFMT 0170000 -#define S_IFDIR 0040000 -#define S_IFCHR 0020000 -#define S_IFBLK 0060000 -#define S_IFREG 0100000 -#define S_IFIFO 0010000 -#define S_IFLNK 0120000 -#define S_IFSOCK 0140000 - -#define S_ISUID 04000 -#define S_ISGID 02000 -#define S_ISVTX 01000 -#define S_IRUSR 0400 -#define S_IWUSR 0200 -#define S_IXUSR 0100 -#define S_IRGRP 0040 -#define S_IWGRP 0020 -#define S_IXGRP 0010 -#define S_IROTH 0004 -#define S_IWOTH 0002 -#define S_IXOTH 0001 - -#define S_IRWXG (S_IRWXU >> 3) -#define S_IRWXO (S_IRWXG >> 3) - -#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) -#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) -#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) -#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#define R_OK 4 +#define W_OK 2 +#define X_OK 1 +#define F_OK 0 __END_DECLS diff --git a/Userland/ls.cpp b/Userland/ls.cpp index 80ca15bd64e..d5969b1e360 100644 --- a/Userland/ls.cpp +++ b/Userland/ls.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/sh.cpp b/Userland/sh.cpp index 0e492974207..0cd80c86283 100644 --- a/Userland/sh.cpp +++ b/Userland/sh.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include