summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorleo-arch <leonardoabramovich2@gmail.com>2024-04-23 15:17:23 -0300
committerleo-arch <leonardoabramovich2@gmail.com>2024-04-23 15:17:23 -0300
commit318cad1b951c9747fb13c2e57505732645230635 (patch)
tree65a0b801f23a6885aa5f9ba78a957db1a5d4e895
parent9fc5b5126005bd306453c80c9ecd49ddd40ade3c (diff)
Check target name when creating symlink
-rw-r--r--src/file_operations.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/file_operations.c b/src/file_operations.c
index 462863b2..50b979e8 100644
--- a/src/file_operations.c
+++ b/src/file_operations.c
@@ -1174,10 +1174,19 @@ symlink_file(char **args)
char *target = args[0];
char *link_name = args[1];
char tmp[PATH_MAX + 1];
+ struct stat a;
if (!link_name || !*link_name) {
char *p = strrchr(target, '/');
snprintf(tmp, sizeof(tmp), "%s.link", (p && p[1]) ? p + 1 : target);
+
+ int suffix = 1;
+ while (lstat(tmp, &a) == 0 && suffix < INT_MAX) {
+ snprintf(tmp, sizeof(tmp), "%s.link-%d",
+ (p && p[1]) ? p + 1 : target, suffix);
+ suffix++;
+ }
+
link_name = tmp;
}
@@ -1185,7 +1194,6 @@ symlink_file(char **args)
if (len > 1 && link_name[len - 1] == '/')
link_name[len - 1] = '\0';
- struct stat a;
if (lstat(target, &a) == -1) {
printf("link: '%s': %s\n", target, strerror(errno));
if (rl_get_y_or_n(_("Create broken symbolic link? [y/n] ")) == 0)