Para trabajar directamente con directorios (crear, eliminar, renombrar, etc.) vamos a utilizar los valores de las constantes de las llamadas al sistema (system call numbers).
Las constantes básicas para trabajar con los directorios son:
%define __NR_mkdir 39 %define __NR_rmdir 40
Creando un directorio
Para crear un directorio vamos a utilizar la llamada al sistema __NR_mkdir con el valor decimal 39.
Siguiendo el prototipo de la función mkdir en C, tomamos en cuenta dos parámetros:
int mkdir( const char *pathname, mode_t mode );
Esto quiere decir que haremos la llamada al sistema, especificamos el nombre y los permisos que deseemos:
; ; Constantes ; %define __NR_exit 1 %define __NR_mkdir 39 section .data Carpeta db 'Fotografias', 0 section .text global main main: ; Crear un directorio mov eax, __NR_mkdir mov ebx, Carpeta mov ecx, 0755q int 80h ; Finalizamos el programa mov eax, __NR_exit xor ebx, ebx int 80h
Importante: Los valores que asignan los permisos a los archivos o directorios se encuentran en base octal, es por esa razón que se debe especificar la base con la letra q, ya que al no hacerlo, el valor 0755 se tomaría como decimal y no asignará los permisos adecuadamente.
$ nasm -f elf creadir.S $ gcc creadir.o -o creadir $ ./creadir
Eliminar un directorio
Siguiendo el prototipo de la función rmdir en C, vemos que solo cuenta con un parámetro:
int rmdir( const char *pathname );
Tan solo tenemos que especificar el nombre del directorio a eliminar.
; ; Constantes ; %define __NR_exit 1 %define __NR_rmdir 40 section .data Carpeta db 'Fotografias', 0 section .text global main main: ; Eliminar el directorio mov eax, __NR_rmdir mov ebx, Carpeta int 80h ; Finalizamos el programa mov eax, __NR_exit xor ebx, ebx int 80h
$ nasm -f elf eliminadir.S $ gcc eliminadir.o -o eliminadir $ ./eliminadir
Agradecimiento
Gracias a Miguel @halowin3 por la idea y ayuda.