130 lines
3 KiB
C
130 lines
3 KiB
C
static void display_type(dir_t *dir);
|
|
static void display_permission(dir_t *dir);
|
|
static void display_size(dir_t *dir, i32 max_size);
|
|
static void display_date(dir_t *dir);
|
|
static void display_path(dir_t *dir);
|
|
|
|
i32
|
|
display_files_stat(t_list **files) {
|
|
if (!files)
|
|
return 0;
|
|
if (ft_lstsize(*files) <= 0) {
|
|
ft_printf("total 0\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
i32 max_size = ft_get_size(((dir_t*)(*files)->content)->lstat.st_size);
|
|
i32 total = 0;
|
|
t_list *cur;
|
|
for (cur = *files; cur != NULL; cur = cur->next) {
|
|
dir_t *dir = (dir_t*)(cur)->content;
|
|
max_size = MAX(ft_get_size(dir->lstat.st_size), max_size);
|
|
total += dir->lstat.st_blocks;
|
|
}
|
|
|
|
ft_printf("total %d\n", total / 2);
|
|
|
|
i32 drawed = 0;
|
|
for (cur = *files; cur != NULL; cur = cur->next) {
|
|
dir_t *dir = (dir_t*)(cur)->content;
|
|
display_single_stat(dir, max_size);
|
|
drawed++;
|
|
ft_printf("\n");
|
|
}
|
|
return drawed;
|
|
}
|
|
|
|
void
|
|
display_single_stat(dir_t *dir, i32 max_size) {
|
|
if (!dir)
|
|
return;
|
|
display_type(dir);
|
|
display_permission(dir);
|
|
ft_printf(" ");
|
|
ft_printf("%d", dir->lstat.st_nlink);
|
|
ft_printf(" ");
|
|
if (dir->psswd)
|
|
ft_printf("%s", dir->psswd->pw_name);
|
|
ft_printf(" ");
|
|
if (dir->grp)
|
|
ft_printf("%s", dir->grp->gr_name);
|
|
ft_printf(" ");
|
|
display_size(dir, max_size);
|
|
ft_printf(" ");
|
|
display_date(dir);
|
|
ft_printf(" ");
|
|
display_name(dir);
|
|
if (S_ISLNK(dir->lstat.st_mode))
|
|
display_path(dir);
|
|
}
|
|
|
|
static void
|
|
display_type(dir_t *dir) {
|
|
if (!dir)
|
|
return;
|
|
if (S_ISLNK(dir->lstat.st_mode))
|
|
ft_printf("l");
|
|
else if (!dir->is_file)
|
|
ft_printf("d");
|
|
else if (S_ISSOCK(dir->lstat.st_mode))
|
|
ft_printf("s");
|
|
else if (S_ISFIFO(dir->lstat.st_mode))
|
|
ft_printf("p");
|
|
else if (S_ISCHR(dir->lstat.st_mode))
|
|
ft_printf("c");
|
|
else if (S_ISBLK(dir->lstat.st_mode))
|
|
ft_printf("b");
|
|
else
|
|
ft_printf("-");
|
|
}
|
|
|
|
static void
|
|
display_permission(dir_t *dir) {
|
|
if (!dir)
|
|
return;
|
|
char buf[10];
|
|
strmode(dir->stat.st_mode, buf);
|
|
ft_printf("%s", buf);
|
|
}
|
|
|
|
static void
|
|
display_size(dir_t *dir, i32 max_size) {
|
|
if (!dir)
|
|
return;
|
|
i32 len = ft_get_size(dir->lstat.st_size);
|
|
|
|
for (int i = max_size - len; i > 0; i--)
|
|
ft_printf(" ");
|
|
ft_printf("%d", dir->lstat.st_size);
|
|
}
|
|
|
|
static void
|
|
display_date(dir_t *dir) {
|
|
if (!dir)
|
|
return;
|
|
struct timespec last_edit = dir->lstat.st_mtim;
|
|
char *base_time_str = ctime(&last_edit.tv_sec);
|
|
if (!base_time_str)
|
|
return;
|
|
|
|
char *time_str = ft_substr(base_time_str, 4, ft_strlen(base_time_str) - 14);
|
|
if (!time_str)
|
|
return;
|
|
ft_printf(time_str);
|
|
|
|
free(time_str);
|
|
}
|
|
|
|
static void
|
|
display_path(dir_t *dir) {
|
|
if (!dir || !dir->path)
|
|
return;
|
|
char buf[512] = {[0 ... 511] = 0};
|
|
i32 error = readlink(dir->path, buf, dir->lstat.st_size);
|
|
if (error == -1)
|
|
return;
|
|
ft_printf(" -> %s", buf);
|
|
}
|
|
|