Patch from Matthew S. Wood: > The following patch adds support for the -S and -b flags to `ln'. These > flags [especially -b] are used extensively in Debian pre and post > installation scripts.
No binary (build failed)
—
(log yok)
| @@ -21,21 +21,20 @@ | |
| */ | |
| /* BB_AUDIT SUSv3 compliant */ | |
| - | /* BB_AUDIT GNU options missing: -b, -d, -F, -i, -S, and -v. */ |
| + | /* BB_AUDIT GNU options missing: -d, -F, -i, and -v. */ |
| /* http://www.opengroup.org/onlinepubs/007904975/utilities/ln.html */ | |
| - | /* Mar 16, 2003 Manuel Novoa III ([email protected]) |
| - | * |
| - | * Fixed bug involving -n option. Essentially, -n was always in effect. |
| - | */ |
| - | |
| + | #include <stdio.h> |
| #include <stdlib.h> | |
| #include <unistd.h> | |
| + | #include <errno.h> |
| #include "busybox.h" | |
| #define LN_SYMLINK 1 | |
| #define LN_FORCE 2 | |
| #define LN_NODEREFERENCE 4 | |
| + | #define LN_BACKUP 8 |
| + | #define LN_SUFFIX 16 |
| extern int ln_main(int argc, char **argv) | |
| { | |
| @@ -44,10 +43,11 @@ extern int ln_main(int argc, char **argv) | |
| char *last; | |
| char *src_name; | |
| char *src; | |
| + | char *suffix = "~"; |
| struct stat statbuf; | |
| int (*link_func)(const char *, const char *); | |
| - | flag = bb_getopt_ulflags(argc, argv, "sfn"); |
| + | flag = bb_getopt_ulflags(argc, argv, "sfnbS:", &suffix); |
| if (argc == optind) { | |
| bb_show_usage(); | |
| @@ -80,7 +80,23 @@ extern int ln_main(int argc, char **argv) | |
| continue; | |
| } | |
| - | if (flag & LN_FORCE) { |
| + | if (flag & LN_BACKUP) { |
| + | char *backup = NULL; |
| + | bb_xasprintf(&backup, "%s%s", src, suffix); |
| + | if (rename(src, backup) < 0 && errno != ENOENT) { |
| + | bb_perror_msg(src); |
| + | status = EXIT_FAILURE; |
| + | free(backup); |
| + | continue; |
| + | } |
| + | free(backup); |
| + | /* |
| + | * When the source and dest are both hard links to the same |
| + | * inode, a rename may succeed even though nothing happened. |
| + | * Therefore, always unlink(). |
| + | */ |
| + | unlink(src); |
| + | } else if (flag & LN_FORCE) { |
| unlink(src); | |
| } | |