summaryrefslogtreecommitdiff
path: root/unrar/unrar/hardlinks.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'unrar/unrar/hardlinks.cpp')
-rw-r--r--unrar/unrar/hardlinks.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/unrar/unrar/hardlinks.cpp b/unrar/unrar/hardlinks.cpp
new file mode 100644
index 0000000..171b5fa
--- /dev/null
+++ b/unrar/unrar/hardlinks.cpp
@@ -0,0 +1,37 @@
+bool ExtractHardlink(CommandData *Cmd,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize)
+{
+ if (!FileExist(NameExisting))
+ {
+ uiMsg(UIERROR_HLINKCREATE,NameNew);
+ uiMsg(UIERROR_NOLINKTARGET);
+ ErrHandler.SetErrorCode(RARX_CREATE);
+ return false;
+ }
+ CreatePath(NameNew,true,Cmd->DisableNames);
+
+#ifdef _WIN_ALL
+ bool Success=CreateHardLink(NameNew,NameExisting,NULL)!=0;
+ if (!Success)
+ {
+ uiMsg(UIERROR_HLINKCREATE,NameNew);
+ ErrHandler.SysErrMsg();
+ ErrHandler.SetErrorCode(RARX_CREATE);
+ }
+ return Success;
+#elif defined(_UNIX)
+ char NameExistingA[NM],NameNewA[NM];
+ WideToChar(NameExisting,NameExistingA,ASIZE(NameExistingA));
+ WideToChar(NameNew,NameNewA,ASIZE(NameNewA));
+ bool Success=link(NameExistingA,NameNewA)==0;
+ if (!Success)
+ {
+ uiMsg(UIERROR_HLINKCREATE,NameNew);
+ ErrHandler.SysErrMsg();
+ ErrHandler.SetErrorCode(RARX_CREATE);
+ }
+ return Success;
+#else
+ return false;
+#endif
+}
+