100 lines
2.5 KiB
NASM
100 lines
2.5 KiB
NASM
%include "src/constants.asm"
|
|
|
|
extern umask_get
|
|
|
|
section .rodata
|
|
; Open flags
|
|
O_ACCMODE equ 00000003q
|
|
O_RDONLY equ 00000000q
|
|
O_WRONLY equ 00000001q
|
|
O_RDWR equ 00000002q
|
|
O_CREAT equ 00000100q ;create if not exist
|
|
O_EXCL equ 00000200q ;fail if file exists and O_EXCL+O_CREAT set
|
|
O_NOCTTY equ 00000400q
|
|
O_TRUNC equ 00001000q
|
|
O_APPEND equ 00002000q
|
|
O_NONBLOCK equ 00004000q
|
|
O_DSYNC equ 00010000q
|
|
FASYNC equ 00020000q
|
|
O_DIRECT equ 00040000q
|
|
O_LARGEFILE equ 00100000q
|
|
O_DIRECTORY equ 00200000q
|
|
O_NOFOLLOW equ 00400000q
|
|
O_NOATIME equ 01000000q
|
|
O_CLOEXEC equ 02000000q
|
|
__O_SYNC equ 04000000q
|
|
O_SYNC equ (__O_SYNC | O_DSYNC)
|
|
O_PATH equ 01000000q
|
|
__O_TMPFILE equ 02000000q
|
|
O_TMPFILE equ (__O_TMPFILE | O_DIRECTORY)
|
|
O_NDELAY equ O_NONBLOCK
|
|
; Permission flags
|
|
S_IXOTH equ 00001q ;o=x
|
|
S_IWOTH equ 00002q ;o=w
|
|
S_IROTH equ 00004q ;o=r
|
|
S_IRWXO equ 00007q ;o=rwx
|
|
S_IXGRP equ 00010q ;g=x
|
|
S_IWGRP equ 00020q ;g=w
|
|
S_IRGRP equ 00040q ;g=r
|
|
S_IRWXG equ 00070q ;g=rwx
|
|
S_IXUSR equ 00100q ;u=x
|
|
S_IWUSR equ 00200q ;u=w
|
|
S_IRUSR equ 00400q ;u=r
|
|
S_IRWXU equ 00700q ;u=rwx
|
|
S_ISVIX equ 0001000q ;sticky bit
|
|
S_ISGID equ 0002000q ;set-group-ID bit
|
|
S_ISUID equ 0004000q ;set-user-ID bit
|
|
|
|
section .bss
|
|
|
|
section .text
|
|
global fopen
|
|
global fclose
|
|
global fexist
|
|
|
|
;----- fopen(*file[], char mode) -----;
|
|
; Opens a file
|
|
; Return value: Pointer to opened file pointer, 0 (EOS) otherwise.
|
|
; Possible modes:
|
|
; 'r' Read-only, file must exist
|
|
; 'w' Write-only. Creates empty file or truncates an existing file
|
|
; 'a' Append. Creates file if it does not exist
|
|
; 'R' Read+write, file must exist
|
|
; 'W' Read+write. Creates empty file or truncates an existing file
|
|
; 'A' Read+append. Creates file if it does not exist
|
|
; <!> Invalid mode will also return 0 (EOS)
|
|
; Used registers:
|
|
; rax* (ret)
|
|
; rdi (arg) Pointer to string holding (path+)file name
|
|
; rsi Mode to open the file with (see description above)
|
|
fopen:
|
|
ret
|
|
|
|
;----- fclose(file) -----;
|
|
; Closes an opened file
|
|
; Return value: 0 if file closed. Negative error number if an error occured
|
|
; Used registers:
|
|
; rax* (ret)
|
|
; rdi (arg) Pointer to opened file
|
|
fclose:
|
|
cmp rdi, 3
|
|
jl .invalid_fd ;disallow closing stdin,stdout,stderr
|
|
mov rax, NR_close
|
|
syscall
|
|
jmp .quit
|
|
|
|
.invalid_fd:
|
|
mov rax, -EINVAL
|
|
|
|
.quit:
|
|
ret
|
|
|
|
;----- fexist(*file[]) -----;
|
|
; Checks if given file exists (attempts to open the file)
|
|
; Return value: 0- File closed succesfully. -errno (negative error number) if an error occured
|
|
; Used registers:
|
|
; rax* (ret)
|
|
; rdi (arg) Pointer to string holding (path+)file name
|
|
fexist:
|
|
ret
|