From 38224a9fd97ee047951bb8ab99a089d5c67aebe5 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 15 Aug 2013 15:07:57 -0500 Subject: [PATCH] unix_apply.c: Allow creating symlinks and hardlinks over existing files --- src/unix_apply.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/unix_apply.c b/src/unix_apply.c index fd5d972d..bd576ef0 100644 --- a/src/unix_apply.c +++ b/src/unix_apply.c @@ -81,21 +81,33 @@ unix_create_directory(const tchar *path, struct apply_ctx *ctx) } static int -unix_create_hardlink(const tchar *oldpath, const tchar *newpath, - struct apply_ctx *ctx) +unix_makelink(const tchar *oldpath, const tchar *newpath, + int (*makelink)(const tchar *oldpath, const tchar *newpath)) { - if (link(oldpath, newpath)) + if ((*makelink)(oldpath, newpath)) { + if (errno == EEXIST) { + if (unlink(newpath)) + return WIMLIB_ERR_LINK; + if ((*makelink)(oldpath, newpath)) + return WIMLIB_ERR_LINK; + return 0; + } return WIMLIB_ERR_LINK; + } return 0; } +static int +unix_create_hardlink(const tchar *oldpath, const tchar *newpath, + struct apply_ctx *ctx) +{ + return unix_makelink(oldpath, newpath, link); +} static int unix_create_symlink(const tchar *oldpath, const tchar *newpath, struct apply_ctx *ctx) { - if (symlink(oldpath, newpath)) - return WIMLIB_ERR_LINK; - return 0; + return unix_makelink(oldpath, newpath, symlink); } static int -- 2.43.0