#include #include #include #include #include #include #include void joinPath(char *result, const char *base, const char *rel) { strcpy(result, base); strcat(result, "/"); strcat(result, rel); } int main(int argc, char *argv[]) { char dirp[128] = "."; if (argc > 1) { strcpy(dirp, argv[1]); } char newpath[128] = {0}; char newresolvedpath[128] = {0}; if (dirp[0] == '/') { strcpy(newresolvedpath, dirp); } else { joinPath(newpath, ".", dirp); realpath(newpath, newresolvedpath); } if (!access(newresolvedpath, F_OK)) { struct stat statResult; stat(newresolvedpath, &statResult); if (!S_ISDIR(statResult.st_mode)) { write(1, "uuuuh das not a dir\n", 21); exit(1); } } else { write(1, "uuuuh das not a dir\n", 21); exit(1); } DIR *d; struct dirent *dir; d = opendir(dirp); //TODO - sort if (d) { while ((dir = readdir(d)) != NULL) { struct stat path_stat; char path[256] = {0}; joinPath(path, dirp, dir->d_name); stat(path, &path_stat); if (S_ISDIR(path_stat.st_mode)) { printf("\e[94m%s\e[0m\n", dir->d_name); } else if (!access(path, X_OK)) { printf("\e[92m%s\e[0m\n", dir->d_name); } else { printf("%s\n", dir->d_name); } } closedir(d); } exit(0); }