/** * @file Mode.cpp * @author apio (cloudapio.eu) * @brief Visual file permissions parsing and formatting. * * @copyright Copyright (c) 2023, the Luna authors. * */ #include #include namespace os { static char filetype(mode_t mode) { if (S_ISREG(mode)) return '-'; if (S_ISDIR(mode)) return 'd'; if (S_ISCHR(mode)) return 'c'; if (S_ISBLK(mode)) return 'b'; if (S_ISLNK(mode)) return 'l'; if (S_ISFIFO(mode)) return 'p'; if (S_ISSOCK(mode)) return 's'; return '?'; } void format_mode(mode_t mode, char out[11]) { out[0] = filetype(mode); out[1] = (mode & S_IRUSR) ? 'r' : '-'; out[2] = (mode & S_IWUSR) ? 'w' : '-'; out[3] = (mode & S_ISUID) ? ((mode & S_IXUSR) ? 's' : 'S') : ((mode & S_IXUSR) ? 'x' : '-'); out[4] = (mode & S_IRGRP) ? 'r' : '-'; out[5] = (mode & S_IWGRP) ? 'w' : '-'; out[6] = (mode & S_ISGID) ? ((mode & S_IXGRP) ? 's' : 'S') : ((mode & S_IXGRP) ? 'x' : '-'); out[7] = (mode & S_IROTH) ? 'r' : '-'; out[8] = (mode & S_IWOTH) ? 'w' : '-'; out[9] = (mode & S_ISVTX) ? ((mode & S_IXOTH) ? 't' : 'T') : ((mode & S_IXOTH) ? 'x' : '-'); out[10] = '\0'; } }