i give up
This commit is contained in:
parent
8d8db38576
commit
0aa2ab39eb
9 changed files with 152 additions and 23 deletions
8
Makefile
8
Makefile
|
|
@ -1,12 +1,12 @@
|
||||||
SOURCES := src/main.c src/util/calloc.c src/util/string.c src/util/hash.c src/lexer/lexer.c src/builtins/builtins.c
|
SOURCES := src/main.c src/util/calloc.c src/util/string.c src/util/hash.c src/lexer/lexer.c src/builtins/builtins.c src/util/memset.c
|
||||||
CFLAGS := -g -O0 -nostdlib
|
CFLAGS := -Oz -nostdlib
|
||||||
|
|
||||||
UNAME := $(shell uname)
|
UNAME := $(shell uname)
|
||||||
ARCH := $(shell uname -m)
|
ARCH := $(shell uname -m)
|
||||||
|
|
||||||
ifeq ($(UNAME), Linux)
|
ifeq ($(UNAME), Linux)
|
||||||
SOURCES += src/system/linux/linux.c src/system/linux/alloc.c src/system/linux/env.c src/system/linux/errno.c
|
SOURCES += src/system/linux/linux.c src/system/linux/alloc.c src/system/linux/env.c src/system/linux/errno.c src/system/linux/signal.c
|
||||||
CFLAGS += -fno-stack-protector
|
CFLAGS += -fno-stack-protector -Wno-incompatible-library-redeclaration
|
||||||
CFLAGS += -DMSH_ENTRY_POINT="void _start()"
|
CFLAGS += -DMSH_ENTRY_POINT="void _start()"
|
||||||
ifeq ($(ARCH),i386)
|
ifeq ($(ARCH),i386)
|
||||||
SOURCES += src/system/linux/i386.s
|
SOURCES += src/system/linux/i386.s
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include <linux/kd.h>
|
#include <linux/kd.h>
|
||||||
#include <sys/file.h>
|
#include <sys/file.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#include <sys/signal.h>
|
#include <sys/signal.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
@ -81,7 +82,7 @@ int msh_execute(char *cmd, char **args) {
|
||||||
if (fork == 0) {
|
if (fork == 0) {
|
||||||
const char **env_translated = 0;
|
const char **env_translated = 0;
|
||||||
SIZE_TYPE env_translated_size = 0;
|
SIZE_TYPE env_translated_size = 0;
|
||||||
int ret, i = 0, n = 0;
|
SIZE_TYPE ret, i = 0, n = 0;
|
||||||
msh_linux_env_item *item_list = env_items;
|
msh_linux_env_item *item_list = env_items;
|
||||||
while (item_list->next != 0) {
|
while (item_list->next != 0) {
|
||||||
env_translated_size += 1;
|
env_translated_size += 1;
|
||||||
|
|
@ -105,7 +106,7 @@ int msh_execute(char *cmd, char **args) {
|
||||||
env_translated[i++] = 0;
|
env_translated[i++] = 0;
|
||||||
|
|
||||||
msh_linux_end_input_capture();
|
msh_linux_end_input_capture();
|
||||||
ret = (int)SYSCALL(execve, cmd, args, env_translated);
|
ret = (SIZE_TYPE)SYSCALL(execve, cmd, args, env_translated);
|
||||||
|
|
||||||
for (n = 0; n < i; n++) {
|
for (n = 0; n < i; n++) {
|
||||||
msh_deallocate(env_translated[n]);
|
msh_deallocate(env_translated[n]);
|
||||||
|
|
@ -118,14 +119,28 @@ int msh_execute(char *cmd, char **args) {
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
siginfo_t info;
|
siginfo_t status;
|
||||||
SYSCALL(waitid, P_ALL, 0, &info, WEXITED);
|
struct rusage ru;
|
||||||
|
SIZE_TYPE ret;
|
||||||
|
char *status_str;
|
||||||
|
|
||||||
|
/* msh_linux_setup_signals(); */
|
||||||
|
|
||||||
|
ret = (SIZE_TYPE)SYSCALL(waitid, P_ALL, fork, &status, WEXITED, &ru);
|
||||||
|
|
||||||
|
/*
|
||||||
|
status_str = msh_allocate(64);
|
||||||
|
itoa(status.si_code, status_str, 10);
|
||||||
|
msh_print_strings("Status ", status_str, "\n", 0);
|
||||||
|
msh_deallocate(status_str);
|
||||||
|
*/
|
||||||
|
|
||||||
SYSCALL(kill, fork, SIGKILL);
|
SYSCALL(kill, fork, SIGKILL);
|
||||||
|
|
||||||
SYSCALL(write, 1, "\r", 2);
|
SYSCALL(write, 1, "\r", 2);
|
||||||
msh_linux_start_input_capture();
|
msh_linux_start_input_capture();
|
||||||
|
|
||||||
return info.si_code;
|
return status.si_signo;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,8 @@ void msh_linux_env_map_deinit();
|
||||||
void msh_linux_start_input_capture();
|
void msh_linux_start_input_capture();
|
||||||
void msh_linux_end_input_capture();
|
void msh_linux_end_input_capture();
|
||||||
|
|
||||||
|
/* void msh_linux_setup_signals(); */
|
||||||
|
|
||||||
struct msh_file_t {
|
struct msh_file_t {
|
||||||
int fd;
|
int fd;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
53
src/system/linux/signal.c
Normal file
53
src/system/linux/signal.c
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
/* Setting up signal handlers is fine but the registers gets clobbered any time
|
||||||
|
* we return from them. Why? Because go fuck yourself :) and go spend 6 hours
|
||||||
|
* of your day trying to find out why before giving up :) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include "linux.h"
|
||||||
|
#include "syscall.h"
|
||||||
|
#include <asm/unistd_64.h>
|
||||||
|
|
||||||
|
#define SA_RESTORER 0x04000000
|
||||||
|
#include <asm-generic/siginfo.h>
|
||||||
|
#include <asm-generic/signal-defs.h>
|
||||||
|
#include <asm-generic/signal.h>
|
||||||
|
|
||||||
|
#define INIT_SIGNAL(x) \
|
||||||
|
SYSCALL(rt_sigaction, x, &sigact, &sigact_old, sizeof(sigset_t));
|
||||||
|
|
||||||
|
static void signal_handler(int sig) {
|
||||||
|
char *status_str = msh_allocate(64);
|
||||||
|
itoa(sig, status_str, 10);
|
||||||
|
msh_print_strings("\nsignal ", status_str, "\n\n", 0);
|
||||||
|
msh_deallocate(status_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void signal_restorer(void) {
|
||||||
|
SYSCALL_0(rt_sigreturn);
|
||||||
|
}
|
||||||
|
|
||||||
|
void msh_linux_setup_signals() {
|
||||||
|
struct sigaction sigact;
|
||||||
|
struct sigaction sigact_old;
|
||||||
|
|
||||||
|
memset(&sigact, 0, sizeof(sigact));
|
||||||
|
memset(&sigact_old, 0, sizeof(sigact));
|
||||||
|
|
||||||
|
sigact.sa_handler = signal_handler;
|
||||||
|
sigact.sa_restorer = signal_restorer;
|
||||||
|
sigact.sa_flags = SA_RESTORER | SA_RESTART | SA_SIGINFO;
|
||||||
|
|
||||||
|
SYSCALL(rt_sigprocmask, SIG_UNBLOCK, &sigact.sa_mask, &sigact_old.sa_mask,
|
||||||
|
sizeof(sigset_t));
|
||||||
|
|
||||||
|
INIT_SIGNAL(SIGINT);
|
||||||
|
INIT_SIGNAL(SIGILL);
|
||||||
|
INIT_SIGNAL(SIGABRT);
|
||||||
|
INIT_SIGNAL(SIGFPE);
|
||||||
|
INIT_SIGNAL(SIGSEGV);
|
||||||
|
INIT_SIGNAL(SIGTERM);
|
||||||
|
INIT_SIGNAL(SIGHUP);
|
||||||
|
INIT_SIGNAL(SIGQUIT);
|
||||||
|
INIT_SIGNAL(SIGTRAP);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
#define NARGS_SEQ(_1, _2, _3, _4, _5, _6, _7, _8, _9, N, ...) N
|
#define NARGS_SEQ(_1, _2, _3, _4, _5, _6, _7, _8, _9, N, ...) N
|
||||||
#define NARGS(...) NARGS_SEQ(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1)
|
#define NARGS(...) NARGS_SEQ(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1)
|
||||||
|
|
||||||
|
#include "../system.h"
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
void *syscall_0(void *number);
|
void *syscall_0(void *number);
|
||||||
|
|
@ -16,23 +17,33 @@ void *syscall_5(void *number, void *arg1, void *arg2, void *arg3, void *arg4,
|
||||||
void *syscall_6(void *number, void *arg1, void *arg2, void *arg3, void *arg4,
|
void *syscall_6(void *number, void *arg1, void *arg2, void *arg3, void *arg4,
|
||||||
void *arg5, void *arg6);
|
void *arg5, void *arg6);
|
||||||
|
|
||||||
#define _syscall_0(a) syscall_0((void *)(a))
|
#define _syscall_0(a) syscall_0((void *)(SIZE_TYPE)(a))
|
||||||
#define _syscall_1(a, b) syscall_1((void *)(a), (void *)(b))
|
#define _syscall_1(a, b) \
|
||||||
#define _syscall_2(a, b, c) syscall_2((void *)(a), (void *)(b), (void *)(c))
|
syscall_1((void *)(SIZE_TYPE)(a), (void *)(SIZE_TYPE)(b))
|
||||||
|
#define _syscall_2(a, b, c) \
|
||||||
|
syscall_2((void *)(SIZE_TYPE)(a), (void *)(SIZE_TYPE)(b), \
|
||||||
|
(void *)(SIZE_TYPE)(c))
|
||||||
#define _syscall_3(a, b, c, d) \
|
#define _syscall_3(a, b, c, d) \
|
||||||
syscall_3((void *)(a), (void *)(b), (void *)(c), (void *)(d))
|
syscall_3((void *)(SIZE_TYPE)(a), (void *)(SIZE_TYPE)(b), \
|
||||||
|
(void *)(SIZE_TYPE)(c), (void *)(SIZE_TYPE)(d))
|
||||||
#define _syscall_4(a, b, c, d, e) \
|
#define _syscall_4(a, b, c, d, e) \
|
||||||
syscall_4((void *)(a), (void *)(b), (void *)(c), (void *)(d), (void *)(e))
|
syscall_4((void *)(SIZE_TYPE)(a), (void *)(SIZE_TYPE)(b), \
|
||||||
|
(void *)(SIZE_TYPE)(c), (void *)(SIZE_TYPE)(d), \
|
||||||
|
(void *)(SIZE_TYPE)(e))
|
||||||
#define _syscall_5(a, b, c, d, e, f) \
|
#define _syscall_5(a, b, c, d, e, f) \
|
||||||
syscall_5((void *)(a), (void *)(b), (void *)(c), (void *)(d), (void *)(e), \
|
syscall_5((void *)(SIZE_TYPE)(a), (void *)(SIZE_TYPE)(b), \
|
||||||
(void *)(f))
|
(void *)(SIZE_TYPE)(c), (void *)(SIZE_TYPE)(d), \
|
||||||
|
(void *)(SIZE_TYPE)(e), (void *)(SIZE_TYPE)(f))
|
||||||
#define _syscall_6(a, b, c, d, e, f, g) \
|
#define _syscall_6(a, b, c, d, e, f, g) \
|
||||||
syscall_6((void *)(a), (void *)(b), (void *)(c), (void *)(d), (void *)(e), \
|
syscall_6((void *)(SIZE_TYPE)(a), (void *)(SIZE_TYPE)(b), \
|
||||||
(void *)(f), (void *)(g))
|
(void *)(SIZE_TYPE)(c), (void *)(SIZE_TYPE)(d), \
|
||||||
|
(void *)(SIZE_TYPE)(e), (void *)(SIZE_TYPE)(f), \
|
||||||
|
(void *)(SIZE_TYPE)(g))
|
||||||
#define PASTER(x, y) x##_##y
|
#define PASTER(x, y) x##_##y
|
||||||
#define EVALUATOR(x, y) PASTER(x, y)
|
#define EVALUATOR(x, y) PASTER(x, y)
|
||||||
#define VARIABLE(...) NARGS(__VA_ARGS__)
|
#define VARIABLE(...) NARGS(__VA_ARGS__)
|
||||||
#define FUNC(...) EVALUATOR(_syscall, VARIABLE(__VA_ARGS__))
|
#define FUNC(...) EVALUATOR(_syscall, VARIABLE(__VA_ARGS__))
|
||||||
|
|
||||||
|
#define SYSCALL_0(name) _syscall_0(__NR_##name)
|
||||||
#define SYSCALL(name, ...) FUNC(__VA_ARGS__)(__NR_##name, __VA_ARGS__)
|
#define SYSCALL(name, ...) FUNC(__VA_ARGS__)(__NR_##name, __VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,6 @@
|
||||||
void *msh_callocate(SIZE_TYPE number, SIZE_TYPE size) {
|
void *msh_callocate(SIZE_TYPE number, SIZE_TYPE size) {
|
||||||
SIZE_TYPE *new, i, s4;
|
SIZE_TYPE *new, i, s4;
|
||||||
new = msh_allocate(number * size);
|
new = msh_allocate(number * size);
|
||||||
if (new) {
|
memset(new, 0, number * size);
|
||||||
for (i = 0; i < (number * size); i++) {
|
|
||||||
new[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (new);
|
return (new);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
13
src/util/memset.c
Normal file
13
src/util/memset.c
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
void *memset(void *b, int c, SIZE_TYPE len) {
|
||||||
|
int i;
|
||||||
|
unsigned char *p = b;
|
||||||
|
i = 0;
|
||||||
|
while (len > 0) {
|
||||||
|
*p = c;
|
||||||
|
p++;
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
return (b);
|
||||||
|
}
|
||||||
|
|
@ -48,3 +48,37 @@ void msh_str_copy_str(char *dst, char *src) {
|
||||||
while ((*dst++ = *src++))
|
while ((*dst++ = *src++))
|
||||||
;
|
;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int itoa(int value, char *sp, int radix) {
|
||||||
|
char tmp[16]; // be careful with the length of the buffer
|
||||||
|
char *tp = tmp;
|
||||||
|
int i;
|
||||||
|
unsigned v;
|
||||||
|
|
||||||
|
int sign = (radix == 10 && value < 0);
|
||||||
|
if (sign)
|
||||||
|
v = -value;
|
||||||
|
else
|
||||||
|
v = (unsigned)value;
|
||||||
|
|
||||||
|
while (v || tp == tmp) {
|
||||||
|
i = v % radix;
|
||||||
|
v /= radix;
|
||||||
|
if (i < 10)
|
||||||
|
*tp++ = i + '0';
|
||||||
|
else
|
||||||
|
*tp++ = i + 'a' - 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
int len = tp - tmp;
|
||||||
|
|
||||||
|
if (sign) {
|
||||||
|
*sp++ = '-';
|
||||||
|
len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (tp > tmp)
|
||||||
|
*sp++ = *--tp;
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,4 +21,9 @@ void msh_print_string(char *str);
|
||||||
/* Hash string */
|
/* Hash string */
|
||||||
unsigned long str_hash(char *str);
|
unsigned long str_hash(char *str);
|
||||||
|
|
||||||
|
/* satisfy glibc */
|
||||||
|
void *memset(void *b, int c, SIZE_TYPE len);
|
||||||
|
|
||||||
|
/* convert int to string */
|
||||||
|
int itoa(int value, char *sp, int radix);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue