diff --git a/Makefile b/Makefile index f7f7a71..81059e2 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ CC?=cc all: $(CC) builder/builder.c $(CFLAGS) -obuild ./build + rm build clean: rm bin/* diff --git a/TODO b/TODO index 5336dad..92b6c8b 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,7 @@ With "micro-" prefix *Todo: +*nl tail expr uniq diff --git a/coreutils/chgrp.c b/coreutils/chgrp.c index 0649f07..821b343 100644 --- a/coreutils/chgrp.c +++ b/coreutils/chgrp.c @@ -10,18 +10,18 @@ #include "recurse.h" unsigned int r_flag; -char *f_flag; +char *f_flag = "chgrp"; unsigned int H_flag; int change(const char *path, void *p) { struct group *grp = (struct group *)p; struct stat stat_path; - if (mu_get_stat("chgrp", path, &stat_path)) + if (mu_get_stat(f_flag, path, &stat_path)) return 1; if (lchown(path, stat_path.st_uid, grp->gr_gid)) { - if (!f_flag) + if (f_flag) fprintf(stderr, "chgrp: %s: %s\n", path, strerror(errno)); return 1; @@ -40,7 +40,7 @@ int main(int argc, char **argv) { break; case 'f': - f_flag = "chgrp"; + f_flag = NULL; break; case 'H': @@ -63,14 +63,22 @@ int main(int argc, char **argv) { struct group *grp = getgrnam(argv[0]); if (!grp) { - fprintf(stderr, "chgrp: unknow group\n"); + if (f_flag) + fprintf(stderr, "chgrp: unknow group\n"); + return 1; } int ret = 0; - for (int i = 1; i < argc; i++) - if (mu_recurse(f_flag, H_flag, argv[i], (void *)grp, change, change)) - ret = 1; + for (int i = 1; i < argc; i++) { + if (r_flag) { + if (mu_recurse(f_flag, H_flag, argv[i], (void *)grp, change, change)) + ret = 1; + } + + else + change(argv[i], grp); + } return ret; } diff --git a/coreutils/chmod.c b/coreutils/chmod.c index 0b25ffb..d75fc6f 100644 --- a/coreutils/chmod.c +++ b/coreutils/chmod.c @@ -10,7 +10,7 @@ #include "recurse.h" unsigned int r_flag; -char *f_flag; +char *f_flag = "chmod"; unsigned int H_flag; int change(const char *file, void *p) { @@ -22,7 +22,7 @@ int change(const char *file, void *p) { mode_t mode = mu_parse_mode(mode_arg, old_file.st_mode); if (chmod(file, mode) != 0) { - if (!f_flag) + if (f_flag) fprintf(stderr, "chmod: unable to chown %s: %s\n", file, strerror(errno)); return 1; @@ -54,7 +54,7 @@ int main(int argc, char **argv) { break; case 'f': - f_flag = "chmod"; + f_flag = NULL; break; case 'H': @@ -80,9 +80,15 @@ int main(int argc, char **argv) { arg[0] = '-'; int ret = 0; - for (int i = 1; i < argc; i++) - if (mu_recurse(f_flag, H_flag, argv[i], argv[0], change, change)) - ret = 1; + for (int i = 1; i < argc; i++) { + if (r_flag) { + if (mu_recurse(f_flag, H_flag, argv[i], argv[0], change, change)) + ret = 1; + } + + else + change(argv[i], argv[0]); + } return ret; } diff --git a/coreutils/chown.c b/coreutils/chown.c index b1b7ba1..bb35c56 100644 --- a/coreutils/chown.c +++ b/coreutils/chown.c @@ -12,7 +12,7 @@ #include "unused.h" unsigned int r_flag; -char *f_flag; +char *f_flag = "chown"; unsigned int H_flag; int (*chown_func)(const char *pathname, uid_t owner, gid_t group); long gid; @@ -21,7 +21,7 @@ long uid; int change(const char *file, void *p) { UNUSED(p); if (chown_func(file, uid, gid)) { - if (!f_flag) + if (f_flag) fprintf(stderr, "chown: unable to chown %s: %s\n", file, strerror(errno)); return 1; @@ -48,7 +48,7 @@ void get_owner(const char *arg) { struct group *grp = getgrnam(group); if (!grp) { - if (!f_flag) + if (f_flag) fprintf(stderr, "chown: invalid group: %s\n", group); exit(1); @@ -60,7 +60,7 @@ void get_owner(const char *arg) { if (u_flag) { struct passwd *pwd = getpwnam(arg); if (!pwd) { - if (!f_flag) + if (f_flag) fprintf(stderr, "chown: invalid user: %s\n", arg); exit(1); @@ -81,7 +81,7 @@ int main(int argc, char **argv) { break; case 'f': - f_flag = "chmod"; + f_flag = NULL; break; case 'H': @@ -108,9 +108,15 @@ int main(int argc, char **argv) { get_owner(argv[0]); int ret = 0; - for (int i = 1; i < argc; i++) - if (mu_recurse(f_flag, H_flag, argv[i], NULL, change, change)) - ret = 1; + for (int i = 1; i < argc; i++) { + if (r_flag) { + if (mu_recurse(f_flag, H_flag, argv[i], NULL, change, change)) + ret = 1; + } + + else + change(argv[i], NULL); + } return ret; } diff --git a/coreutils/cp.c b/coreutils/cp.c index 0b8521c..47f534d 100644 --- a/coreutils/cp.c +++ b/coreutils/cp.c @@ -10,7 +10,7 @@ #include "make_path.h" #include "get_stat.h" -char *f_flag; +char *f_flag = "cp"; unsigned int r_flag; int write_buffer(int mode, int ifd, int ofd, const char *dst) { @@ -84,7 +84,7 @@ int copy(int mode, const char *src, const char *dst) { } if (write_buffer(mode, ifd, ofd, new_path)) - if (!f_flag) + if (f_flag) fprintf(stderr, "cp: (%s %s) %s\n", src, dst, strerror(errno)); @@ -110,7 +110,7 @@ int cptree(const char *src, const char *dst) { if (!S_ISDIR(stat_path.st_mode)) { if (copy(stat_path.st_mode, src, dst)) { - if (!f_flag) + if (f_flag) fprintf(stderr, "cp: (%s %s): copy() failed (%s)\n", src, dst, strerror(errno)); return 1; @@ -123,7 +123,7 @@ int cptree(const char *src, const char *dst) { return 0; else if (mkdir(dst, 0777) < 0) - if (!f_flag) + if (f_flag) fprintf(stderr, "cp: %s\n", strerror(errno)); DIR *dir = opendir(src); @@ -165,7 +165,7 @@ int main(int argc, char **argv) { while ((opt = getopt(argc, argv, "frR")) != -1) { switch (opt) { case 'f': - f_flag = "cp"; + f_flag = NULL; break; case 'r': diff --git a/coreutils/ls.c b/coreutils/ls.c index d6bff48..df54ba8 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -252,7 +252,8 @@ void col_print(struct d_node **node, size_t files, struct winsize w) { /* Mc print */ for (size_t i = 0; i < nrows; i++) { for (size_t j = 0; j < ncols; j++) { - if (i * ncols + j < files) { + size_t index = j * nrows + i; + if (index < files) { if (col > 0) { nexttab -= col; col += nexttab; @@ -261,7 +262,7 @@ void col_print(struct d_node **node, size_t files, struct winsize w) { } nexttab = col + (int)maxlen; - col += print(node[i * ncols + j]); + col += print(node[index]); } } diff --git a/coreutils/mv.c b/coreutils/mv.c index 2bae2f9..333f9ff 100644 --- a/coreutils/mv.c +++ b/coreutils/mv.c @@ -6,13 +6,14 @@ #include #include #include "make_path.h" +char *f_flag = "mv"; int move(const char *src, const char *dst) { char *copy = strdup(src); if (!copy) return 1; - char *new_path = mu_make_path("mv", dst, basename(copy)); + char *new_path = mu_make_path(f_flag, dst, basename(copy)); if (new_path == NULL) { free(copy); return 1; @@ -29,13 +30,11 @@ int move(const char *src, const char *dst) { } int main(int argc, char **argv) { - unsigned int f_flag = 0; - int opt; while ((opt = getopt(argc, argv, "f")) != -1) { switch (opt) { case 'f': - f_flag = 1; + f_flag = NULL; break; default: @@ -51,7 +50,7 @@ int main(int argc, char **argv) { for (int i = 0; i < argc - 1; i++) { if (rename(argv[i], argv[argc - 1]) < 0) { if (move(argv[i], argv[argc - 1])) { - if (!f_flag) + if (f_flag) fprintf(stderr, "mv: %s %s\n", argv[i], strerror(errno)); return 1; diff --git a/coreutils/nl.c b/coreutils/nl.c index 4866b87..b84f4bf 100644 --- a/coreutils/nl.c +++ b/coreutils/nl.c @@ -16,13 +16,15 @@ int nl(const char *path) { fp = fopen(path, "r"); if (fp == NULL) { - fprintf(stderr, "rev: %s: %s\n", path, strerror(errno)); + fprintf(stderr, "nl: %s: %s\n", path, strerror(errno)); return 1; } char buf[BUF_SIZE + 1]; while (fgets(buf, sizeof(buf), fp)) { - if (strlen(buf) > 1) + size_t len = strlen(buf); + + if (len > 1) fprintf(stdout, "%*u\t%s", w_flag, lines++, buf); else diff --git a/coreutils/nohup.c b/coreutils/nohup.c index 94c0aa8..9681faa 100644 --- a/coreutils/nohup.c +++ b/coreutils/nohup.c @@ -12,6 +12,9 @@ int main(int argc, char **argv) { return 1; } + if (fork() != 0) + return 0; + signal(SIGHUP, SIG_IGN); if (isatty(STDOUT_FILENO)) { diff --git a/coreutils/rm.c b/coreutils/rm.c index 5b476c7..8262de8 100644 --- a/coreutils/rm.c +++ b/coreutils/rm.c @@ -9,14 +9,14 @@ #include "recurse.h" #include "unused.h" -char *f_flag; +char *f_flag = "rm"; unsigned int r_flag; int rm(const char *path, void *p) { UNUSED(p); - if (unlink(path) < 0) { - if (!f_flag) - fprintf(stderr, "rm: %s: is not directory\n", path); + if (remove(path) < 0) { + if (f_flag) + fprintf(stderr, "rm: %s: %s\n", path, strerror(errno)); return 1; } @@ -27,8 +27,8 @@ int rm(const char *path, void *p) { int rmd(const char *path, void *p) { UNUSED(p); if (rmdir(path) < 0) { - if (!f_flag) - fprintf(stderr, "rm: %s: is not directory\n", path); + if (f_flag) + fprintf(stderr, "rm: %s: %s\n", path, strerror(errno)); return 1; } @@ -41,7 +41,7 @@ int main(int argc, char **argv) { while ((opt = getopt(argc, argv, "frR")) != -1) { switch (opt) { case 'f': - f_flag = "rm"; + f_flag = NULL; break; case 'r': @@ -71,13 +71,14 @@ int main(int argc, char **argv) { } - if (!r_flag) { - if (rm(argv[i], NULL)) + if (r_flag) { + if (mu_recurse(f_flag, 1, argv[i], NULL, rm, rmd)) ret = 1; } - else if (mu_recurse(f_flag, 1, argv[i], NULL, rm, rmd)) - ret = 1; + else + if (rm(argv[i], NULL)) + ret = 1; } return ret; diff --git a/findutils/xargs.c b/findutils/xargs.c index 110408a..44da7a4 100644 --- a/findutils/xargs.c +++ b/findutils/xargs.c @@ -96,6 +96,10 @@ int run(void) { } int main(int argc, char **argv) { + for (int i = 0; i < argc; i++) + if (argv[i][0] == '-') + argc--; + int opt; while ((opt = getopt(argc, argv, "tn:r")) != -1) { switch (opt) {