1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 00:57:36 +00:00

LibC: Implement various things to get GNU bc building and running.

Looks like that's all we needed, and bc now runs. :^)
This commit is contained in:
Andreas Kling 2019-02-03 04:32:31 +01:00
parent 3a9c01619f
commit c2adfd0e2d
9 changed files with 51 additions and 2 deletions

View file

@ -133,6 +133,11 @@ int getchar()
return getc(stdin); return getc(stdin);
} }
int ungetc(int, FILE*)
{
ASSERT_NOT_REACHED();
}
int fputc(int ch, FILE* stream) int fputc(int ch, FILE* stream)
{ {
assert(stream); assert(stream);

View file

@ -40,6 +40,7 @@ int fileno(FILE*);
int fgetc(FILE*); int fgetc(FILE*);
int getc(FILE*); int getc(FILE*);
int getchar(); int getchar();
int ungetc(int c, FILE*);
FILE* fdopen(int fd, const char* mode); FILE* fdopen(int fd, const char* mode);
FILE* fopen(const char* pathname, const char* mode); FILE* fopen(const char* pathname, const char* mode);
int fclose(FILE*); int fclose(FILE*);

View file

@ -262,4 +262,9 @@ void srandom(unsigned seed)
srand(seed); srand(seed);
} }
int system(const char* command)
{
return execl("/bin/sh", "sh", "-c", command, nullptr);
}
} }

View file

@ -21,6 +21,7 @@ void abort() __NORETURN;
char* ptsname(int fd); char* ptsname(int fd);
int ptsname_r(int fd, char* buffer, size_t); int ptsname_r(int fd, char* buffer, size_t);
int abs(int); int abs(int);
int system(const char* command);
#define RAND_MAX 32767 #define RAND_MAX 32767
int rand(); int rand();

View file

@ -186,6 +186,17 @@ char* strchr(const char* str, int c)
} }
} }
void* memchr(const void* ptr, int c, size_t size)
{
char ch = c;
char* cptr = (char*)ptr;
for (size_t i = 0; i < size; ++i) {
if (cptr[i] == ch)
return cptr + i;
}
return nullptr;
}
char* strrchr(const char* str, int ch) char* strrchr(const char* str, int ch)
{ {
char *last = nullptr; char *last = nullptr;

View file

@ -11,6 +11,7 @@ int strncmp(const char*, const char*, size_t);
int memcmp(const void*, const void*, size_t); int memcmp(const void*, const void*, size_t);
void* memcpy(void*, const void*, size_t); void* memcpy(void*, const void*, size_t);
void* memmove(void*, const void*, size_t); void* memmove(void*, const void*, size_t);
void* memchr(const void*, int c, size_t);
void bzero(void*, size_t); void bzero(void*, size_t);
void bcopy(const void*, void*, size_t); void bcopy(const void*, void*, size_t);
void* memset(void*, int, size_t); void* memset(void*, int, size_t);

View file

@ -9,6 +9,7 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/types.h> #include <sys/types.h>
#include <Kernel/Syscall.h> #include <Kernel/Syscall.h>
#include <AK/Vector.h>
extern "C" { extern "C" {
@ -26,9 +27,28 @@ int execve(const char* filename, char* const argv[], char* const envp[])
int execvp(const char* filename, char* const argv[]) int execvp(const char* filename, char* const argv[])
{ {
// FIXME: This should do some sort of shell-like path resolution!
return execve(filename, argv, nullptr); return execve(filename, argv, nullptr);
} }
int execl(const char* filename, const char* arg0, ...)
{
Vector<const char*> args;
args.append(arg0);
va_list ap;
va_start(ap, arg0);
for (;;) {
const char* arg = va_arg(ap, const char*);
if (!arg)
break;
args.append(arg);
}
va_end(ap);
return execve(filename, (char* const *)args.data(), nullptr);
}
uid_t getuid() uid_t getuid()
{ {
return syscall(SC_getuid); return syscall(SC_getuid);

View file

@ -13,6 +13,7 @@ inline int getpagesize() { return 4096; }
pid_t fork(); pid_t fork();
int execve(const char* filename, char* const argv[], char* const envp[]); int execve(const char* filename, char* const argv[], char* const envp[]);
int execvp(const char* filename, char* const argv[]); int execvp(const char* filename, char* const argv[]);
int execl(const char* filename, const char* arg, ...);
void sync(); void sync();
void _exit(int status); void _exit(int status);
pid_t getsid(pid_t); pid_t getsid(pid_t);

View file

@ -358,13 +358,12 @@ static void greeting()
printf("\n%s/%s on %s\n\n", uts.sysname, uts.machine, g->ttyname); printf("\n%s/%s on %s\n\n", uts.sysname, uts.machine, g->ttyname);
} }
int main(int, char**) int main(int argc, char** argv)
{ {
g = new GlobalState; g = new GlobalState;
g->uid = getuid(); g->uid = getuid();
g->sid = setsid(); g->sid = setsid();
tcsetpgrp(0, getpgrp()); tcsetpgrp(0, getpgrp());
tcgetattr(0, &g->termios); tcgetattr(0, &g->termios);
{ {
@ -391,6 +390,11 @@ int main(int, char**)
endpwent(); endpwent();
} }
if (argc > 1 && !strcmp(argv[1], "-c")) {
fprintf(stderr, "FIXME: Implement /bin/sh -c\n");
return 1;
}
greeting(); greeting();
char linebuf[128]; char linebuf[128];