summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sys/stat.h1
-rw-r--r--include/sys/types.h2
-rw-r--r--kernel/drivers/keyboard.c2
-rw-r--r--kernel/network/tcp.c5
-rwxr-xr-xmeta/debug.sh2
-rwxr-xr-xmeta/run.sh4
-rwxr-xr-xmeta/userland.sh6
-rw-r--r--userland/libc/Makefile2
-rw-r--r--userland/libc/include/stdio.h1
-rw-r--r--userland/libc/include/syscall.h3
-rw-r--r--userland/libc/include/time.h1
-rw-r--r--userland/libc/libc.c6
-rw-r--r--userland/libgui/Makefile4
-rw-r--r--userland/libgui/libgui.c48
-rw-r--r--userland/libgui/libgui.h13
-rw-r--r--userland/libppm/ppm.c28
-rw-r--r--userland/terminal/term.c7
-rwxr-xr-xuserland/test/linux.sh4
-rw-r--r--userland/test/test.c69
19 files changed, 167 insertions, 41 deletions
diff --git a/include/sys/stat.h b/include/sys/stat.h
index e33b14e..42a2e95 100644
--- a/include/sys/stat.h
+++ b/include/sys/stat.h
@@ -1,5 +1,6 @@
#ifndef SYS_STAT_H
#define SYS_STAT_H
+#include <stddef.h>
#include <sys/types.h>
#include <time.h>
diff --git a/include/sys/types.h b/include/sys/types.h
index 26e11b6..bfeefb4 100644
--- a/include/sys/types.h
+++ b/include/sys/types.h
@@ -6,7 +6,7 @@ typedef int pid_t;
typedef u16 dev_t;
typedef u16 uid_t;
typedef u16 ino_t;
-typedef u16 mode_t;
+typedef unsigned int mode_t;
typedef u16 nlink_t;
typedef i32 gid_t;
typedef u64 off_t;
diff --git a/kernel/drivers/keyboard.c b/kernel/drivers/keyboard.c
index fb85e39..cd7ab9e 100644
--- a/kernel/drivers/keyboard.c
+++ b/kernel/drivers/keyboard.c
@@ -75,7 +75,7 @@ u8 capital_ascii_table[] = {
'\"', // ;
'~', // ;
'D', // LEFT SHIFT
- '\\', // ;
+ '|', // ;
'Z', 'X', 'C', 'V', 'B', 'N', 'M',
'<', // ;
'>', // ;
diff --git a/kernel/network/tcp.c b/kernel/network/tcp.c
index 5d11a93..8fbd490 100644
--- a/kernel/network/tcp.c
+++ b/kernel/network/tcp.c
@@ -88,7 +88,8 @@ static void tcp_send(struct TcpConnection *con, u8 *buffer, u16 length,
}
void tcp_send_empty_payload(struct TcpConnection *con, u8 flags) {
- struct TCP_HEADER header = {0};
+ struct TCP_HEADER header;
+ memset(&header, 0, sizeof(header));
header.src_port = htons(con->incoming_port);
header.dst_port = htons(con->outgoing_port);
header.seq_num = htonl(con->snd_nxt);
@@ -104,7 +105,7 @@ void tcp_send_empty_payload(struct TcpConnection *con, u8 flags) {
header.window_size = htons(con->rcv_wnd);
header.urgent_pointer = 0;
- u8 payload[0];
+ u8 payload[] = {0};
u16 payload_length = 0;
header.checksum = tcp_calculate_checksum(
ip_address, con->outgoing_ip, (const u8 *)payload, payload_length,
diff --git a/meta/debug.sh b/meta/debug.sh
index 2cb3d90..47b1a18 100755
--- a/meta/debug.sh
+++ b/meta/debug.sh
@@ -4,4 +4,4 @@ cd "$scriptdir"
cd ..
#qemu-system-i386 -no-reboot -no-shutdown -serial file:./logs/serial.log -hda ./meta/ext2.img -m 1G -cdrom ./kernel/myos.iso -s -S &
qemu-system-i386 -netdev user,id=n0,hostfwd=tcp:127.0.0.1:6001-:6000 -device rtl8139,netdev=n0 -object filter-dump,id=id,netdev=n0,file=./logs/netout -no-reboot -no-shutdown -chardev stdio,id=char0,logfile=./logs/serial.log,signal=off -serial chardev:char0 -drive id=disk,file=./meta/ext2.img,if=none -device ahci,id=ahci -device ide-hd,drive=disk,bus=ahci.0 -m 512M -cdrom ./kernel/myos.iso -s -S &
-gdb -x .gdbinit
+gdb -x ./meta/.gdbinit
diff --git a/meta/run.sh b/meta/run.sh
index 618dd5e..ae70780 100755
--- a/meta/run.sh
+++ b/meta/run.sh
@@ -2,9 +2,7 @@
scriptdir="$(dirname "$0")"
cd "$scriptdir"
cd ..
-#qemu-system-i386 -netdev user,id=n0,hostfwd=tcp:127.0.0.1:6001-:6000 -device rtl8139,netdev=n0 -object filter-dump,id=id,netdev=n0,file=./logs/netout -d int -no-reboot -no-shutdown -chardev stdio,id=char0,logfile=./logs/serial.log,signal=off -serial chardev:char0 -drive id=disk,file=./meta/ext2.img,if=none -device ahci,id=ahci -device ide-hd,drive=disk,bus=ahci.0 -m 512M -cdrom ./kernel/myos.iso -s
-#qemu-system-i386 -d int -netdev user,id=n0,hostfwd=tcp:127.0.0.1:6001-:6000 -device rtl8139,netdev=n0 -object filter-dump,id=id,netdev=n0,file=./logs/netout -no-reboot -no-shutdown -chardev stdio,id=char0,logfile=./logs/serial.log,signal=off -serial chardev:char0 -drive id=disk,file=./meta/ext2.img,if=none -device ahci,id=ahci -device ide-hd,drive=disk,bus=ahci.0 -m 512M -cdrom ./kernel/myos.iso -s
-qemu-system-i386 -enable-kvm -netdev user,id=n0,hostfwd=tcp:127.0.0.1:6001-:6000 -device rtl8139,netdev=n0 -object filter-dump,id=id,netdev=n0,file=./logs/netout -no-reboot -no-shutdown -chardev stdio,id=char0,logfile=./logs/serial.log,signal=off -serial chardev:char0 -drive id=disk,file=./meta/ext2.img,if=none -device ahci,id=ahci -device ide-hd,drive=disk,bus=ahci.0 -m 128M -cdrom ./kernel/myos.iso -s
+qemu-system-i386 -enable-kvm -machine kernel_irqchip=off -netdev user,id=n0,hostfwd=tcp:127.0.0.1:6001-:6000 -device rtl8139,netdev=n0 -object filter-dump,id=id,netdev=n0,file=./logs/netout -no-reboot -no-shutdown -chardev stdio,id=char0,logfile=./logs/serial.log,signal=off -serial chardev:char0 -drive id=disk,file=./meta/ext2.img,if=none -device ahci,id=ahci -device ide-hd,drive=disk,bus=ahci.0 -m 256M -cdrom ./kernel/myos.iso -d int -s # 2> interrupts
# Sync the sysroot
cd ./meta/
mkdir ./mount
diff --git a/meta/userland.sh b/meta/userland.sh
index 29ae09b..692b49a 100755
--- a/meta/userland.sh
+++ b/meta/userland.sh
@@ -18,6 +18,9 @@ make -j`nproc` -C ./userland/libppm
make -j`nproc` -C ./userland/rtl8139
make -j`nproc` -C ./userland/smol_http
make -j`nproc` -C ./userland/irc
+make -j`nproc` -C ./userland/nasm-2.16.01
+make -j`nproc` -C ./userland/dns
+make -j`nproc` -C ./userland/to
mkdir sysroot
sudo cp ./userland/rtl8139/rtl8139 ./sysroot/rtl8139
@@ -31,6 +34,9 @@ sudo cp ./userland/test/test ./sysroot/test
sudo cp ./userland/minibox/minibox ./sysroot/minibox
sudo cp ./userland/smol_http/smol_http ./sysroot/smol_http
sudo cp ./userland/irc/irc ./sysroot/irc
+sudo cp ./userland/nasm-2.16.01/nasm ./sysroot/nasm
+sudo cp ./userland/dns/dns ./sysroot/dns
+sudo cp ./userland/to/to ./sysroot/to
cd ./sysroot
rm ./init
diff --git a/userland/libc/Makefile b/userland/libc/Makefile
index 8db5a16..936bde6 100644
--- a/userland/libc/Makefile
+++ b/userland/libc/Makefile
@@ -2,7 +2,7 @@ CC="i686-sb-gcc"
AR="i686-sb-ar"
AS="i686-sb-as"
CFLAGS = -ggdb -ffreestanding -nostdlib -O0 -Wall -Wextra -pedantic -Werror -Wimplicit-fallthrough -I./include/ -static -I../../include/ -Wno-int-conversion -Wno-unused-parameter
-OBJ=crt0.o libc.o malloc/malloc.o pty.o sys/mman/mmap.o sys/mman/munmap.o memset.o assert.o stdio/snprintf.o stdio/vfprintf.o string/memcpy.o string/memcmp.o string/strcmp.o ubsan.o string/strcpy.o isspace.o stdio/puts.o stdio/putchar.o dirent/opendir.o dirent/readdir.o dirent/closedir.o unistd/getopt.o dirent/scandir.o dirent/alphasort.o stdio/printf.o stdio/vdprintf.o stdio/vprintf.o stdio/dprintf.o stdio/vprintf.o string/strlen.o string/strnlen.o stdio/stdin.o stdio/getchar.o stdio/fgetc.o arpa/inet/htons.o arpa/inet/htonl.o stdio/fread.o stdio/fwrite.o stdio/fopen.o stdio/fclose.o stdio/fseek.o ctype/isascii.o stdio/fprintf.o stdlib/atoi.o stdlib/strtol.o ctype/toupper.o ctype/tolower.o string/strcat.o string/strchr.o string/sscanf.o sys/stat/stat.o stdlib/getenv.o string/strrchr.o stdio/ftell.o stdio/tmpfile.o stdio/fgets.o stdio/feof.o stdio/fscanf.o stdio/ungetc.o string/strncmp.o stdio/fputc.o string/strncpy.o stdio/remove.o stdio/ferror.o stdio/fputs.o stdlib/rand.o stdlib/srand.o unistd/getpid.o stdlib/strtoul.o stdio/fflush.o stdlib/abort.o string/strcspn.o time/localtime.o time/time.o time/clock_gettime.o time/gmtime.o time/strftime.o string/strpbrk.o ctype/isdigit.o ctype/isalpha.o ctype/isxdigit.o ctype/ispunct.o stdio/setvbuf.o stdio/fileno.o stdio/putc.o stdio/sprintf.o stdlib/abs.o string/strspn.o stdlib/qsort.o string/memmove.o setjmp/longjmp.o setjmp/setjmp.o libgen/basename.o string/strdup.o string/strndup.o string/strlcpy.o stdlib/atexit.o stdio/open_memstream.o libgen/dirname.o unistd/unlink.o string/strstr.o string/strcasecmp.o string/strncasecmp.o stdlib/mkstemp.o string/strtok.o unistd/execvp.o unistd/_exit.o ctype/isalnum.o time/ctime_r.o stdlib/strtold.o sys/time/gettimeofday.o stdio/fgetpos.o stdio/fsetpos.o ctype/isprint.o stdlib/system.o stdio/tmpnam.o unistd/msleep.o stdlib/atof.o stdlib/strtod.o stdio/rename.o sys/stat/mkdir.o unistd/uptime.o unistd/ftruncate.o sys/socket/recvfrom.o sys/socket/sendto.o signal/kill.o signal/sigaction.o unistd/chdir.o unistd/getcwd.o stdio/getdelim.o stdio/getline.o unistd/isatty.o sys/socket/listen.o stdlib/realpath.o systemcall.o sys/random/randomfill.o fcntl/open.o unistd/write.o unistd/pwrite.o fcntl/open_process.o tb/sb.o tb/sv.o string/memchr.o stdlib/atol.o stdlib/atoll.o stdlib/strtoll.o sys/stat/fstat.o unistd/lseek.o ctype/isupper.o ctype/islower.o ctype/isblank.o ctype/isgraph.o ctype/iscntrl.o math/ldexp.o sys/socket/connect.o sys/socket/setsockopt.o arpa/inet/ntohl.o arpa/inet/ntohs.o netdb/getaddrinfo.o tb/sha1.o sys/socket/getpeername.o
+OBJ=crt0.o libc.o malloc/malloc.o pty.o sys/mman/mmap.o sys/mman/munmap.o memset.o assert.o stdio/snprintf.o stdio/vfprintf.o string/memcpy.o string/memcmp.o string/strcmp.o ubsan.o string/strcpy.o isspace.o stdio/puts.o stdio/putchar.o dirent/opendir.o dirent/readdir.o dirent/closedir.o unistd/getopt.o dirent/scandir.o dirent/alphasort.o stdio/printf.o stdio/vdprintf.o stdio/vprintf.o stdio/dprintf.o stdio/vprintf.o string/strlen.o string/strnlen.o stdio/stdin.o stdio/getchar.o stdio/fgetc.o arpa/inet/htons.o arpa/inet/htonl.o stdio/fread.o stdio/fwrite.o stdio/fopen.o stdio/fclose.o stdio/fseek.o ctype/isascii.o stdio/fprintf.o stdlib/atoi.o stdlib/strtol.o ctype/toupper.o ctype/tolower.o string/strcat.o string/strchr.o string/sscanf.o sys/stat/stat.o stdlib/getenv.o string/strrchr.o stdio/ftell.o stdio/tmpfile.o stdio/fgets.o stdio/feof.o stdio/fscanf.o stdio/ungetc.o string/strncmp.o stdio/fputc.o string/strncpy.o stdio/remove.o stdio/ferror.o stdio/fputs.o stdlib/rand.o stdlib/srand.o unistd/getpid.o stdlib/strtoul.o stdio/fflush.o stdlib/abort.o string/strcspn.o time/localtime.o time/time.o time/clock_gettime.o time/gmtime.o time/strftime.o string/strpbrk.o ctype/isdigit.o ctype/isalpha.o ctype/isxdigit.o ctype/ispunct.o stdio/setvbuf.o stdio/fileno.o stdio/putc.o stdio/sprintf.o stdlib/abs.o string/strspn.o stdlib/qsort.o string/memmove.o setjmp/longjmp.o setjmp/setjmp.o libgen/basename.o string/strdup.o string/strndup.o string/strlcpy.o stdlib/atexit.o stdio/open_memstream.o libgen/dirname.o unistd/unlink.o string/strstr.o string/strcasecmp.o string/strncasecmp.o stdlib/mkstemp.o string/strtok.o unistd/execvp.o unistd/_exit.o ctype/isalnum.o time/ctime_r.o stdlib/strtold.o sys/time/gettimeofday.o stdio/fgetpos.o stdio/fsetpos.o ctype/isprint.o stdlib/system.o stdio/tmpnam.o unistd/msleep.o stdlib/atof.o stdlib/strtod.o stdio/rename.o sys/stat/mkdir.o unistd/uptime.o unistd/ftruncate.o sys/socket/recvfrom.o sys/socket/sendto.o signal/kill.o signal/sigaction.o unistd/chdir.o unistd/getcwd.o stdio/getdelim.o stdio/getline.o unistd/isatty.o sys/socket/listen.o stdlib/realpath.o systemcall.o sys/random/randomfill.o fcntl/open.o unistd/write.o unistd/pwrite.o fcntl/open_process.o tb/sb.o tb/sv.o string/memchr.o stdlib/atol.o stdlib/atoll.o stdlib/strtoll.o sys/stat/fstat.o unistd/lseek.o ctype/isupper.o ctype/islower.o ctype/isblank.o ctype/isgraph.o ctype/iscntrl.o math/ldexp.o sys/socket/connect.o sys/socket/setsockopt.o arpa/inet/ntohl.o arpa/inet/ntohs.o netdb/getaddrinfo.o tb/sha1.o sys/socket/getpeername.o fcntl/fcntl.o
all: libc.a
%.o: %.c
diff --git a/userland/libc/include/stdio.h b/userland/libc/include/stdio.h
index b0bfbd1..aebf086 100644
--- a/userland/libc/include/stdio.h
+++ b/userland/libc/include/stdio.h
@@ -68,7 +68,6 @@ int puts(const char *s);
int brk(void *addr);
void *sbrk(intptr_t increment);
int printf(const char *format, ...);
-int mread(int fd, void *buf, size_t count, int blocking);
int pread(int fd, void *buf, size_t count, size_t offset);
int read(int fd, void *buf, size_t count);
int fork(void);
diff --git a/userland/libc/include/syscall.h b/userland/libc/include/syscall.h
index fee2e43..e1c0b07 100644
--- a/userland/libc/include/syscall.h
+++ b/userland/libc/include/syscall.h
@@ -6,7 +6,7 @@
#include <sys/types.h>
#define SYS_OPEN 0
-#define SYS_MREAD 1
+#define SYS_READ 1
#define SYS_WRITE 2
#define SYS_PREAD 3
#define SYS_PWRITE 4
@@ -46,6 +46,7 @@
#define SYS_CONNECT 38
#define SYS_SETSOCKOPT 39
#define SYS_GETPEERNAME 40
+#define SYS_FCNTL 41
int syscall(uint32_t eax, uint32_t ebx, uint32_t ecx, uint32_t edx,
uint32_t esi, uint32_t edi);
diff --git a/userland/libc/include/time.h b/userland/libc/include/time.h
index 567e9ef..b494f6c 100644
--- a/userland/libc/include/time.h
+++ b/userland/libc/include/time.h
@@ -4,6 +4,7 @@
#include <stddef.h>
#define CLOCK_REALTIME 0
+#define CLOCK_MONOTONIC_RAW 1
struct tm {
int tm_sec;
diff --git a/userland/libc/libc.c b/userland/libc/libc.c
index 8129448..31d8648 100644
--- a/userland/libc/libc.c
+++ b/userland/libc/libc.c
@@ -203,12 +203,8 @@ int pread(int fd, void *buf, size_t count, size_t offset) {
RC_ERRNO(syscall(SYS_PREAD, (u32)&args, 0, 0, 0, 0));
}
-int mread(int fd, void *buf, size_t count, int blocking) {
- RC_ERRNO(syscall(SYS_MREAD, fd, buf, count, blocking, 0));
-}
-
int read(int fd, void *buf, size_t count) {
- return mread(fd, buf, count, 1);
+ RC_ERRNO(syscall(SYS_READ, fd, buf, count, 0, 0));
}
int dup2(int org_fd, int new_fd) {
diff --git a/userland/libgui/Makefile b/userland/libgui/Makefile
index 584fda6..bdd7530 100644
--- a/userland/libgui/Makefile
+++ b/userland/libgui/Makefile
@@ -12,5 +12,9 @@ libgui.o: libgui.c
libgui.a: $(OBJ)
$(AR) rcs libgui.a $^
+install:
+ mkdir -p ../../sysroot/usr/include
+ cp libgui.h ../../sysroot/usr/include/
+
clean:
rm $(OBJ) $(BINS)
diff --git a/userland/libgui/libgui.c b/userland/libgui/libgui.c
index 07edbdd..458ab07 100644
--- a/userland/libgui/libgui.c
+++ b/userland/libgui/libgui.c
@@ -7,6 +7,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
+#include <typedefs.h>
#include <unistd.h>
#define place_pixel_pos(_p, _pos) \
@@ -191,6 +192,27 @@ void GUI_OverwriteFont(GUI_Window *w, uint32_t px, uint32_t py,
}
}
+void GUI_DrawLine(GUI_Window *w, uint32_t sx, uint32_t sy, uint32_t dx,
+ uint32_t dy, uint32_t rgba) {
+ for (;;) {
+ // Bounds checking
+ if (sy * w->sx + sx > w->sy * w->sx)
+ break;
+
+ if (sx >= dx - 1 && sy >= dy - 1) {
+ break;
+ }
+ uint32_t *ptr = w->bitmap_ptr + (sy * w->sx) + sx;
+ *ptr = rgba;
+ if (sx < dx - 1) {
+ sx++;
+ }
+ if (sy < dy - 1) {
+ sy++;
+ }
+ }
+}
+
void GUI_DrawFont(GUI_Window *w, uint32_t px, uint32_t py, const uint32_t c) {
int sx, sy;
sx = 8;
@@ -260,13 +282,20 @@ void GUI_EventLoop(GUI_Window *w, void (*event_handler)(WS_EVENT ev)) {
// window can be given a sufficently large buffer such that buffers
// don't have to be resized if the window is resized.
#define MAX_WINDOW_SIZE (1920 * 1080)
-void GUI_Resize(GUI_Window *w, uint32_t sx, uint32_t sy) {
+int GUI_BufferResize(GUI_Window *w, uint32_t sx, uint32_t sy) {
if (sx * sy > MAX_WINDOW_SIZE) {
- return;
+ return 0;
}
-
w->sx = sx;
w->sy = sy;
+ return 1;
+}
+
+int GUI_SendResize(GUI_Window *w, uint32_t sx, uint32_t sy) {
+ if (!GUI_BufferResize(w, sx, sy)) {
+ return 0;
+ }
+
char buffer[sizeof(uint8_t) + sizeof(uint32_t) * 2];
uint8_t l = 2;
memcpy(buffer, &l, sizeof(l));
@@ -274,6 +303,19 @@ void GUI_Resize(GUI_Window *w, uint32_t sx, uint32_t sy) {
memcpy(buffer + sizeof(uint8_t) + sizeof(uint32_t), &sy, sizeof(sy));
int len = sizeof(uint8_t) + sizeof(uint32_t) * 2;
write(w->ws_socket, buffer, len);
+ return 1;
+}
+
+void GUI_DrawRectangle(GUI_Window *w, uint32_t x, uint32_t y, uint32_t sx,
+ uint32_t sy, uint32_t color) {
+ for (u32 l = y; l < y + sy; l++) {
+ for (u32 s = x; s < x + sx; s++) {
+ if(l*w->sx + s > w->sx*w->sy) {
+ break;
+ }
+ w->bitmap_ptr[l * w->sx + s] = color;
+ }
+ }
}
GUI_Window *GUI_CreateWindow(uint32_t x, uint32_t y, uint32_t sx, uint32_t sy) {
diff --git a/userland/libgui/libgui.h b/userland/libgui/libgui.h
index 1c3ac95..85e1dda 100644
--- a/userland/libgui/libgui.h
+++ b/userland/libgui/libgui.h
@@ -7,6 +7,10 @@
#define WINDOWSERVER_EVENT_WINDOW_EXIT 1
#define WINDOWSERVER_EVENT_WINDOW_RESIZE 2
+#define EV_SHIFT(_mode) ((_mode) & (1 << 0))
+#define EV_ALT(_mode) ((_mode) & (1 << 1))
+#define EV_CTRL(_mode) ((_mode) & (1 << 2))
+
typedef struct {
int ws_socket;
int bitmap_fd;
@@ -38,6 +42,13 @@ void GUI_UpdateWindow(GUI_Window *w);
void GUI_OverwriteFont(GUI_Window *w, uint32_t px, uint32_t py,
const uint32_t color);
void GUI_ClearScreen(GUI_Window *w, uint32_t color);
+void GUI_DrawRectangle(GUI_Window *w, uint32_t x, uint32_t y, uint32_t sx,
+ uint32_t sy, uint32_t color);
void GUI_EventLoop(GUI_Window *w, void (*event_handler)(WS_EVENT ev));
-void GUI_Resize(GUI_Window *w, uint32_t sx, uint32_t sy);
+int GUI_BufferResize(GUI_Window *w, uint32_t sx, uint32_t sy);
+int GUI_SendResize(GUI_Window *w, uint32_t sx, uint32_t sy);
+void GUI_DrawLine(GUI_Window *w, uint32_t sx, uint32_t sy, uint32_t dx,
+ uint32_t dy, uint32_t rgba);
+void GUI_DrawRectangle(GUI_Window *w, uint32_t x, uint32_t y, uint32_t sx,
+ uint32_t sy, uint32_t color);
#endif
diff --git a/userland/libppm/ppm.c b/userland/libppm/ppm.c
index 9013e27..ec70a6d 100644
--- a/userland/libppm/ppm.c
+++ b/userland/libppm/ppm.c
@@ -27,13 +27,19 @@ int parse_ppm_header(FILE *fp, struct PPM_IMAGE *img) {
char c1;
char c2;
fscanf(fp, "%c%c\n%d %d\n%d", &c1, &c2, &width, &height, &maxval);
- if ('P' != c1)
+ if ('P' != c1) {
+ printf("c1: %c\n", c1);
return 0;
- if (!isdigit(c2))
+ }
+ if (!isdigit(c2)) {
+ printf("c2: %c\n", c2);
return 0;
+ }
img->version = c2 - '0';
- if (3 != img->version && 6 != img->version)
+ if (3 != img->version && 6 != img->version) {
+ printf("Not handeld version\n");
return 0;
+ }
if (maxval > 255) {
printf("maxval is: %d\n", maxval);
return 0;
@@ -42,8 +48,7 @@ int parse_ppm_header(FILE *fp, struct PPM_IMAGE *img) {
img->height = height;
img->maxval = maxval;
img->file_location = ftell(fp);
- printf("width: %d\n", img->width);
- printf("height: %d\n", img->height);
+ img->file_location++;
return 1;
}
@@ -59,26 +64,25 @@ int load_ppm6_file(FILE *fp, const struct PPM_IMAGE *img, uint32_t buf_width,
int cx = 0;
int cy = 0;
const int n_pixels = img->width * img->height;
- printf("malloc\n");
uint8_t *rgb = malloc(3 * n_pixels);
- printf("end malloc\n");
- printf("fread");
const int rc = fread(rgb, 3, n_pixels, fp);
if (0 == rc)
return 0;
- printf("end fread");
uint32_t *p = rgb;
u32 buf_size = buf_height * buf_width;
if (1 == modifier) {
- for (int i = 0; i < rc && i < buf_size; i++, p = ((uint8_t *)p) + 3) {
+ int c = 0;
+ for (int i = 0; i < rc && i < buf_size; i++, c += 3) {
if (cx > buf_width) {
i--;
} else {
- uint32_t v = *p;
+ u8 red = rgb[c];
+ u8 green = rgb[c + 1];
+ u8 blue = rgb[c + 2];
buffer[cy * buf_width + cx] =
- ((v & 0xFF) << 16) | ((v & 0xFF00)) | ((v & 0xFF0000) >> 16);
+ (red << (8 * 2)) | (green << (8 * 1)) | (blue << (8 * 0));
}
cx++;
if (cx == img->width) {
diff --git a/userland/terminal/term.c b/userland/terminal/term.c
index ced3a60..246474f 100644
--- a/userland/terminal/term.c
+++ b/userland/terminal/term.c
@@ -228,12 +228,15 @@ void handle_escape_codes_or_print(char *buffer, int len) {
}
void terminal_resize(uint32_t sx, uint32_t sy) {
- GUI_Resize(global_w, sx, sy);
+ assert(GUI_BufferResize(global_w, sx, sy));
for (int y = 0; y < sy; y += 8) {
- for (int x = 0; x < sx; x += 8) {
+ int x = 0;
+ for (; x < sx; x += 8) {
GUI_DrawFont(global_w, x, y, terminal_char_buffer[y / 8][x / 8]);
}
+ GUI_DrawLine(global_w, x, y, sx, y, 0xFF00FF);
}
+ assert(GUI_SendResize(global_w, sx, sy));
}
void run() {
diff --git a/userland/test/linux.sh b/userland/test/linux.sh
index d40d6cc..1cb1668 100755
--- a/userland/test/linux.sh
+++ b/userland/test/linux.sh
@@ -1,4 +1,4 @@
#!/bin/bash
-gcc -DLINUX test.c -o ./local/a.out
+gcc -DLINUX test.c -g -o ./local/a.out || exit
cd local
-./a.out
+valgrind ./a.out
diff --git a/userland/test/test.c b/userland/test/test.c
index 33361a5..1bebee7 100644
--- a/userland/test/test.c
+++ b/userland/test/test.c
@@ -1,13 +1,14 @@
#include <assert.h>
#include <fcntl.h>
-//#include <json.h>
#include <ctype.h>
#include <errno.h>
+#include <limits.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <tb/sha1.h>
#if 1
void dbgln(const char *fmt) {
@@ -53,7 +54,6 @@ void isx_test() {
void malloc_test(void) {
dbgln("malloc TEST");
for (int j = 0; j < 100; j++) {
- // printf("j : %x\n", j);
uint8_t *t = malloc(400 + j);
memset(t, 0x43 + (j % 10), 400 + j);
uint8_t *p = malloc(900 + j);
@@ -269,6 +269,7 @@ void strncpy_test(void) {
dbgln("strncpy TEST PASSED");
}
+#ifndef linux
void strlcpy_test(void) {
dbgln("strlcpy TEST");
{
@@ -279,6 +280,7 @@ void strlcpy_test(void) {
}
dbgln("strlcpy TEST PASSED");
}
+#endif
void strcat_test(void) {
dbgln("strcat TEST");
@@ -429,7 +431,7 @@ void strcasecmp_test(void) {
{
assert(0 == strcasecmp("foobar", "FOObar"));
assert(0 == strcasecmp("foobar", "foobar"));
- assert(6 == strcasecmp("foobar", "bar"));
+ assert(0 < strcasecmp("foobar", "bar"));
}
dbgln("strcasecmp TEST PASSED");
}
@@ -458,12 +460,14 @@ void strstr_test(void) {
void strtok_test(void) {
dbgln("strtok TEST");
{
- char *s = "hello,world,goodbye";
+ char s[4096];
+ strcpy(s, "hello,world,goodbye");
assert(0 == strcmp(strtok(s, ","), "hello"));
assert(0 == strcmp(strtok(NULL, ","), "world"));
assert(0 == strcmp(strtok(NULL, ","), "goodbye"));
assert(NULL == strtok(NULL, ","));
- char *s2 = "hello,,world,,goodbye,test";
+ char s2[4096];
+ strcpy(s2, "hello,,world,,goodbye,test");
assert(0 == strcmp(strtok(s2, ",,"), "hello"));
assert(0 == strcmp(strtok(NULL, ",,"), "world"));
assert(0 == strcmp(strtok(NULL, ","), "goodbye"));
@@ -660,6 +664,7 @@ void qsort_test(void) {
dbgln("qsort TEST PASSED");
}
+#ifndef linux
void basename_test(void) {
dbgln("basename TEST");
{
@@ -690,7 +695,9 @@ void basename_test(void) {
}
dbgln("basename TEST PASSED");
}
+#endif
+#ifndef linux
void dirname_test(void) {
dbgln("dirname TEST");
{
@@ -710,6 +717,7 @@ void dirname_test(void) {
}
dbgln("dirname TEST PASSED");
}
+#endif
void getline_test(void) {
dbgln("getline TEST");
@@ -773,6 +781,7 @@ void memchr_test(void) {
dbgln("memchr TEST PASSED");
}
+#ifndef linux
void randomfill_test(void) {
dbgln("randomfill TEST");
{
@@ -792,6 +801,49 @@ void randomfill_test(void) {
}
dbgln("randomfill TEST PASSED");
}
+#endif
+
+void fs_test() {
+ dbgln("filesystem TEST");
+ {
+ u8 file_digest[SHA1_LEN];
+ u8 direct_digest[SHA1_LEN];
+ SHA1_CTX ctx;
+ char buffer[4096];
+ {
+ SHA1_Init(&ctx);
+ int fd = open("hashfile", O_RDWR | O_CREAT);
+ assert(-1 != fd);
+
+ memset(buffer, 'A', 4096);
+
+ for (int i = 0; i < 2; i++) {
+ write(fd, buffer, 4096);
+ }
+
+ memset(buffer, 0, 4096);
+ lseek(fd, 0, SEEK_SET);
+
+ for (int i = 0; i < 2; i++) {
+ int rc = read(fd, buffer, 4096);
+ assert(4096 == rc);
+ SHA1_Update(&ctx, buffer, 4096);
+ }
+ SHA1_Final(&ctx, file_digest);
+ close(fd);
+ }
+ {
+ SHA1_Init(&ctx);
+ memset(buffer, 'A', 4096);
+ for (int i = 0; i < 2; i++) {
+ SHA1_Update(&ctx, buffer, 4096);
+ }
+ SHA1_Final(&ctx, direct_digest);
+ }
+ assert(0 == memcmp(file_digest, direct_digest, SHA1_LEN));
+ }
+ dbgln("filesystem TEST PASSED");
+}
int main(void) {
dbgln("START");
@@ -810,7 +862,9 @@ int main(void) {
strpbrk_test();
strcpy_test();
strncpy_test();
+#ifndef linux
strlcpy_test();
+#endif
strcat_test();
strchr_test();
strrchr_test();
@@ -829,12 +883,17 @@ int main(void) {
// fseek_test();
printf_test();
qsort_test();
+#ifndef linux
basename_test();
dirname_test();
+#endif
getline_test();
realpath_test();
memchr_test();
+ fs_test();
+#ifndef linux
randomfill_test();
+#endif
// TODO: Add mkstemp
return 0;
}