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. Comments from Vladimir Oleynik influenced the final patch, and I also ripped out the in-file changelog since it belongs here. At the time, it said: /* Apr 15, 2004 Matthew S. Wood (mwood@realmsys.com) * * Implement '-b' (backup) flag. * Implement '-S' (backup suffix) flag. * * * Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org) * * Fixed bug involving -n option. Essentially, -n was always in effect. */
This commit is contained in:
parent
fdc4c203e5
commit
3071e2fda3
@ -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 (mjn3@codepoet.org)
|
||||
*
|
||||
* 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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user