diff --git a/main.S b/main.S index 8a35e38..73ae625 100644 --- a/main.S +++ b/main.S @@ -13,16 +13,22 @@ #define PORT 20335 .data -greeting: .ascii "Socket test!\n" +greeting: + .ascii "Welcome to the minimalistic echo server!\n" + .ascii "It is written in pure assembly, and it don't use the standard library, only raw system calls.\n" + .ascii "\n" + .ascii "To exit, press Ctrl+C, as usual\n" + .ascii "\n" .set greeting_len, .-greeting -bye: .ascii "Sockets tested!\n" -.set bye_len, .-bye +message: .ascii "Client connected\n" +.set message_len, .-message errstr: .ascii "Error happened\n" .set errstr_len, .-errstr s: .quad 0 +s2: .quad 0 true_val: .quad 1 .set true_val_len, .-true_val @@ -39,7 +45,7 @@ myaddr: .text .global _start _start: - movq $STDERR, %rdi + movq $STDOUT, %rdi movq $greeting, %rsi movq $greeting_len, %rdx call write_buf @@ -60,24 +66,25 @@ _start: movq $true_val, %r10 movq $true_val_len, %r8 syscall - test %rax, %rax - jnz error + test %rax, %rax + jnz error movq $__NR_bind, %rax movq s, %rdi movq $myaddr, %rsi movq $myaddr_len, %rdx syscall - test %rax, %rax - jnz error + test %rax, %rax + jnz error movq $__NR_listen, %rax movq s, %rdi movq $8, %rsi syscall - test %rax, %rax - jnz error + test %rax, %rax + jnz error +loop: movq $__NR_accept, %rax movq s, %rdi movq $0, %rsi @@ -86,34 +93,63 @@ _start: syscall cmp $-1, %rax jz error + movq %rax, s2 - test %rax, %rax - jz error - - movq %rax, %rdi - movq $STDOUT, %rsi - call passthru - - movq $STDERR, %rdi - movq $bye, %rsi - movq $bye_len, %rdx + movq $STDOUT, %rdi + movq $message, %rsi + movq $message_len, %rdx call write_buf + movq $__NR_fork, %rax + syscall /* fork! */ + cmp $-1, %rax + jz error + test %rax, %rax + jz child +/* we're in the parent if we reach this line */ + + movq $__NR_close, %rax + movq s2, %rdi + syscall + test %rax, %rax + jnz error + jmp loop + exit: movq $__NR_close, %rax movq s, %rdi syscall + test %rax, %rax + jnz error -_exit: movq $__NR_exit, %rax movq $0, %rdi syscall - movq $0, 0 +/* this line is unreachable */ error: movq $__NR_write, %rax - movq $STDERR, %rdi + movq $STDOUT, %rdi movq $errstr, %rsi movq $errstr_len, %rdx syscall - jmp _exit + + movq $__NR_exit, %rax + movq $0, %rdi + syscall +/* this line is unreachable */ + +child: +/* we're in the child if we reach this line */ + movq s2, %rdi + movq s2, %rsi + call passthru + + movq $__NR_close, %rax + movq s2, %rdi + syscall + + movq $__NR_exit, %rax + movq $0, %rdi + syscall +/* this line is unreachable */