-l almost done, still need to do + for ACL, maj/min for CHR and BLK
This commit is contained in:
parent
8c13c75f3b
commit
0a4d0b0cb1
9 changed files with 226 additions and 24 deletions
12
ls/.tags
12
ls/.tags
|
|
@ -4,10 +4,18 @@ ft_ent_get_dirs src/lib_dirents.c /^t_list *ft_ent_get_dirs(t_list *ent)$/
|
|||
ft_ent_handle src/lib_dirents.c /^void ft_ent_handle(t_list **ent, t_lsdata *topdir,/
|
||||
ft_error_dir src/lib_error.c /^void ft_error_dir(char *s)$/
|
||||
ft_error_option src/lib_error.c /^void ft_error_option(char c)$/
|
||||
ft_ls_l src/lib_print.c /^void ft_ls_l(t_lsdata *data)$/
|
||||
ft_ls_long src/lib_ls_long.c /^int ft_ls_long(t_list *ent)$/
|
||||
ft_ls_long_date src/lib_ls_long.c /^void ft_ls_long_date(struct stat *stat)$/
|
||||
ft_ls_long_lnk src/lib_ls_long_misc.c /^void ft_ls_long_lnk(t_lsdata *data)$/
|
||||
ft_ls_long_middle src/lib_ls_long.c /^int ft_ls_long_middle(struct stat *stat, t_pads */
|
||||
ft_ls_long_pads src/lib_ls_long_misc.c /^int ft_ls_long_pads(t_list *ent, t_pads *pads)$/
|
||||
ft_ls_long_rights src/lib_ls_long.c /^void ft_ls_long_rights(int st_mode)$/
|
||||
ft_ls_long_total src/lib_ls_long_misc.c /^int ft_ls_long_total(t_list *ent)$/
|
||||
ft_ls_long_type src/lib_ls_long.c /^void ft_ls_long_type(unsigned char d_type)$/
|
||||
ft_ls_long_xattr src/lib_ls_long_misc.c /^int ft_ls_long_xattr(char *path)$/
|
||||
ft_ls_print src/lib_print.c /^void ft_ls_print(t_list *ent, char *opts, t_lsdata/
|
||||
ft_ls_print_dirents src/lib_print.c /^void ft_ls_print_dirents(t_list *ent, char *opts)$/
|
||||
ft_ls_print_header src/lib_print.c /^void ft_ls_print_header(char *dirname)$/
|
||||
ft_ls_short src/lib_print.c /^void ft_ls_short(t_list *ent)$/
|
||||
ft_lsdata_cmp0 src/lib_lsdata.c /^int ft_lsdata_cmp0(t_lsdata *dat1, char *dataref)/
|
||||
ft_lsdata_cmp_name src/lib_lsdata.c /^int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata */
|
||||
ft_lsdata_cmp_time src/lib_lsdata.c /^int ft_lsdata_cmp_time(t_lsdata *dat1, t_lsdata */
|
||||
|
|
|
|||
|
|
@ -7,6 +7,9 @@
|
|||
# include <sys/stat.h>
|
||||
# include <sys/types.h>
|
||||
# include <time.h>
|
||||
# include <pwd.h>
|
||||
# include <grp.h>
|
||||
# include <sys/xattr.h>
|
||||
|
||||
typedef struct s_lsdata
|
||||
{
|
||||
|
|
@ -15,6 +18,14 @@ typedef struct s_lsdata
|
|||
struct dirent *dirent;
|
||||
} t_lsdata;
|
||||
|
||||
typedef struct s_pads
|
||||
{
|
||||
int nlink;
|
||||
int name;
|
||||
int gr_name;
|
||||
int size;
|
||||
} t_pads;
|
||||
|
||||
int ft_parse_ls_options(int ac, char **av, char *opts);
|
||||
void ft_parse_ls(int ac, char **av, t_list **dir, t_list **ent, char *opts);
|
||||
|
||||
|
|
@ -28,9 +39,19 @@ t_list *ft_ent_get_dirs(t_list *ent);
|
|||
|
||||
t_list *ft_dir_get_ents(t_lsdata *dir);
|
||||
|
||||
void ft_ls_short(t_list *ent);
|
||||
int ft_ls_long(t_list *ent);
|
||||
int ft_ls_long_total(t_list *ent);
|
||||
int ft_ls_long_pads(t_list *ent, t_pads *pads);
|
||||
void ft_ls_long_type(unsigned char d_type);
|
||||
void ft_ls_long_rights(int st_mode);
|
||||
int ft_ls_long_xattr(char *path);
|
||||
int ft_ls_long_middle(struct stat *stat, t_pads *pads);
|
||||
void ft_ls_long_date(struct stat *stat);
|
||||
void ft_ls_long_lnk(t_lsdata *data);
|
||||
|
||||
void ft_ls_print(t_list *ent, char *opts, t_lsdata *topdir);
|
||||
void ft_ls_print_header(char *dirname);
|
||||
void ft_ls_print_dirents(t_list *ent, char *opts);
|
||||
|
||||
void ft_error_option(char c);
|
||||
void ft_error_dir(char *s);
|
||||
|
|
|
|||
2
ls/libft
2
ls/libft
|
|
@ -1 +1 @@
|
|||
Subproject commit 8bfb8fb462d914837fb76e95141cdce59b3c99f9
|
||||
Subproject commit d351b97f35fbb2551cfaab92322cac8524112486
|
||||
|
|
@ -15,7 +15,7 @@ t_list *ft_dir_get_ents(t_lsdata *topdir)
|
|||
data.path = ft_strjoin(data.path, dirent->d_name);
|
||||
/* ft_printf("looking at file: %s\n", data.path); */
|
||||
/* ft_printf("stat ret: %i\n", stat(data.path, &data.stat)); */
|
||||
stat(data.path, &data.stat);
|
||||
lstat(data.path, &data.stat);
|
||||
data.dirent = dirent;
|
||||
/* char *date = ctime(&data.stat.st_mtime); */
|
||||
/* date[ft_strlen(date) - 1] = '\0'; */
|
||||
|
|
|
|||
106
ls/src/lib_ls_long.c
Normal file
106
ls/src/lib_ls_long.c
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
#include "ftls.h"
|
||||
|
||||
int ft_ls_long(t_list *ent)
|
||||
{
|
||||
t_lsdata *data;
|
||||
struct stat stat;
|
||||
struct dirent *dirent;
|
||||
t_pads pads = {0, 0, 0, 0};
|
||||
|
||||
ft_ls_long_total(ent);
|
||||
if (ft_ls_long_pads(ent, &pads))
|
||||
return (1);
|
||||
while (ent)
|
||||
{
|
||||
data = ent->content;
|
||||
stat = data->stat;
|
||||
dirent = data->dirent;
|
||||
ent = ent->next;
|
||||
|
||||
ft_ls_long_type(dirent->d_type);
|
||||
ft_ls_long_rights(stat.st_mode);
|
||||
if (ft_ls_long_xattr(dirent->d_name))
|
||||
return (1);
|
||||
if (ft_ls_long_middle(&stat, &pads))
|
||||
return (1);
|
||||
ft_ls_long_date(&stat);
|
||||
ft_printf(" %s", data->dirent->d_name);
|
||||
ft_ls_long_lnk(data);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
int ft_ls_long_middle(struct stat *stat, t_pads *pads)
|
||||
{
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
|
||||
if ((pwd = getpwuid(stat->st_uid)) == NULL)
|
||||
return (1);
|
||||
if ((grp = getgrgid(stat->st_gid)) == NULL)
|
||||
return (1);
|
||||
printf(" %*hu", pads->nlink, stat->st_nlink);
|
||||
printf(" %-*s", pads->name, pwd->pw_name);
|
||||
printf(" %-*s", pads->gr_name, grp->gr_name);
|
||||
printf(" %*lld", pads->size, stat->st_size);
|
||||
fflush(stdout);
|
||||
return (0);
|
||||
}
|
||||
|
||||
void ft_ls_long_date(struct stat *stat)
|
||||
{
|
||||
char *date;
|
||||
char *day;
|
||||
char *month;
|
||||
char *time;
|
||||
|
||||
date = ctime(&stat->st_mtime);
|
||||
month = ft_strsub(date, 4, 3);
|
||||
month[0] += 32;
|
||||
day = ft_strsub(date, 8, 2);
|
||||
time = ft_time_isrecent(stat->st_mtime)
|
||||
? ft_strsub(date, 11, 5)
|
||||
: ft_strsub(date, 20, 4);
|
||||
ft_printf(" %s %s %5s", day, month, time);
|
||||
}
|
||||
|
||||
void ft_ls_long_type(unsigned char d_type)
|
||||
{
|
||||
char type;
|
||||
|
||||
type = '\0';
|
||||
type = d_type == DT_REG ? '-' : type;
|
||||
type = d_type == DT_DIR ? 'd' : type;
|
||||
type = d_type == DT_FIFO ? 'p' : type;
|
||||
type = d_type == DT_SOCK ? 's' : type;
|
||||
type = d_type == DT_CHR ? 'c' : type;
|
||||
type = d_type == DT_BLK ? 'b' : type;
|
||||
type = d_type == DT_LNK ? 'l' : type;
|
||||
ft_printf("%c", type);
|
||||
}
|
||||
|
||||
void ft_ls_long_rights(int st_mode)
|
||||
{
|
||||
int i;
|
||||
char *rights;
|
||||
|
||||
i = 0;
|
||||
rights = ft_itoa_base(st_mode, "01", "");
|
||||
rights = rights + ft_strlen(rights) - 9;
|
||||
while (rights[i])
|
||||
{
|
||||
if (rights[i] == '0')
|
||||
rights[i] = '-';
|
||||
else
|
||||
{
|
||||
if (i % 3 == 0)
|
||||
rights[i] = 'r';
|
||||
else if (i % 3 == 1)
|
||||
rights[i] = 'w';
|
||||
else if (i % 3 == 2)
|
||||
rights[i] = 'x';
|
||||
}
|
||||
i++;
|
||||
}
|
||||
ft_printf("%s", rights);
|
||||
}
|
||||
73
ls/src/lib_ls_long_misc.c
Normal file
73
ls/src/lib_ls_long_misc.c
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
#include "ftls.h"
|
||||
|
||||
void ft_ls_long_lnk(t_lsdata *data)
|
||||
{
|
||||
struct stat stat;
|
||||
struct dirent *dirent;
|
||||
|
||||
dirent = data->dirent;
|
||||
stat = data->stat;
|
||||
|
||||
if (dirent->d_type == DT_LNK)
|
||||
ft_printf(" -> unknown\n");
|
||||
else
|
||||
ft_printf("\n");
|
||||
}
|
||||
|
||||
int ft_ls_long_xattr(char *path)
|
||||
{
|
||||
int n;
|
||||
char x;
|
||||
|
||||
if ((n = ft_xattr_count(path)) == -1)
|
||||
return (1);
|
||||
x = n > 0 ? '@' : '\0';
|
||||
ft_printf("%1c", x);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int ft_ls_long_total(t_list *ent)
|
||||
{
|
||||
struct stat stat;
|
||||
t_lsdata *data;
|
||||
int total;
|
||||
|
||||
total = 0;
|
||||
while (ent)
|
||||
{
|
||||
data = ent->content;
|
||||
stat = data->stat;
|
||||
/* dirent = data->dirent; */
|
||||
ent = ent->next;
|
||||
|
||||
total += stat.st_blocks;
|
||||
}
|
||||
ft_printf("total %i\n", total);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int ft_ls_long_pads(t_list *ent, t_pads *pads)
|
||||
{
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
struct stat stat;
|
||||
t_lsdata *data;
|
||||
|
||||
while (ent)
|
||||
{
|
||||
data = ent->content;
|
||||
stat = data->stat;
|
||||
/* dirent = data->dirent; */
|
||||
ent = ent->next;
|
||||
|
||||
if ((pwd = getpwuid(stat.st_uid)) == NULL)
|
||||
return (1);
|
||||
if ((grp = getgrgid(stat.st_gid)) == NULL)
|
||||
return (1);
|
||||
pads->nlink = FT_MAX(pads->nlink, (int)ft_uilen(stat.st_nlink));
|
||||
pads->name = FT_MAX(pads->name, (int)ft_strlen(pwd->pw_name));
|
||||
pads->gr_name = FT_MAX(pads->gr_name, (int)ft_strlen(grp->gr_name));
|
||||
pads->size = FT_MAX(pads->size, (int)ft_ilen(stat.st_size));
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -16,13 +16,13 @@ void ft_parse_ls(int ac, char **av, t_list **dir, t_list **ent, char *opts)
|
|||
if (i == ac)
|
||||
{
|
||||
data.path = ft_strdup(".");
|
||||
ft_printf("stat ret: %i\n", stat(data.path, &data.stat));
|
||||
/* ft_printf("stat ret: %i\n", stat(data.path, &data.stat)); */
|
||||
ft_lstadd(dir, ft_lstnew(&data, sizeof(data)));
|
||||
}
|
||||
while (i < ac)
|
||||
{
|
||||
data.path = ft_strdup(av[i]);
|
||||
if (stat(data.path, &data.stat) < 0)
|
||||
if (lstat(data.path, &data.stat) < 0)
|
||||
{
|
||||
ft_error_dir(data.path);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,21 +8,16 @@ void ft_ls_print(t_list *ent, char *opts, t_lsdata *topdir)
|
|||
ft_ls_print_header(topdir->path);
|
||||
else
|
||||
*opt = '.';
|
||||
ft_ls_print_dirents(ent, opts);
|
||||
ft_printf("\n");
|
||||
if (ent)
|
||||
{
|
||||
if (ft_strchr(opts, 'l'))
|
||||
ft_ls_long(ent);
|
||||
else
|
||||
ft_ls_short(ent);
|
||||
}
|
||||
}
|
||||
|
||||
void ft_ls_l(t_lsdata *data)
|
||||
{
|
||||
char *date;
|
||||
|
||||
/* date = ctime(&data->stat.st_mtimespec.tv_sec); */
|
||||
date = ctime(&data->stat.st_mtime);
|
||||
date[ft_strlen(date) - 1] = '\0';
|
||||
ft_printf("%s %s\n", date, data->dirent->d_name);
|
||||
}
|
||||
|
||||
void ft_ls_print_dirents(t_list *ent, char *opts)
|
||||
void ft_ls_short(t_list *ent)
|
||||
{
|
||||
t_lsdata *data;
|
||||
struct dirent *dirent;
|
||||
|
|
@ -31,11 +26,8 @@ void ft_ls_print_dirents(t_list *ent, char *opts)
|
|||
{
|
||||
data = ent->content;
|
||||
dirent = data->dirent;
|
||||
if (ft_strchr(opts, 'l'))
|
||||
ft_ls_l(data);
|
||||
else
|
||||
ft_printf("%s\n", dirent->d_name);
|
||||
ent = ent->next;
|
||||
ft_printf("%s\n", dirent->d_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@ int main(int ac, char **av)
|
|||
ft_lst_merge(&dir_r, dir);
|
||||
dir = dir_r;
|
||||
}
|
||||
if (dir)
|
||||
ft_printf("\n");
|
||||
/* ft_lsdata_print(dir); */
|
||||
}
|
||||
return (0);
|
||||
|
|
|
|||
Loading…
Reference in a new issue