From 5eda08233d23bbcb3edbc07c39e35ed5b8ec68d4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 30 Oct 2023 18:45:24 +0300 Subject: [PATCH] fix --- coreutils/ls.c | 57 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/coreutils/ls.c b/coreutils/ls.c index dd1bbbf..6dd973b 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -13,6 +14,27 @@ unsigned int a_flag; unsigned int l_flag; +int get_stat(const char *path, struct stat *stat_path) { + if (stat(path, stat_path)) { + fprintf(stderr, "rm: unable to stat %s: %s\n", path, strerror(errno)); + return 1; + } + + return 0; +} + +char *make_path(const char *src, const char *dst) { + size_t len = strlen(src) + strlen(dst) + 2; + char *full_path = malloc(len + 1); + if (full_path == NULL) { + fprintf(stderr, "cp: malloc() returned NULL\n"); + return NULL; + } + + snprintf(full_path, len, "%s/%s", src, dst); + return full_path; +} + void PrintPerm(struct stat sb) { printf("%c", (S_ISDIR(sb.st_mode)) ? 'd' : '-'); printf("%c%c%c", (sb.st_mode & S_IRUSR) ? 'r' : '-', (sb.st_mode & S_IWUSR) ? 'w' : '-', (sb.st_mode & S_IXUSR) ? 'x' : '-'); @@ -22,10 +44,8 @@ void PrintPerm(struct stat sb) { char *fileflag(const char *path) { struct stat sb; - if (stat(path, &sb)) { - fprintf(stderr, "ls: unable to stat %s: %s\n", path, strerror(errno)); + if (get_stat(path, &sb)) return " "; - } if (S_ISDIR(sb.st_mode)) return "/"; @@ -60,7 +80,7 @@ void PrintInfo(struct stat sb, const char *filename) { int list(const char *path, int label) { struct stat sb; if (lstat(path, &sb)) { - fprintf(stderr, "ls: unable to stat %s: %s\n", path, strerror(errno)); + fprintf(stderr, "ls: unable to lstat %s: %s\n", path, strerror(errno)); return 1; } @@ -79,32 +99,33 @@ int list(const char *path, int label) { if (label) printf("\n%s: \n", path); - if (chdir(path)) { + /* Open and print dir */ + DIR *dp = opendir(path); + if (dp == NULL) { fprintf(stderr, "ls: %s: %s\n", path, strerror(errno)); return 1; } - /* Open and print dir */ - DIR *dp = opendir("."); - if (dp == NULL) - return 1; - struct dirent *ep; while ((ep = readdir(dp)) != NULL) { if (ep->d_name[0] == '.' && !a_flag) continue; - if (l_flag) { - if (stat(ep->d_name, &sb) == -1) { - fprintf(stderr, "ls: lstat()\n"); - return 1; - } + char *full_path = make_path(path, ep->d_name); + if (full_path == NULL) + return 1; - PrintInfo(sb, ep->d_name); + if (l_flag) { + if (get_stat(full_path, &sb)) + return 1; + + PrintInfo(sb, full_path); } else - printf("%s%s ", ep->d_name, fileflag(ep->d_name)); + printf("%s%s\n", ep->d_name, fileflag(full_path)); + + free(full_path); } @@ -140,7 +161,7 @@ int main(const int argc, const char **argv) { return list(argv[i], 0); else - for (int i = 1; i < argc; i++) + for (; i < argc; i++) if (list(argv[i], 1)) return 1;