#include #include #include #include #include char LetraTF (mode_t m) { switch (m&S_IFMT) { /*and bit a bit con los bits de formato,0170000 */ case S_IFSOCK: return 's'; /*socket */ case S_IFLNK: return 'l'; /*symbolic link*/ case S_IFREG: return '-'; /* fichero normal*/ case S_IFBLK: return 'b'; /*block device*/ case S_IFDIR: return 'd'; /*directorio */ case S_IFCHR: return 'c'; /*char device*/ case S_IFIFO: return 'p'; /*pipe*/ default: return '?'; /*desconocido, no deberia aparecer*/ } } /*las siguientes funciones devuelven los permisos de un fichero en formato rwx----*/ /*a partir del campo st_mode de la estructura stat */ /*las tres son correctas pero usan distintas estrategias de asignación de memoria*/ char * ConvierteModo (mode_t m, char *permisos) { strcpy (permisos,"---------- "); permisos[0]=LetraTF(m); if (m&S_IRUSR) permisos[1]='r'; /*propietario*/ if (m&S_IWUSR) permisos[2]='w'; if (m&S_IXUSR) permisos[3]='x'; if (m&S_IRGRP) permisos[4]='r'; /*grupo*/ if (m&S_IWGRP) permisos[5]='w'; if (m&S_IXGRP) permisos[6]='x'; if (m&S_IROTH) permisos[7]='r'; /*resto*/ if (m&S_IWOTH) permisos[8]='w'; if (m&S_IXOTH) permisos[9]='x'; if (m&S_ISUID) permisos[3]='s'; /*setuid, setgid y stickybit*/ if (m&S_ISGID) permisos[6]='s'; if (m&S_ISVTX) permisos[9]='t'; return permisos; } char * ConvierteModo2 (mode_t m) { static char permisos[12]; strcpy (permisos,"---------- "); permisos[0]=LetraTF(m); if (m&S_IRUSR) permisos[1]='r'; /*propietario*/ if (m&S_IWUSR) permisos[2]='w'; if (m&S_IXUSR) permisos[3]='x'; if (m&S_IRGRP) permisos[4]='r'; /*grupo*/ if (m&S_IWGRP) permisos[5]='w'; if (m&S_IXGRP) permisos[6]='x'; if (m&S_IROTH) permisos[7]='r'; /*resto*/ if (m&S_IWOTH) permisos[8]='w'; if (m&S_IXOTH) permisos[9]='x'; if (m&S_ISUID) permisos[3]='s'; /*setuid, setgid y stickybit*/ if (m&S_ISGID) permisos[6]='s'; if (m&S_ISVTX) permisos[9]='t'; return permisos; } char * ConvierteModo3 (mode_t m) { char *permisos; if ((permisos=(char *) malloc (12))==NULL) return NULL; strcpy (permisos,"---------- "); permisos[0]=LetraTF(m); if (m&S_IRUSR) permisos[1]='r'; /*propietario*/ if (m&S_IWUSR) permisos[2]='w'; if (m&S_IXUSR) permisos[3]='x'; if (m&S_IRGRP) permisos[4]='r'; /*grupo*/ if (m&S_IWGRP) permisos[5]='w'; if (m&S_IXGRP) permisos[6]='x'; if (m&S_IROTH) permisos[7]='r'; /*resto*/ if (m&S_IWOTH) permisos[8]='w'; if (m&S_IXOTH) permisos[9]='x'; if (m&S_ISUID) permisos[3]='s'; /*setuid, setgid y stickybit*/ if (m&S_ISGID) permisos[6]='s'; if (m&S_ISVTX) permisos[9]='t'; return permisos; } int EsDirectorio (char * dir) /*para saber si algo es directorio o no*/ { struct stat s; if (lstat(dir,&s)==-1) /*si no puedo acceder: para mi no es directorio*/ return 0; return (S_ISDIR(s.st_mode)); }