int main(int argc, char *argv[]) { int i; for (i=1; i<argc; i++) { ls_one(argv[i]); } return 0; }
void ft_ls(char **av, int ac, char *option) { if (ONLY_BIG_OPT(av[0]) || NO_OPTION_NO_ARG) ls_one(".", option); else if (IS_AN_OPTION) { if (is_only_option(av) && IS_R) recursive(".", option); else if (is_only_option(av) && (IS_L || IS_G || IS_O) && !(PRIORITY)) ls_l(".", option); else if (is_only_option(av) && (IS_A_A || IS_R_2 || IS_T || IS_1 || IS_F || IS_P)) ls_one(".", option); else the_following(&av, option, 1); } else the_following(&av, option, 0); }
int ls(const char *path, ulong flags) { DIR *dir; struct dirent *d; char tmp[PATH_MAX]; struct stat s; struct string_list sl; string_list_init(&sl); if (stat(path, &s)) return errno; if (flags & LS_SHOWARG && s.st_mode & S_IFDIR) printf("%s:\n", path); if (!(s.st_mode & S_IFDIR)) { ls_one(path, &s); return 0; } dir = opendir(path); if (!dir) return errno; while ((d = readdir(dir))) { sprintf(tmp, "%s/%s", path, d->d_name); if (stat(tmp, &s)) goto out; if (flags & LS_COLUMN) string_list_add_sorted(&sl, d->d_name); else ls_one(d->d_name, &s); } closedir(dir); if (flags & LS_COLUMN) { string_list_print_by_column(&sl); string_list_free(&sl); } if (!(flags & LS_RECURSIVE)) return 0; dir = opendir(path); if (!dir) { errno = -ENOENT; return -ENOENT; } while ((d = readdir(dir))) { if (!strcmp(d->d_name, ".")) continue; if (!strcmp(d->d_name, "..")) continue; sprintf(tmp, "%s/%s", path, d->d_name); if (stat(tmp, &s)) goto out; if (s.st_mode & S_IFDIR) { char *norm = normalise_path(tmp); ls(norm, flags); free(norm); } } out: closedir(dir); return 0; }
static int do_ls(struct command *cmdtp, int argc, char *argv[]) { int ret, opt, o; struct stat s; ulong flags = LS_COLUMN; struct string_list sl; while((opt = getopt(argc, argv, "RCl")) > 0) { switch(opt) { case 'R': flags |= LS_RECURSIVE | LS_SHOWARG; break; case 'C': flags |= LS_COLUMN; break; case 'l': flags &= ~LS_COLUMN; break; } } if (argc - optind > 1) flags |= LS_SHOWARG; if (optind == argc) { ret = ls(getcwd(), flags); return ret ? 1 : 0; } string_list_init(&sl); o = optind; /* first pass: all files */ while (o < argc) { ret = stat(argv[o], &s); if (ret) { printf("%s: %s: %s\n", argv[0], argv[o], errno_str()); o++; continue; } if (!(s.st_mode & S_IFDIR)) { if (flags & LS_COLUMN) string_list_add_sorted(&sl, argv[o]); else ls_one(argv[o], &s); } o++; } if (flags & LS_COLUMN) string_list_print_by_column(&sl); string_list_free(&sl); o = optind; /* second pass: directories */ while (o < argc) { ret = stat(argv[o], &s); if (ret) { o++; continue; } if (s.st_mode & S_IFDIR) { ret = ls(argv[o], flags); if (ret) { perror("ls"); o++; continue; } } o++; } return 0; }