summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Kernel/Process.cpp16
-rw-r--r--Kernel/Process.h3
-rw-r--r--Kernel/Syscall.cpp4
-rw-r--r--Kernel/Syscall.h2
-rw-r--r--LibC/Makefile2
-rw-r--r--LibC/dirent.h7
-rw-r--r--LibC/signal.cpp11
-rw-r--r--LibC/signal.h6
-rw-r--r--LibC/string.cpp30
-rw-r--r--LibC/string.h4
-rw-r--r--LibC/termcap.cpp10
-rw-r--r--LibC/termcap.h12
-rw-r--r--LibC/termios.h198
-rw-r--r--LibC/unistd.cpp6
-rw-r--r--VirtualFileSystem/UnixTypes.h3
15 files changed, 306 insertions, 8 deletions
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp
index 5560534ded..fa44563a1c 100644
--- a/Kernel/Process.cpp
+++ b/Kernel/Process.cpp
@@ -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) {
diff --git a/Kernel/Process.h b/Kernel/Process.h
index 02d7d21cc5..84ef0a2de3 100644
--- a/Kernel/Process.h
+++ b/Kernel/Process.h
@@ -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();
diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp
index 6673246dc5..cef16f864c 100644
--- a/Kernel/Syscall.cpp
+++ b/Kernel/Syscall.cpp
@@ -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;
diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h
index 5879837521..1582b45dcf 100644
--- a/Kernel/Syscall.h
+++ b/Kernel/Syscall.h
@@ -51,6 +51,8 @@ enum Function {
PosixExecve = 0x2019,
PosixGeteuid = 0x2020,
PosixGetegid = 0x2021,
+ PosixSignal = 0x2022,
+ PosixIsatty = 0x2023,
};
void initialize();
diff --git a/LibC/Makefile b/LibC/Makefile
index 360a1ab65c..a0036d427b 100644
--- a/LibC/Makefile
+++ b/LibC/Makefile
@@ -21,6 +21,8 @@ LIBC_OBJS = \
scanf.o \
pwd.o \
times.o \
+ termcap.o \
+ setjmp.o \
entry.o
OBJS = $(AK_OBJS) $(LIBC_OBJS)
diff --git a/LibC/dirent.h b/LibC/dirent.h
index f8a832ae79..890a2d16f3 100644
--- a/LibC/dirent.h
+++ b/LibC/dirent.h
@@ -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
diff --git a/LibC/signal.cpp b/LibC/signal.cpp
index 76442ed3ec..f7bc277f14 100644
--- a/LibC/signal.cpp
+++ b/LibC/signal.cpp
@@ -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;
+}
+
}
diff --git a/LibC/signal.h b/LibC/signal.h
index 0e36c40f19..a9b2fd072e 100644
--- a/LibC/signal.h
+++ b/LibC/signal.h
@@ -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
diff --git a/LibC/string.cpp b/LibC/string.cpp
index c79ec1d026..f66b0613c2 100644
--- a/LibC/string.cpp
+++ b/LibC/string.cpp
@@ -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)
diff --git a/LibC/string.h b/LibC/string.h
index 3da50ca1f6..2693ae19b5 100644
--- a/LibC/string.h
+++ b/LibC/string.h
@@ -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);
diff --git a/LibC/termcap.cpp b/LibC/termcap.cpp
new file mode 100644
index 0000000000..65607e287c
--- /dev/null
+++ b/LibC/termcap.cpp
@@ -0,0 +1,10 @@
+#include <termcap.h>
+
+extern "C" {
+
+char PC;
+char* UP;
+char* BC;
+
+}
+
diff --git a/LibC/termcap.h b/LibC/termcap.h
new file mode 100644
index 0000000000..d81a7cd520
--- /dev/null
+++ b/LibC/termcap.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+extern char PC;
+extern char* UP;
+extern char* BC;
+
+__END_DECLS
+
diff --git a/LibC/termios.h b/LibC/termios.h
index e69de29bb2..0fb1eea534 100644
--- a/LibC/termios.h
+++ b/LibC/termios.h
@@ -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
+
diff --git a/LibC/unistd.cpp b/LibC/unistd.cpp
index 5ff678d561..a6c8eee738 100644
--- a/LibC/unistd.cpp
+++ b/LibC/unistd.cpp
@@ -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);
+}
+
}
diff --git a/VirtualFileSystem/UnixTypes.h b/VirtualFileSystem/UnixTypes.h
index a55422a921..4f4a3e10e2 100644
--- a/VirtualFileSystem/UnixTypes.h
+++ b/VirtualFileSystem/UnixTypes.h
@@ -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;