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:
parent
3a9c01619f
commit
c2adfd0e2d
9 changed files with 51 additions and 2 deletions
|
@ -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);
|
||||||
|
|
|
@ -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*);
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue