diff --git a/TODO b/TODO index feac854..ea8f582 100644 --- a/TODO +++ b/TODO @@ -10,12 +10,10 @@ cal nice renice nohup -chmod split truncate date tee -ln tr cut shuf diff --git a/coreutils/ln.c b/coreutils/ln.c index ee50212..cbda81f 100644 --- a/coreutils/ln.c +++ b/coreutils/ln.c @@ -2,11 +2,16 @@ #include #include #include +#include "make_path.h" /* Symbolic */ unsigned int s_flag; +unsigned int f_flag; + +int ln(const char *src, const char *dst) { + if (f_flag) + unlink(dst); -int single_link(const char *src, const char *dst) { if (s_flag) return symlink(src, dst); @@ -24,17 +29,29 @@ int main(const int argc, const char **argv) { else if (!strcmp("-s", argv[i])) s_flag = 1; + else if (!strcmp("-f", argv[i])) + f_flag = 1; + else if (!strcmp("--help", argv[i])) { - printf("ln [-s] [TARGET] [LINK/DIR]\n"); + printf("ln [-f force] [-s symbolic] [TARGET] [LINK/DIR]\n"); return 0; } } if (argc - i == 2) { - if (single_link(argv[i], argv[i + 1])) { - fprintf(stderr, "ln: %s %s\n", argv[i], strerror(errno)); - return 1; + if (ln(argv[i], argv[i + 1])) { + char *new_path = mu_make_path("ln", argv[i + 1], argv[i]); + if (new_path == NULL) + return 1; + + if (ln(argv[i], new_path)) { + free(new_path); + fprintf(stderr, "ln: %s %s\n", argv[i], strerror(errno)); + return 1; + } + + free(new_path); } }