-l almost done, still need to do + for ACL, maj/min for CHR and BLK

This commit is contained in:
Jack Halford 2016-09-25 02:30:25 +02:00
parent 8c13c75f3b
commit 0a4d0b0cb1
9 changed files with 226 additions and 24 deletions

View file

@ -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 */

View file

@ -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);

@ -1 +1 @@
Subproject commit 8bfb8fb462d914837fb76e95141cdce59b3c99f9
Subproject commit d351b97f35fbb2551cfaab92322cac8524112486

View file

@ -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
View 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
View 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);
}

View file

@ -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);
}

View file

@ -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");
}
void ft_ls_l(t_lsdata *data)
if (ent)
{
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);
if (ft_strchr(opts, 'l'))
ft_ls_long(ent);
else
ft_ls_short(ent);
}
}
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);
}
}

View file

@ -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);