More random compat hacking towards getting bash to build.

I'm now at the build stage where it complains about a bajillion missing
symbols. This is a good place to be!
This commit is contained in:
Andreas Kling 2018-11-05 18:16:00 +01:00
parent e76312ab63
commit 82f84bab11
15 changed files with 306 additions and 8 deletions

View file

@ -1174,6 +1174,22 @@ int Process::sys$uname(utsname* buf)
return 0;
}
int Process::sys$isatty(int fd)
{
auto* handle = fileHandleIfExists(fd);
if (!handle)
return -EBADF;
if (!handle->isTTY())
return -ENOTTY;
return 1;
}
Unix::sighandler_t Process::sys$signal(int signum, Unix::sighandler_t handler)
{
dbgprintf("sys$signal: %d => L%x\n", signum, handler);
return nullptr;
}
int Process::sys$kill(pid_t pid, int signal)
{
if (pid == 0) {

View file

@ -7,6 +7,7 @@
#include <AK/Vector.h>
#include "i386.h"
#include <VirtualFileSystem/VirtualFileSystem.h>
#include <VirtualFileSystem/UnixTypes.h>
#include "TTY.h"
class FileHandle;
@ -123,6 +124,8 @@ public:
int sys$ttyname_r(int fd, char*, size_t);
pid_t sys$fork(RegisterDump&);
int sys$execve(const char* filename, const char** argv, const char** envp);
Unix::sighandler_t sys$signal(int signum, Unix::sighandler_t);
int sys$isatty(int fd);
static void initialize();

View file

@ -136,6 +136,10 @@ static DWORD handle(RegisterDump& regs, DWORD function, DWORD arg1, DWORD arg2,
return current->sys$geteuid();
case Syscall::PosixGetegid:
return current->sys$getegid();
case Syscall::PosixSignal:
return (dword)current->sys$signal((int)arg1, (Unix::sighandler_t)arg2);
case Syscall::PosixIsatty:
return current->sys$isatty((int)arg1);
default:
kprintf("<%u> int0x80: Unknown function %x requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3);
break;

View file

@ -51,6 +51,8 @@ enum Function {
PosixExecve = 0x2019,
PosixGeteuid = 0x2020,
PosixGetegid = 0x2021,
PosixSignal = 0x2022,
PosixIsatty = 0x2023,
};
void initialize();

View file

@ -21,6 +21,8 @@ LIBC_OBJS = \
scanf.o \
pwd.o \
times.o \
termcap.o \
setjmp.o \
entry.o
OBJS = $(AK_OBJS) $(LIBC_OBJS)

View file

@ -13,16 +13,17 @@ struct dirent {
char d_name[256];
};
struct DIR {
struct __DIR {
int fd;
dirent cur_ent;
struct dirent cur_ent;
char* buffer;
size_t buffer_size;
char* nextptr;
};
typedef struct __DIR DIR;
DIR* opendir(const char* name);
dirent* readdir(DIR* dirp);
struct dirent* readdir(DIR* dirp);
__END_DECLS

View file

@ -11,5 +11,16 @@ int kill(pid_t pid, int sig)
__RETURN_WITH_ERRNO(rc, rc, -1);
}
sighandler_t signal(int signum, sighandler_t handler)
{
sighandler_t old_handler = (sighandler_t)Syscall::invoke(Syscall::PosixSignal, (dword)signum, (dword)handler);
if (old_handler == SIG_ERR) {
errno = EINVAL;
return SIG_ERR;
}
errno = 0;
return old_handler;
}
}

View file

@ -19,6 +19,7 @@ struct sigaction {
};
int kill(pid_t, int sig);
sighandler_t signal(int sig, sighandler_t);
#define SIG_DFL ((__sighandler_t)0)
#define SIG_ERR ((__sighandler_t)-1)
@ -28,7 +29,6 @@ int kill(pid_t, int sig);
#define SIG_UNBLOCK 1
#define SIG_SETMASK 2
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
@ -44,6 +44,10 @@ int kill(pid_t, int sig);
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGCONT 18
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
__END_DECLS

View file

@ -4,6 +4,16 @@
extern "C" {
void bzero(void* dest, size_t n)
{
memset(dest, 0, n);
}
void bcopy(const void* src, void* dest, size_t n)
{
memmove(dest, src, n);
}
void* memset(void* dest, int c, size_t n)
{
uint8_t* bdest = (uint8_t*)dest;
@ -48,11 +58,23 @@ size_t strlen(const char* str)
int strcmp(const char* s1, const char* s2)
{
for (; *s1 == *s2; ++s1, ++s2) {
if (*s1 == 0)
while (*s1 == *s2++)
if (*s1++ == 0)
return 0;
}
return *(const unsigned char*)s1 < *(const unsigned char*)s2 ? -1 : 1;
return *(const unsigned char*)s1 - *(const unsigned char*)--s2;
}
int strncmp(const char* s1, const char* s2, size_t n)
{
if (!n)
return 0;
do {
if (*s1 != *s2++)
return *(const unsigned char*)s1 - *(const unsigned char*)--s2;
if (*s1++ == 0)
break;
} while (--n);
return 0;
}
int memcmp(const void* v1, const void* v2, size_t n)

View file

@ -7,8 +7,12 @@ __BEGIN_DECLS
size_t strlen(const char*);
int strcmp(const char*, const char*);
int strncmp(const char*, const char*, size_t);
int memcmp(const void*, const void*, size_t);
void memcpy(void*, const void*, size_t);
void memmove(void*, const void*, size_t);
void bzero(void*, size_t);
void bcopy(const void*, void*, size_t);
void* memset(void*, int, size_t);
char* strcpy(char* dest, const char* src);
char* strncpy(char* dest, const char* src, size_t);

10
LibC/termcap.cpp Normal file
View file

@ -0,0 +1,10 @@
#include <termcap.h>
extern "C" {
char PC;
char* UP;
char* BC;
}

12
LibC/termcap.h Normal file
View file

@ -0,0 +1,12 @@
#pragma once
#include <sys/cdefs.h>
__BEGIN_DECLS
extern char PC;
extern char* UP;
extern char* BC;
__END_DECLS

View file

@ -0,0 +1,198 @@
#pragma once
#include <sys/cdefs.h>
#include <sys/types.h>
__BEGIN_DECLS
#define NCCS 32
typedef uint32_t tcflag_t;
typedef uint8_t cc_t;
struct termios {
tcflag_t c_iflag;
tcflag_t c_oflag;
tcflag_t c_cflag;
tcflag_t c_lflag;
cc_t c_cc[NCCS];
};
/* c_cc characters */
#define VINTR 0
#define VQUIT 1
#define VERASE 2
#define VKILL 3
#define VEOF 4
#define VTIME 5
#define VMIN 6
#define VSWTC 7
#define VSTART 8
#define VSTOP 9
#define VSUSP 10
#define VEOL 11
#define VREPRINT 12
#define VDISCARD 13
#define VWERASE 14
#define VLNEXT 15
#define VEOL2 16
/* c_iflag bits */
#define IGNBRK 0000001
#define BRKINT 0000002
#define IGNPAR 0000004
#define PARMRK 0000010
#define INPCK 0000020
#define ISTRIP 0000040
#define INLCR 0000100
#define IGNCR 0000200
#define ICRNL 0000400
#define IUCLC 0001000
#define IXON 0002000
#define IXANY 0004000
#define IXOFF 0010000
#define IMAXBEL 0020000
#define IUTF8 0040000
/* c_oflag bits */
#define OPOST 0000001
#define OLCUC 0000002
#define ONLCR 0000004
#define OCRNL 0000010
#define ONOCR 0000020
#define ONLRET 0000040
#define OFILL 0000100
#define OFDEL 0000200
#if defined __USE_MISC || defined __USE_XOPEN
# define NLDLY 0000400
# define NL0 0000000
# define NL1 0000400
# define CRDLY 0003000
# define CR0 0000000
# define CR1 0001000
# define CR2 0002000
# define CR3 0003000
# define TABDLY 0014000
# define TAB0 0000000
# define TAB1 0004000
# define TAB2 0010000
# define TAB3 0014000
# define BSDLY 0020000
# define BS0 0000000
# define BS1 0020000
# define FFDLY 0100000
# define FF0 0000000
# define FF1 0100000
#endif
#define VTDLY 0040000
#define VT0 0000000
#define VT1 0040000
#ifdef __USE_MISC
# define XTABS 0014000
#endif
/* c_cflag bit meaning */
#ifdef __USE_MISC
# define CBAUD 0010017
#endif
#define B0 0000000 /* hang up */
#define B50 0000001
#define B75 0000002
#define B110 0000003
#define B134 0000004
#define B150 0000005
#define B200 0000006
#define B300 0000007
#define B600 0000010
#define B1200 0000011
#define B1800 0000012
#define B2400 0000013
#define B4800 0000014
#define B9600 0000015
#define B19200 0000016
#define B38400 0000017
#ifdef __USE_MISC
# define EXTA B19200
# define EXTB B38400
#endif
#define CSIZE 0000060
#define CS5 0000000
#define CS6 0000020
#define CS7 0000040
#define CS8 0000060
#define CSTOPB 0000100
#define CREAD 0000200
#define PARENB 0000400
#define PARODD 0001000
#define HUPCL 0002000
#define CLOCAL 0004000
#ifdef __USE_MISC
# define CBAUDEX 0010000
#endif
#define B57600 0010001
#define B115200 0010002
#define B230400 0010003
#define B460800 0010004
#define B500000 0010005
#define B576000 0010006
#define B921600 0010007
#define B1000000 0010010
#define B1152000 0010011
#define B1500000 0010012
#define B2000000 0010013
#define B2500000 0010014
#define B3000000 0010015
#define B3500000 0010016
#define B4000000 0010017
#define __MAX_BAUD B4000000
#ifdef __USE_MISC
# define CIBAUD 002003600000 /* input baud rate (not used) */
# define CMSPAR 010000000000 /* mark or space (stick) parity */
# define CRTSCTS 020000000000 /* flow control */
#endif
/* c_lflag bits */
#define ISIG 0000001
#define ICANON 0000002
#if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K)
# define XCASE 0000004
#endif
#define ECHO 0000010
#define ECHOE 0000020
#define ECHOK 0000040
#define ECHONL 0000100
#define NOFLSH 0000200
#define TOSTOP 0000400
#ifdef __USE_MISC
# define ECHOCTL 0001000
# define ECHOPRT 0002000
# define ECHOKE 0004000
# define FLUSHO 0010000
# define PENDIN 0040000
#endif
#define IEXTEN 0100000
#ifdef __USE_MISC
# define EXTPROC 0200000
#endif
/* tcflow() and TCXONC use these */
#define TCOOFF 0
#define TCOON 1
#define TCIOFF 2
#define TCION 3
/* tcflush() and TCFLSH use these */
#define TCIFLUSH 0
#define TCOFLUSH 1
#define TCIOFLUSH 2
/* tcsetattr uses these */
#define TCSANOW 0
#define TCSADRAIN 1
#define TCSAFLUSH 2
__END_DECLS

View file

@ -184,5 +184,11 @@ int unlink(const char*)
assert(false);
}
int isatty(int fd)
{
int rc = Syscall::invoke(Syscall::PosixIsatty, (dword)fd);
__RETURN_WITH_ERRNO(rc, 1, 0);
}
}

View file

@ -20,6 +20,9 @@ typedef dword nlink_t;
typedef dword uid_t;
typedef dword gid_t;
typedef void (*__sighandler_t)(int);
typedef __sighandler_t sighandler_t;
#ifdef SERENITY
// FIXME: Support 64-bit offsets!
typedef signed_dword off_t;