diff options
Diffstat (limited to 'src/commands/ls.c')
-rw-r--r-- | src/commands/ls.c | 113 |
1 files changed, 73 insertions, 40 deletions
diff --git a/src/commands/ls.c b/src/commands/ls.c index a5c60d2..e8d58d0 100644 --- a/src/commands/ls.c +++ b/src/commands/ls.c @@ -65,13 +65,18 @@ static DIR* get_directory(char* path) { static bool get_file_info(const char* file_name, struct FileInfo* info) { - uid_t uid = getuid(); - gid_t gid = getgid(); - + uid_t uid; + gid_t gid; + int save, ty; struct stat s; + size_t file_len; + + uid = getuid(); + gid = getgid(); + memset(&s, 0, sizeof(struct stat)); - int save = push_path_buffer(file_name); + save = push_path_buffer(file_name); if (lstat(get_path_buffer(), &s) < 0) { error_s("failed to read file '%s': %s\n", get_path_buffer(), strerror(errno)); @@ -79,7 +84,7 @@ static bool get_file_info(const char* file_name, struct FileInfo* info) { return false; } - int ty = (s.st_mode & S_IFMT) >> 12; + ty = (s.st_mode & S_IFMT) >> 12; info->set_uid = false; info->set_gid = false; @@ -171,7 +176,7 @@ static bool get_file_info(const char* file_name, struct FileInfo* info) { info->links = s.st_nlink; info->type = ty; - size_t file_len = strlen(file_name) + 1; + file_len = strlen(file_name) + 1; info->name = malloc(file_len); memcpy(info->name, file_name, file_len); @@ -217,13 +222,16 @@ static char* get_file_color(struct FileInfo* info) { static void list_files(struct FileInfo* files, int file_len, struct FileListInfo info) { + struct winsize w; + char* color; + int column_width, row_count, i; + if (flags.more_info) { char total[13]; print_file_size(info.total_size, total); printf("total %s\n", total); } - struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); if (!isatty(1)) { @@ -232,11 +240,10 @@ static void list_files(struct FileInfo* files, int file_len, struct FileListInfo flags.colored = NO; } - char* color; - const int column_width = info.max_name + 1; - const int row_count = w.ws_col / column_width; + column_width = info.max_name + 1; + row_count = w.ws_col / column_width; - for (int i = 0; i < file_len; i++) { + for (i = 0; i < file_len; i++) { struct FileInfo finfo = files[i]; color = get_file_color(&finfo); if (flags.more_info) { @@ -305,25 +312,28 @@ static void push_file( const char* file_path ) { struct FileInfo finfo; + int user_len, group_len, name_len, size_len, link_len; + if (!get_file_info(file_path, &finfo)) return; if (*size == *capacity) { *capacity *= 2; *files = realloc(*files, sizeof(struct FileInfo) * *capacity); } - int user_len = strlen(finfo.usr->pw_name); + + user_len = strlen(finfo.usr->pw_name); if (user_len > info->max_usr) info->max_usr = user_len; - int group_len = strlen(finfo.grp->gr_name); + group_len = strlen(finfo.grp->gr_name); if (group_len > info->max_grp) info->max_grp = group_len; - int name_len = strlen(file_path); + name_len = strlen(file_path); if (name_len > info->max_name) info->max_name = name_len; - int size_len = strlen(finfo.size); + size_len = strlen(finfo.size); if (size_len > info->max_size) info->max_size = size_len; - int link_len = num_places(finfo.links); + link_len = num_places(finfo.links); if (link_len > info->max_link) info->max_link = link_len; info->total_len += name_len + 2; @@ -335,18 +345,22 @@ static void push_file( static void recurse_directory(char* dir_name) { DIR* d; + int capacity, size, save; struct dirent* file; - int save = push_path_buffer(dir_name); + struct FileInfo* files; + struct FileListInfo info; + + save = push_path_buffer(dir_name); d = get_directory(get_path_buffer()); if (d == NULL) { return; } - int capacity = 8; - int size = 0; - struct FileInfo* files = malloc(sizeof(struct FileInfo) * capacity); - struct FileListInfo info; + capacity = 8; + size = 0; + + files = malloc(sizeof(struct FileInfo) * capacity); memset(&info, 0, sizeof(struct FileListInfo)); while((file = readdir(d)) != NULL) { @@ -360,10 +374,11 @@ static void recurse_directory(char* dir_name) { } - if (flags.colored == NO) + if (flags.colored == NO) { printf("\n%s:\n", get_path_buffer()); - else + } else { printf("\n%s%s:%s\n", DIR_COLOR, get_path_buffer(), FILE_COLOR); + } list_files(files, size, info); @@ -377,23 +392,29 @@ static void recurse_directory(char* dir_name) { } static void list_directory(char* path) { + + DIR* d; + int capacity, size, save; + struct FileInfo* files; + struct FileListInfo info; + struct dirent* file; + if (flags.recurse) { recurse_directory(path); return; } - DIR* d = get_directory(path); + d = get_directory(path); if (d == NULL) return; - int save = push_path_buffer(path); + save = push_path_buffer(path); - int capacity = 8; - int size = 0; - struct FileInfo* files = malloc(sizeof(struct FileInfo) * capacity); - struct FileListInfo info; + capacity = 8; + size = 0; + + files = malloc(sizeof(struct FileInfo) * capacity); memset(&info, 0, sizeof(struct FileListInfo)); - struct dirent* file; while ((file = readdir(d)) != NULL) { if (!flags.hidden && prefix(".", file->d_name)) continue; if (flags.hide_dot && is_dot_dir(file->d_name)) continue; @@ -415,15 +436,20 @@ static bool is_dir(const char* path) { } static void list_file_args(int start, int argc, char** argv) { - int capacity = 8; - int size = 0; - struct FileInfo* files = malloc(sizeof(struct FileInfo) * capacity); + + int capacity, size, i; + struct FileInfo* files; struct FileListInfo info; + + capacity = 8; + size = 0; + + files = malloc(sizeof(struct FileInfo) * capacity); memset(&info, 0, sizeof(struct FileListInfo)); - for (int i = start; i < argc; i++) { + for (i = start; i < argc; i++) { if (is_dir(argv[i])) continue; - push_file((struct FileInfo**) &files, &info, &size, &capacity, argv[i]); + push_file(&files, &info, &size, &capacity, argv[i]); } if (size > 0) list_files(files, size, info); @@ -487,6 +513,9 @@ static int long_arg(char* cur, char* next) { COMMAND(ls) { + int start, i; + bool titled; + flags.hidden = false; flags.more_info = false; flags.hide_dot = false; @@ -494,7 +523,7 @@ COMMAND(ls) { flags.recurse = false; flags.colored = NO; - int start = parse_args(argc, argv, help, short_arg, long_arg); + start = parse_args(argc, argv, help, short_arg, long_arg); if (argc - start == 0) { list_directory("."); @@ -503,15 +532,19 @@ COMMAND(ls) { list_file_args(start, argc, argv); - bool titled = argc - start > 1; - for (int i = start; i < argc; i++) { + titled = argc - start > 1; + for (i = start; i < argc; i++) { + if (!is_dir(argv[i])) continue; + if (titled && !flags.recurse) { - if (flags.colored != NO) + if (flags.colored != NO) { printf("\n%s%s:%s\n", DIR_COLOR, argv[i], FILE_COLOR); - else + } else { printf("\n%s:\n", argv[i]); + } } + list_directory(argv[i]); } |