diff --git a/commands/ls.c b/commands/ls.c index 331a4d2..771477b 100644 --- a/commands/ls.c +++ b/commands/ls.c @@ -26,15 +26,21 @@ #include #include -static void ls_one(const char *path, const char* fullname, struct stat *s) +static void ls_one(const char *path, const char* fullname) { char modestr[11]; unsigned int namelen = strlen(path); + struct stat s; + int ret; - mkmodestr(s->st_mode, modestr); - printf("%s %14llu %*.*s", modestr, s->st_size, namelen, namelen, path); + ret = lstat(fullname, &s); + if (ret) + return; - if (S_ISLNK(s->st_mode)) { + mkmodestr(s.st_mode, modestr); + printf("%s %14llu %*.*s", modestr, s.st_size, namelen, namelen, path); + + if (S_ISLNK(s.st_mode)) { char realname[PATH_MAX]; memset(realname, 0, PATH_MAX); @@ -58,14 +64,14 @@ string_list_init(&sl); - if (lstat(path, &s)) + 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, path, &s); + ls_one(path, path); return 0; } @@ -89,7 +95,7 @@ continue; } - ls_one(entry->str, tmp, &s); + ls_one(entry->str, tmp); } } @@ -162,7 +168,7 @@ /* first pass: all files */ while (o < argc) { - ret = lstat(argv[o], &s); + ret = stat(argv[o], &s); if (ret) { printf("%s: %s: %s\n", argv[0], argv[o], errno_str()); @@ -175,7 +181,7 @@ if (flags & LS_COLUMN) string_list_add_sorted(&sl, argv[o]); else - ls_one(argv[o], argv[o], &s); + ls_one(argv[o], argv[o]); } o++; @@ -190,7 +196,7 @@ /* second pass: directories */ while (o < argc) { - ret = lstat(argv[o], &s); + ret = stat(argv[o], &s); if (ret) { o++; exitcode = COMMAND_ERROR;