#include #include #include #include #include #include #include #include #include #include #include #include "util/versie.h" static int max_depth = -1; static bool show_hidden = false; static bool dirs_only = false; static void usage(FILE *f) { fprintf(f, "Gebruik: boom [-thV] [STARTPUNTEN]...\n" "\n" "Geef inhoud van mapjes weer in een boom-achtig formaat.\n" "\n" " -a Alle bestanden worden weergegeven, ookal beginnen ze met een puntje\n" " -m Geef alleen mapjes weer\n" " -d Maximale diepte\n" " -o Omvang van n beten (+, - voor meer of minder)\n" " -h Toon deze hulptekst\n" " -V Toon versienummer\n"); } // Returns pointer to argument array containing the starting points static char** parse_options(int argc, char **argv) { int opt; while ((opt = getopt(argc, argv, "amd:hV")) != -1) { switch (opt) { case 'a': show_hidden = true; break; case 'm': dirs_only = true; break; case 'd': max_depth = atoi(optarg); if (max_depth <= 0) { fprintf(stderr, "boom: maximale diepte moet groter zijn dan 0\n"); exit(1); } break; case 'h': usage(stdout); exit(0); case 'V': drukkedoos_print_versie(stdout); exit(0); case '?': usage(stderr); exit(1); } } return argv + optind; } static int prev_level = -1; static int skip_level = -1; static int f(const char *fpath, const struct stat *, int typeflag, struct FTW *ftwbuf) { int level = ftwbuf->level; bool is_dir = typeflag == FTW_D || typeflag == FTW_DNR || typeflag == FTW_DP; if (level < skip_level) { skip_level = -1; } else if (skip_level != -1 && level >= skip_level) { return 0; } // check max depth if (max_depth >= 0 && level >= (max_depth + 1)) return 0; const char *fname = basename(fpath); // don't show hidden files if (!show_hidden && fname[0] == '.' && strlen(fpath) > 2 && level != 0) { skip_level = level + 1; goto done; } // don't show files in dirs only mode if (dirs_only && !is_dir) return 0; for (int i = 1; i < level; i++) { printf("| "); } if (level != 0) { printf("|-- "); } printf("%s", fname); if (typeflag == FTW_SL) { char real_name[PATH_MAX] = {0}; if (readlink(fpath, real_name, PATH_MAX-1) != -1) printf(" -> %s", real_name); } printf("\n"); done: prev_level = level; return 0; } int entry_boom(int argc, char **argv) { char **args = parse_options(argc, argv); int flags = 0; flags |= FTW_PHYS; if (*args == NULL) { nftw(".", f, 4096, flags); return 0; } for (int i = 0; args[i]; i++) { nftw(args[i], f, 4096, flags); } return 0; }