diff --git a/coreutils/chmod.c b/coreutils/chmod.c index bbd163e..5ec51ac 100644 --- a/coreutils/chmod.c +++ b/coreutils/chmod.c @@ -99,7 +99,7 @@ int main(int argc, char **argv) { break; default: - printf("chmod [ugoa]{+|-|=}[rwxXst] / [sstrwxrwxrwx] [file1 file2...]\n\t[-H if a command line argument is a symbolic link]\n\t[-R recursive] [-s silent]\n"); + printf("chmod [ugoa]{+|-}[rwxXst] / [0 - 777] [file1 file2...]\n\t[-H if a command line argument is a symbolic link]\n\t[-R recursive] [-s silent]\n"); return 0; } } diff --git a/coreutils/chown.c b/coreutils/chown.c index 92a0c5b..e3959b2 100644 --- a/coreutils/chown.c +++ b/coreutils/chown.c @@ -104,48 +104,46 @@ void get_owner(const char *arg) { } } -int main(const int argc, char **argv) { +int main(int argc, char **argv) { get_stat = mu_get_lstat; chown_func = lchown; - int i; - for (i = 1; i < argc; i++) { - if (argv[i][0] != '-') - break; + int opt; + while ((opt = getopt(argc, argv, "RfH") != -1)) { + switch (opt) { + case 'R': + r_flag = 1; + break; - else if (!strcmp(argv[i], "-r")) - r_flag = 1; + case 'f': + s_flag = 1; + break; - else if (!strcmp(argv[i], "-s")) - s_flag = 1; + case 'H': + chown_func = chown; + get_stat = mu_get_stat; + break; - else if (!strcmp(argv[i], "-H")) { - chown_func = chown; - get_stat = mu_get_stat; - } - - else if (!strcmp(argv[i], "--help")) { - printf("chown [group] [file1 file2...]\n\t[-H if a command line argument is a symbolic link]\n\t[-r recursive]\n"); - return 0; + default: + printf("chown [group] [file1 file2...]\n\t[-H if a command line argument is a symbolic link]\n\t[-r recursive]\n"); + return 0; } } - if (argc - i == 0) { + if (argv[optind] == NULL) { fprintf(stderr, "chown: missing operand\n"); return 1; } gid = -1; uid = -1; - get_owner(argv[i++]); + get_owner(argv[optind]); - if (argc - i == 0) { - fprintf(stderr, "chown: missing operand\n"); - return 1; - } + argv += optind; + argc -= optind; int ret = 0; - for (; i < argc; i++) + for (int i = 1; i < argc; i++) if (cntree(argv[i])) ret = 1; diff --git a/coreutils/chroot.c b/coreutils/chroot.c index 99c7556..99a5910 100644 --- a/coreutils/chroot.c +++ b/coreutils/chroot.c @@ -6,7 +6,7 @@ int main(const int argc, char **argv) { if (argc < 3 || !strcmp(argv[argc - 1], "--help")) { - printf("chroot [dir] [command arg arg2...]\n"); + printf("chroot [dir] [command] [arg arg2...]\n"); return 0; } diff --git a/coreutils/cp.c b/coreutils/cp.c index 44e0fd1..908ef01 100644 --- a/coreutils/cp.c +++ b/coreutils/cp.c @@ -10,6 +10,8 @@ #include "make_path.h" #include "get_stat.h" +unsigned int s_flag; + int write_buffer(int mode, int ifd, int ofd, const char *dst) { off_t len = lseek(ifd, 0, SEEK_END); if (len <= 0) { @@ -81,7 +83,8 @@ int copy(int mode, const char *src, const char *dst) { } if (write_buffer(mode, ifd, ofd, new_path)) - fprintf(stderr, "cp: (%s %s) %s\n", src, dst, strerror(errno)); + if (!s_flag) + fprintf(stderr, "cp: (%s %s) %s\n", src, dst, strerror(errno)); close(ofd); @@ -106,7 +109,9 @@ int cptree(const char *src, const char *dst) { if (!S_ISDIR(stat_path.st_mode)) { if (copy(stat_path.st_mode, src, dst)) { - fprintf(stderr, "cp: (%s %s): copy() failed (%s)\n", src, dst, strerror(errno)); + if (!s_flag) + fprintf(stderr, "cp: (%s %s): copy() failed (%s)\n", src, dst, strerror(errno)); + return 1; } @@ -114,7 +119,8 @@ int cptree(const char *src, const char *dst) { } else if (mkdir(dst, 0777) < 0) - fprintf(stderr, "cp: %s\n", strerror(errno)); + if (!s_flag) + fprintf(stderr, "cp: %s\n", strerror(errno)); DIR *dir = opendir(src); if (dir == NULL) { @@ -150,25 +156,38 @@ int cptree(const char *src, const char *dst) { return ret; } -int main(const int argc, char **argv) { +int main(int argc, char **argv) { + int opt; + while ((opt = getopt(argc, argv, "frR")) != -1) { + switch (opt) { + case 'f': + s_flag = 1; + break; - int i; - for (i = 1; i < argc; i++) { - if (argv[i][0] != '-') - break; + case 'r': + case 'R': + break; - else if (!strcmp(argv[i], "--help")) { - printf("cp [Src] [Dst]\n"); - return 0; + default: + printf("chmod [src1 src2...] [dst]\n\t[-f silent]\n"); + return 0; } } + if (argv[optind] == NULL) { + fprintf(stderr, "cp: missing operand\n"); + return 1; + } + + argv += optind; + argc -= optind; + int ret = 0; - if (argc - i == 2) - ret = cptree(argv[i], argv[argc - 1]); + if (argc == 2) + ret = cptree(argv[0], argv[argc - 1]); else { - for (; i < argc - 1; i++) { + for (int i = 1; i < argc - 1; i++) { char *new_path = mu_make_path("cp", argv[argc - 1], basename(argv[i])); if (new_path == NULL) return 1; diff --git a/coreutils/du.c b/coreutils/du.c index 5714801..e59a04e 100644 --- a/coreutils/du.c +++ b/coreutils/du.c @@ -48,7 +48,7 @@ double du(const char *path, int recurs_flag) { struct stat sb; if (mu_get_lstat("du", path, &sb)) - return 1; + return 0; if (S_ISDIR(sb.st_mode)) { DIR *dp = opendir(path); @@ -64,7 +64,7 @@ double du(const char *path, int recurs_flag) { char *new_path = mu_make_path("du", path, ep->d_name); if (new_path == NULL) - return 1; + return 0; sum += du(new_path, 1); @@ -92,39 +92,46 @@ double du(const char *path, int recurs_flag) { return sum; } -int main(const int argc, const char **argv) { +int main(int argc, char **argv) { - int i; - for (i = 1; i < argc; i++) { - if (argv[i][0] != '-') - break; + int opt; + while ((opt = getopt(argc, argv, "hsbm")) != -1) { + switch (opt) { + case 'h': + h_flag = 1; + break; - else if (!strcmp(argv[i], "-h")) - h_flag = 1; + case 's': + s_flag = 1; + break; - else if (!strcmp(argv[i], "-s")) - s_flag = 1; + case 'b': + b_flag = 1; + break; - else if (!strcmp(argv[i], "-b")) - b_flag = 1; + case 'm': + b_flag = 1; + m_flag = 1; + break; - else if (!strcmp(argv[i], "-m")) { - b_flag = 1; - m_flag = 1; - } - else if (!strcmp(argv[i], "--help")) { - printf("du [-h Sizes in human readable format (e.g., 1K 243M 2G)] [-s Display only a total for each argument] [-b Apparent size] [-m Size in megabyte] [file file2...]\n"); - return 0; + default: + printf("du [file1 file2...]\n\t[-h Sizes in human readable format (e.g., 1K 243M 2G)]\n\t[-s Display only a total for each argument]\n\t[-b Apparent size] [-m Size in megabyte]\n"); + return 0; } } - if (argc - i == 0) + if (argv[optind] == NULL) du(".", 0); - else - for (; i < argc; i++) + else { + argv += optind; + argc -= optind; + for (int i = 0; i < argc; i++) du(argv[i], 0); + } + return 0; } + diff --git a/coreutils/rm.c b/coreutils/rm.c index d29590e..10c8970 100644 --- a/coreutils/rm.c +++ b/coreutils/rm.c @@ -55,33 +55,43 @@ int rmtree(const char *path) { return ret; } -int main(const int argc, char **argv) { - int i; - for (i = 1; i < argc; i++) { - if (argv[i][0] != '-') - break; +int main(int argc, char **argv) { + int opt; + while ((opt = getopt(argc, argv, "frR")) != -1) { + switch (opt) { + case 'f': + f_flag = 1; + break; - else if (!strcmp(argv[i], "-f")) - f_flag = 1; + case 'r': + case 'R': + break; - else if (!strcmp(argv[i], "--help")) { - printf("rm [-f force] file1 file2...\n"); - return 0; + default: + printf("rm [file1 file2...]\n\t[-f force]\n"); + return 0; } } - int status = 0; - for (; i < argc; i++) { + if (argv[optind] == NULL) { + fprintf(stderr, "rm: missing operand\n"); + return 1; + } + + argv += optind; + argc -= optind; + + int ret = 0; + for (int i = 0; i < argc; i++) { if (!strcmp(argv[i], ".") || !strcmp(argv[i], "..")){ printf("rm: refusing to remove '.' or '..' directory\n"); break; } - int status = rmtree(argv[i]); - if (status != 0) - status = 1; + if (rmtree(argv[i])) + ret = 1; } - return status; + return ret; }