/* * Javier Abellán. 28 de Marzo de 2003 * * Programa de prueba de la función lstat() * * 1. Crea un fichero, un link, un link simbólico y un directorio. * * 2. Utilizando la función lstat() comprueba un nombre de fichero que * no existe sacando por pantalla dicha información. * * 3. Utilizando la función lstat() comprueba el fichero, links y directorio * creados anteriormente, indicando por pantalla de que tipo es cada uno. */ #include #include /* * Nombres del directorio, fichero, link y link simbólico que vamos a utilizar. * O-5557-AD es la matrícula del coche de un amigo mio que es tonto y que * además 5557 es un número primo. Suelo usarlo para crear ficheros que no * existen, aunque debería usar funciones del estilo tempnam() */ #define NO_EXISTE "NoExisteO5557AD" #define FICHERO "FichO5557AD" #define DIRECTORIO "DirO5557AD" #define LINK "LinkO5557AD" #define LINK_SIMBOLICO "LinkSimbolicoO5557AD" /* * Prototipo de la función escribeInfoFichero */ void escribeInfoFichero (char *nombreFichero); /* * Programa principal. * Crea un directorio, un fichero, un link y un link simbólico. * Llama, para cada uno de ellos y para un nombre de fichero que no existe * a la función escribeInfoFichero(). * Borra el directorio, fichero, link y link simbólico que ha creado. */ main() { /* * Damos un aviso por pantalla indicando qué ficheros vamos a crear para * la prueba de lstat() */ printf ("Creo:\n\tdirectorio: %s\n\tfichero: %s\n", DIRECTORIO, FICHERO); printf ("\tlink: %s\n\tlink simbólico: %s\n\n\n", LINK, LINK_SIMBOLICO); /* * Se comprueba un fichero que no existe. */ escribeInfoFichero (NO_EXISTE); /* * Se crea un directorio DIRECTORIO con permisos 755 y se comprueba. */ mkdir (DIRECTORIO, 0755); escribeInfoFichero (DIRECTORIO); /* * Se crea un fichero FICHERO normal con permisos 644 y se comprueba */ creat (FICHERO, 0644); escribeInfoFichero (FICHERO); /* * Se crea un enlace LINK a FICHERO y se comprueba */ link (FICHERO, LINK); escribeInfoFichero (LINK); /* * Se crea un enlace simbólico LINK_SIMBOLICO a FICHERO y se comprueba */ symlink (FICHERO, LINK_SIMBOLICO); escribeInfoFichero (LINK_SIMBOLICO); /* * Borramos todo lo que hemos creado, sacando un aviso por pantalla. */ printf ("\n\nBorro %s, %s, %s y %s\n", DIRECTORIO, FICHERO, LINK, LINK_SIMBOLICO); rmdir (DIRECTORIO); unlink (LINK_SIMBOLICO); unlink (LINK); unlink (FICHERO); } /* * La función recibe un nombre de fichero, * Llama a la función lstat() y escribe en pantalla si el fichero existe, * si es un fichero normal, un link, un link simbólico, un directorio u * otra cosa (dispositivo de caracteres, bloques, socket, ...) * Si se le pasa un puntero NULL no hace nada. */ void escribeInfoFichero (char *nombreFichero) { /* * Estructura para recoger la información del fichero. */ struct stat datosFichero; /* * Comprobación del parámetro de entrada */ if (nombreFichero == NULL) return; /* * Empezamos a escribir el resultado de la comprobación. */ printf ("El fichero %s --> ", nombreFichero); /* * Se comprueba si existe el fichero. * ¡Atención!. En esta llamada a lstat() se rellena datosFichero, * y por ello se puede usar datosFichero->st_mode en los siguientes if. */ if (lstat (nombreFichero, &datosFichero) == -1) printf ("no existe\n"); else /* Se comprueba si es un link simbólico */ if (S_ISLNK(datosFichero.st_mode)) printf ("es un link\n"); else /* Se comprueba si es un fichero normal o un link */ if (S_ISREG(datosFichero.st_mode)) printf ("es un fichero\n"); else /* Se comprueba si es un directorio */ if (S_ISDIR(datosFichero.st_mode)) printf ("es un directorio\n"); /* Es otra cosa */ else printf ("no es fichero, directorio, link ni link simbólico\n"); }