26 |
int ln_main(int argc, char **argv) |
int ln_main(int argc, char **argv) |
27 |
{ |
{ |
28 |
int status = EXIT_SUCCESS; |
int status = EXIT_SUCCESS; |
29 |
int flag; |
int opts; |
30 |
char *last; |
char *last; |
31 |
char *src_name; |
char *src_name; |
32 |
char *src; |
char *src; |
34 |
struct stat statbuf; |
struct stat statbuf; |
35 |
int (*link_func)(const char *, const char *); |
int (*link_func)(const char *, const char *); |
36 |
|
|
37 |
flag = getopt32(argv, "sfnbS:", &suffix); |
opt_complementary = "-1"; /* min one arg */ |
38 |
|
opts = getopt32(argv, "sfnbS:", &suffix); |
|
if (argc == optind) { |
|
|
bb_show_usage(); |
|
|
} |
|
39 |
|
|
40 |
last = argv[argc - 1]; |
last = argv[argc - 1]; |
41 |
argv += optind; |
argv += optind; |
50 |
src = last; |
src = last; |
51 |
|
|
52 |
if (is_directory(src, |
if (is_directory(src, |
53 |
(flag & LN_NODEREFERENCE) ^ LN_NODEREFERENCE, |
(opts & LN_NODEREFERENCE) ^ LN_NODEREFERENCE, |
54 |
NULL) |
NULL) |
55 |
) { |
) { |
56 |
src_name = xstrdup(*argv); |
src_name = xstrdup(*argv); |
58 |
free(src_name); |
free(src_name); |
59 |
src_name = src; |
src_name = src; |
60 |
} |
} |
61 |
if (!(flag & LN_SYMLINK) && stat(*argv, &statbuf)) { |
if (!(opts & LN_SYMLINK) && stat(*argv, &statbuf)) { |
62 |
// coreutils: "ln dangling_symlink new_hardlink" works |
// coreutils: "ln dangling_symlink new_hardlink" works |
63 |
if (lstat(*argv, &statbuf) || !S_ISLNK(statbuf.st_mode)) { |
if (lstat(*argv, &statbuf) || !S_ISLNK(statbuf.st_mode)) { |
64 |
bb_simple_perror_msg(*argv); |
bb_simple_perror_msg(*argv); |
68 |
} |
} |
69 |
} |
} |
70 |
|
|
71 |
if (flag & LN_BACKUP) { |
if (opts & LN_BACKUP) { |
72 |
char *backup; |
char *backup; |
73 |
backup = xasprintf("%s%s", src, suffix); |
backup = xasprintf("%s%s", src, suffix); |
74 |
if (rename(src, backup) < 0 && errno != ENOENT) { |
if (rename(src, backup) < 0 && errno != ENOENT) { |
84 |
* Therefore, always unlink(). |
* Therefore, always unlink(). |
85 |
*/ |
*/ |
86 |
unlink(src); |
unlink(src); |
87 |
} else if (flag & LN_FORCE) { |
} else if (opts & LN_FORCE) { |
88 |
unlink(src); |
unlink(src); |
89 |
} |
} |
90 |
|
|
91 |
link_func = link; |
link_func = link; |
92 |
if (flag & LN_SYMLINK) { |
if (opts & LN_SYMLINK) { |
93 |
link_func = symlink; |
link_func = symlink; |
94 |
} |
} |
95 |
|
|