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