Vérifier l'existence d'une ressource (dossier ou fichier)
Introduction - Version statique
Ici, c'est un peu plus simple, nous allons 'simplement' vérifier qu'une ressource existe (fichier ou dossier, indépendamment de leurs différences).
D'abord de façon statique : le chemin de la ressource à vérifier est inscrit directement dans le programme.
Ecrivez le programme checkpath.asm suivant
section .data
path db '/usr/local/sbin/pkg', 0 ; Define the path to check
path_exists_msg db 'Le chemin existe.', 10
path_exists_len equ $ - path_exists_msg
path_not_exists_msg db 'Le chemin n'existe pas.', 10
path_not_exists_len equ $ - path_not_exists_msg
section .bss
statbuf resb 144 ; Buffer for stat system call
section .text
global _start
_start:
; Call 'stat' to check if the path exists
mov rax, 188 ; syscall number for 'stat' in FreeBSD
lea rdi, [path] ; Address of the path
lea rsi, [statbuf] ; Address of the stat buffer
syscall
; Check if stat succeeded
cmp rax, 0
je path_exists
; If stat fails, the path does not exist
mov rax, 4 ; syscall number for 'write'
mov rdi, 1 ; stdout
mov rsi, path_not_exists_msg
mov rdx, path_not_exists_len
syscall
jmp exit
path_exists:
mov rax, 4 ; syscall number for 'write'
mov rdi, 1 ; stdout
mov rsi, path_exists_msg
mov rdx, path_exists_len
syscall
exit:
mov rax, 1 ; syscall number for 'exit'
xor rdi, rdi ; Exit code 0
syscall
Assembler
nasm -f elf64 checkpath.asm
Linker
ld checkpath.o -o checkpath
Lancer le programme
./checkpath
Version dynamique
A présent, de façon dynamique : le programme doit demander à l'utilisateur d'entrer le chemin d'une ressource.
L'utilisateur entre un chemin absolu, et le programme doit déterminer si ce qui est pointé existe ou non et répondre.
Ecrivez le programme checkpath.asm suivant
section .data
prompt_msg db 'Entrez le chemin du fichier ou du dossier : ', 0
prompt_len equ $ - prompt_msg
path_exists_msg db 'Le chemin existe.', 10
path_exists_len equ $ - path_exists_msg
path_not_exists_msg db 'Le chemin n'existe pas.', 10
path_not_exists_len equ $ - path_not_exists_msg
buffer_size equ 4096
section .bss
input_path resb buffer_size
statbuf resb 144
section .text
global _start
_start:
; Affiche le message de prompt
mov rax, 4 ; syscall number pour 'write'
mov rdi, 1 ; stdout
mov rsi, prompt_msg
mov rdx, prompt_len
syscall
; Lire le chemin du fichier de l'utilisateur
mov rax, 3 ; syscall number pour 'read'
mov rdi, 0 ; stdin
lea rsi, [input_path]
mov rdx, buffer_size
syscall
; Calculer la longueur de l'entrée et supprimer le caractère de nouvelle ligne
mov rdi, rax
dec rdi
mov byte [rsi+rdi], 0
; Appel de 'stat' pour vérifier si le chemin existe
mov rax, 188 ; syscall number pour 'stat'
lea rdi, [input_path]
lea rsi, [statbuf]
syscall
; Vérifier si stat a réussi
cmp rax, 0
je path_exists
; Si stat échoue, cela signifie que le chemin n'existe pas
mov rax, 4
mov rdi, 1
mov rsi, path_not_exists_msg
mov rdx, path_not_exists_len
syscall
jmp exit
path_exists:
mov rax, 4
mov rdi, 1
mov rsi, path_exists_msg
mov rdx, path_exists_len
syscall
exit:
mov rax, 1 ; syscall number pour 'exit'
xor rdi, rdi ; Code de sortie 0
syscall
↑ Haut de page