aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-02-23 06:31:47 +0100
committerCharles <sircharlesaze@gmail.com>2020-02-23 06:31:47 +0100
commit28424105e255f0a4c887b6e6a83afd6dce372709 (patch)
tree98a3665a7643c7f9b0bf2d75be1ff07e3b7fb647
parentfcc8ce8503f42980e6e8ed390363c8e8dc961363 (diff)
downloadlibasm-28424105e255f0a4c887b6e6a83afd6dce372709.tar.gz
libasm-28424105e255f0a4c887b6e6a83afd6dce372709.tar.bz2
libasm-28424105e255f0a4c887b6e6a83afd6dce372709.zip
Added ft_read.s ft_write.s error handling
-rw-r--r--ft_read.s18
-rw-r--r--ft_write.s34
2 files changed, 42 insertions, 10 deletions
diff --git a/ft_read.s b/ft_read.s
index 564f2fc..f65ade3 100644
--- a/ft_read.s
+++ b/ft_read.s
@@ -12,6 +12,10 @@
global _ft_read
+%define F_GETFD 1
+%define SYSCALL_READ 0x2000003
+%define SYSCALL_FCNTL 0x200005c
+
; int ft_read(int, void*, size_t);
_ft_read:
cmp rdx, 0
@@ -20,7 +24,19 @@ _ft_read:
jl FT_READ_ERROR
cmp rsi, 0
je FT_READ_ERROR
- mov rax, 0x2000003
+
+ push rdx
+ push rsi
+ xor rsi, rsi
+ mov esi, F_GETFD
+ mov rax, SYSCALL_FCNTL
+ syscall
+ pop rsi
+ pop rdx
+ cmp eax, 0
+ jne FT_READ_ERROR
+
+ mov rax, SYSCALL_READ
syscall
ret
FT_READ_ERROR:
diff --git a/ft_write.s b/ft_write.s
index 13f4c6a..62616c5 100644
--- a/ft_write.s
+++ b/ft_write.s
@@ -12,20 +12,36 @@
global _ft_write
+%define F_GETFD 1
+%define SYSCALL_WRITE 0x2000004
+%define SYSCALL_FCNTL 0x200005c
+
; int ft_write(int rdi, const void *rsi, size_t rdx);
_ft_write:
- cmp rdx, 0
- je FT_WRITE_NO_SIZE
- cmp rdi, 0
- jl FT_WRITE_ERROR
- cmp rsi, 0
- je FT_WRITE_ERROR
- mov rax, 0x2000004
+ cmp rdx, 0
+ je FT_WRITE_NO_SIZE
+ cmp rdi, 0
+ jl FT_WRITE_ERROR ; fd < 0
+ cmp rsi, 0
+ je FT_WRITE_ERROR ; buf == NULL
+
+ push rdx
+ push rsi
+ xor rsi, rsi
+ mov esi, F_GETFD
+ mov rax, SYSCALL_FCNTL
+ syscall
+ pop rsi
+ pop rdx
+ cmp eax, 0
+ jne FT_WRITE_ERROR
+
+ mov rax, SYSCALL_WRITE
syscall
ret
FT_WRITE_ERROR:
- mov rax, -1
+ mov rax, -1
ret
FT_WRITE_NO_SIZE:
- mov rax, 0
+ mov rax, 0
ret