diff options
author | leo-arch <leonardoabramovich2@gmail.com> | 2024-04-23 15:17:23 -0300 |
---|---|---|
committer | leo-arch <leonardoabramovich2@gmail.com> | 2024-04-23 15:17:23 -0300 |
commit | 318cad1b951c9747fb13c2e57505732645230635 (patch) | |
tree | 65a0b801f23a6885aa5f9ba78a957db1a5d4e895 | |
parent | 9fc5b5126005bd306453c80c9ecd49ddd40ade3c (diff) |
Check target name when creating symlink
-rw-r--r-- | src/file_operations.c | 10 |
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) |