Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions labels/debug.asm
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,9 @@ dbg_sighandler_success:
cmp r10, 2
je .sigint

cmp r10, 1
je .sighup

je dbg_skip ; if its something unexpected, just skip

.sigchld:
Expand All @@ -247,6 +250,10 @@ dbg_sighandler_success:
AAPPEND r9, str_sighanlder_sigint
jmp .end

.sighup:
AAPPEND r9, str_sighanlder_sighup
jmp .end

.end:
AAPPEND r9, str_success_sighandler_p2

Expand Down
157 changes: 5 additions & 152 deletions labels/initialsetup.asm
Original file line number Diff line number Diff line change
Expand Up @@ -5,73 +5,6 @@ extern inet_pton ; to parse the interface
section .data
env_path db ".env", 0

; keys & defaults if no .env is provided or found
key_bindaddr db "BIND_ADDRESS", 0
default_bindaddr db "0.0.0.0", 0

key_port db "PORT", 0
default_port db "8080", 0

key_docroot db "DOCUMENT_ROOT", 0 ; document root, no trailing slash !
default_docroot db ".", 0

key_index db "INDEX_FILE", 0 ; default file if a directory is fetched (eg '/' becomes internally '/index.txt')
default_index db "index.html", 0

key_maxconns db "MAX_REQUESTS", 0 ; max concurrent requests (and threads)
default_maxconns db "20", 0

key_name db "SERVER_NAME", 0 ; server name provided in the response headers
default_name db "NASMServer/", 0 ; version will be appended later

key_authuser db "AUTH_USER", 0
default_authuser db "", 0

key_authpass db "AUTH_PASSWORD", 0
default_authpass db "", 0

key_authrealm db "AUTH_REALM", 0
default_authrealm db "None", 0

key_servedots db "SERVE_DOTS", 0
default_servedots db "false", 0

key_maxage db "MAX_AGE", 0
default_maxage db "600", 0

key_logfile db "LOG_FILE", 0
default_logfile db "", 0

key_use_xri db "USE_X_REAL_IP", 0 ; if we should use 'X-Real-IP' to display the IP address in the logs
default_use_xri db "false", 0

key_use_chroot db "USE_CHROOT", 0
default_use_chroot db "true", 0

key_noperms db "DROP_PRIVILEGES", 0
default_noperms db "true", 0

key_loglevel db "LOG_LEVEL", 0
default_loglevel db "info", 0

key_linger_to db "LINGER_TIMEOUT", 0
default_linger_to db "5", 0

; errordocs files, relatively to the document_root (empty = none)
; start them with a slash !

key_errordoc_405 db "ERRORDOC_405", 0
key_errordoc_404 db "ERRORDOC_404", 0
key_errordoc_403 db "ERRORDOC_403", 0
key_errordoc_401 db "ERRORDOC_401", 0
key_errordoc_400 db "ERRORDOC_400", 0

default_errordoc_405 db "", 0
default_errordoc_404 db "", 0
default_errordoc_403 db "", 0
default_errordoc_401 db "", 0
default_errordoc_400 db "", 0

section .bss
; system
current_uid resd 1 ; Storing the current uid to check for root
Expand Down Expand Up @@ -195,74 +128,25 @@ initial_setup:
mov r10, rax
ITOA r10, current_pid_str, rcx

.load_env:
; load all config from .env (or fall back to defaults)
call load_config ; from labels/envreload.asm
mov byte [rel first_load], 0

ENV_DEFAULT env_path_buf, key_docroot, document_root, 129, default_docroot
ENV_DEFAULT env_path_buf, key_index, index_file, 129, default_index
ENV_DEFAULT env_path_buf, key_name, server_name, 129, server_w_ver
ENV_DEFAULT env_path_buf, key_authuser, auth_username, 129, default_authuser
ENV_DEFAULT env_path_buf, key_authpass, auth_password, 129, default_authpass
ENV_DEFAULT env_path_buf, key_authrealm, auth_realm, 129, default_authrealm

ENV_DEFAULT env_path_buf, key_errordoc_405, errordoc_405, 129, default_errordoc_405
ENV_DEFAULT env_path_buf, key_errordoc_404, errordoc_404, 129, default_errordoc_404
ENV_DEFAULT env_path_buf, key_errordoc_403, errordoc_403, 129, default_errordoc_403
ENV_DEFAULT env_path_buf, key_errordoc_401, errordoc_401, 129, default_errordoc_401
ENV_DEFAULT env_path_buf, key_errordoc_400, errordoc_400, 129, default_errordoc_400

; port: read as ascii, then convert to integer
ENV_DEFAULT env_path_buf, key_port, word_str_buf, 8, default_port
ATOI word_str_buf, rax
mov word [rel port], ax

ENV_DEFAULT env_path_buf, key_maxconns, word_str_buf, 8, default_maxconns ; reuse word_str_buf, we're done with it
ATOI word_str_buf, rax
mov word [rel max_requests], ax

ENV_DEFAULT env_path_buf, key_maxage, max_age_str, 12, default_maxage
ATOI max_age_str, rax
mov dword [rel max_age], eax

ENV_DEFAULT env_path_buf, key_linger_to, max_age_str, 12, default_linger_to
ATOI max_age_str, rax
mov dword [rel linger_to], eax

ENV_DEFAULT env_path_buf, key_servedots, serve_dots_str, 5, default_servedots
BOOL_FLAG serve_dots_str, serve_dots

ENV_DEFAULT env_path_buf, key_use_xri, use_xri_str, 5, default_use_xri
BOOL_FLAG use_xri_str, use_xri

ENV_DEFAULT env_path_buf, key_use_chroot, use_chroot_str, 5, default_use_chroot
BOOL_FLAG use_chroot_str, use_chroot

ENV_DEFAULT env_path_buf, key_noperms, be_nobody_str, 5, default_noperms
BOOL_FLAG be_nobody_str, be_nobody

; process the log level
ENV_DEFAULT env_path_buf, key_loglevel, str_level_str, 6, default_loglevel
call .parse_str_level

; open the log file
ENV_DEFAULT env_path_buf, key_logfile, str_file_path, 129, default_logfile
call .open_logfile

ENV_DEFAULT env_path_buf, key_bindaddr, bind_addr_str, 16, default_bindaddr

; build sockaddr from the now-loaded port/interface
movzx eax, word [rel port]
xchg al, ah ; htons(), swap bytes for big-endian
xchg al, ah ; htons(), swap bytes for big-endian
mov word [rel sockaddr + 2], ax

; inet_pton(af, src, dst)
mov rdi, 2 ; AF_INET (ipv4)
mov rdi, 2 ; AF_INET (ipv4)
lea rsi, [rel bind_addr_str]
lea rdx, [rel interface]
call inet_pton

cmp rax, 0
jle .bad_bind_addr ; 0 = invalid format, -1 = unsupported af
jle .bad_bind_addr ; 0 = invalid format, -1 = unsupported af

mov eax, [rel interface]
mov dword [rel sockaddr + 4], eax
Expand Down Expand Up @@ -303,37 +187,6 @@ initial_setup:
.str_file_end:
ret ; open_logfile len

.parse_str_level:
lea rax, [rel str_level_str]

; "debug"
cmp dword [rax], 'debu'
jne .check_none

cmp byte [rax+4], 'g'
jne .check_none

mov byte [rel str_level], 2

jmp .str_level_end

.check_none:
; "none"
cmp dword [rax], 'none'
jne .check_info

mov byte [rel str_level], 0

jmp .str_level_end

.check_info:
; "info" or anything unrecognized = 0
mov byte [rel str_level], 1
ret

.str_level_end:
ret ; .parse_str_level return point

.failed_read_file:
LOG_ERR str_fail_read_env, str_fail_read_env_len
EXIT 1
Expand Down
Loading
Loading