9
0
Fork 0

ls: add symlink support to -l

barebox:/ ls -l /env/init.d/
drwxrwxrwx          0 .
drwxrwxrwx          0 ..
lrwxrwxrwx         11 net -> ../boot/net

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2012-08-22 15:20:58 +08:00
parent bf32bc1d9a
commit 0939b7c549
1 changed files with 21 additions and 10 deletions

View File

@ -29,13 +29,24 @@
#include <getopt.h>
#include <stringlist.h>
static void ls_one(const char *path, struct stat *s)
static void ls_one(const char *path, const char* fullname, struct stat *s)
{
char modestr[11];
unsigned int namelen = strlen(path);
mkmodestr(s->st_mode, modestr);
printf("%s %10llu %*.*s\n", modestr, s->st_size, namelen, namelen, path);
printf("%s %10llu %*.*s", modestr, s->st_size, namelen, namelen, path);
if (S_ISLNK(s->st_mode)) {
char realname[PATH_MAX];
memset(realname, 0, PATH_MAX);
if (readlink(fullname, realname, PATH_MAX - 1) >= 0)
printf(" -> %s", realname);
}
puts("\n");
}
int ls(const char *path, ulong flags)
@ -48,14 +59,14 @@ int ls(const char *path, ulong flags)
string_list_init(&sl);
if (stat(path, &s))
if (lstat(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);
ls_one(path, path, &s);
return 0;
}
@ -65,12 +76,12 @@ int ls(const char *path, ulong flags)
while ((d = readdir(dir))) {
sprintf(tmp, "%s/%s", path, d->d_name);
if (stat(tmp, &s))
if (lstat(tmp, &s))
goto out;
if (flags & LS_COLUMN)
string_list_add_sorted(&sl, d->d_name);
else
ls_one(d->d_name, &s);
ls_one(d->d_name, tmp, &s);
}
closedir(dir);
@ -97,7 +108,7 @@ int ls(const char *path, ulong flags)
continue;
sprintf(tmp, "%s/%s", path, d->d_name);
if (stat(tmp, &s))
if (lstat(tmp, &s))
goto out;
if (s.st_mode & S_IFDIR) {
char *norm = normalise_path(tmp);
@ -146,7 +157,7 @@ static int do_ls(int argc, char *argv[])
/* first pass: all files */
while (o < argc) {
ret = stat(argv[o], &s);
ret = lstat(argv[o], &s);
if (ret) {
printf("%s: %s: %s\n", argv[0],
argv[o], errno_str());
@ -158,7 +169,7 @@ static int do_ls(int argc, char *argv[])
if (flags & LS_COLUMN)
string_list_add_sorted(&sl, argv[o]);
else
ls_one(argv[o], &s);
ls_one(argv[o], argv[o], &s);
}
o++;
@ -173,7 +184,7 @@ static int do_ls(int argc, char *argv[])
/* second pass: directories */
while (o < argc) {
ret = stat(argv[o], &s);
ret = lstat(argv[o], &s);
if (ret) {
o++;
continue;