ls: Show symlink target with `-l`
This commit is contained in:
parent
0620ed3d4f
commit
fbb99de728
|
@ -21,6 +21,7 @@ struct simple_entry_t
|
||||||
{
|
{
|
||||||
BAN::String name;
|
BAN::String name;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
BAN::String link;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct full_entry_t
|
struct full_entry_t
|
||||||
|
@ -117,6 +118,8 @@ BAN::String build_time_string(BAN::Time time)
|
||||||
|
|
||||||
int list_directory(const BAN::String& path, config_t config)
|
int list_directory(const BAN::String& path, config_t config)
|
||||||
{
|
{
|
||||||
|
static char link_buffer[PATH_MAX];
|
||||||
|
|
||||||
BAN::Vector<simple_entry_t> entries;
|
BAN::Vector<simple_entry_t> entries;
|
||||||
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
@ -131,7 +134,16 @@ int list_directory(const BAN::String& path, config_t config)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (!S_ISDIR(st.st_mode))
|
if (!S_ISDIR(st.st_mode))
|
||||||
|
{
|
||||||
MUST(entries.emplace_back(path, st));
|
MUST(entries.emplace_back(path, st));
|
||||||
|
if (S_ISLNK(st.st_mode))
|
||||||
|
{
|
||||||
|
if (readlink(path.data(), link_buffer, sizeof(link_buffer)) == -1)
|
||||||
|
perror("readlink");
|
||||||
|
else
|
||||||
|
MUST(entries.back().link.append(link_buffer));
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DIR* dirp = opendir(path.data());
|
DIR* dirp = opendir(path.data());
|
||||||
|
@ -155,6 +167,13 @@ int list_directory(const BAN::String& path, config_t config)
|
||||||
}
|
}
|
||||||
|
|
||||||
MUST(entries.emplace_back(BAN::StringView(dirent->d_name), st));
|
MUST(entries.emplace_back(BAN::StringView(dirent->d_name), st));
|
||||||
|
if (S_ISLNK(st.st_mode))
|
||||||
|
{
|
||||||
|
if (readlinkat(dirfd(dirp), dirent->d_name, link_buffer, sizeof(link_buffer)) == -1)
|
||||||
|
perror("readlink");
|
||||||
|
else
|
||||||
|
MUST(entries.back().link.append(link_buffer));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
closedir(dirp);
|
closedir(dirp);
|
||||||
|
@ -214,6 +233,11 @@ int list_directory(const BAN::String& path, config_t config)
|
||||||
GET_ENTRY_STRING(time, time);
|
GET_ENTRY_STRING(time, time);
|
||||||
|
|
||||||
full_entry.full_name = MUST(BAN::String::formatted("{}{}\e[m", entry_color(entry.st.st_mode), entry.name));
|
full_entry.full_name = MUST(BAN::String::formatted("{}{}\e[m", entry_color(entry.st.st_mode), entry.name));
|
||||||
|
if (S_ISLNK(entry.st.st_mode))
|
||||||
|
{
|
||||||
|
MUST(full_entry.full_name.append(" -> "_sv));
|
||||||
|
MUST(full_entry.full_name.append(entry.link));
|
||||||
|
}
|
||||||
|
|
||||||
MUST(full_entries.push_back(BAN::move(full_entry)));
|
MUST(full_entries.push_back(BAN::move(full_entry)));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue