diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 5560534ded7..fa44563a1ca 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 02d7d21cc52..84ef0a2de34 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -7,6 +7,7 @@ #include #include "i386.h" #include +#include #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 6673246dc50..cef16f864c3 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 5879837521f..1582b45dcff 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 360a1ab65c0..a0036d427b1 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 f8a832ae796..890a2d16f3b 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 76442ed3ec6..f7bc277f141 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 0e36c40f194..a9b2fd072ed 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 c79ec1d0267..f66b0613c24 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 3da50ca1f6c..2693ae19b54 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 00000000000..65607e287c5 --- /dev/null +++ b/LibC/termcap.cpp @@ -0,0 +1,10 @@ +#include + +extern "C" { + +char PC; +char* UP; +char* BC; + +} + diff --git a/LibC/termcap.h b/LibC/termcap.h new file mode 100644 index 00000000000..d81a7cd5207 --- /dev/null +++ b/LibC/termcap.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +__BEGIN_DECLS + +extern char PC; +extern char* UP; +extern char* BC; + +__END_DECLS + diff --git a/LibC/termios.h b/LibC/termios.h index e69de29bb2d..0fb1eea5342 100644 --- a/LibC/termios.h +++ b/LibC/termios.h @@ -0,0 +1,198 @@ +#pragma once + +#include +#include + +__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 5ff678d561f..a6c8eee7382 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 a55422a9210..4f4a3e10e28 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;