summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2021-04-15 10:06:44 +0000
committermidipix <writeonce@midipix.org>2021-04-15 13:26:15 +0000
commitcc0827cebd811eab83d091ffde3780e5c0084160 (patch)
tree87209192602b7a0f61d774632e03339c9bffe9a7
parent1ce3d5d23f5c66c8223b5567f0d7d5b630e819e1 (diff)
downloadslibtool-cc0827cebd811eab83d091ffde3780e5c0084160.tar.bz2
slibtool-cc0827cebd811eab83d091ffde3780e5c0084160.tar.xz
internals: slbt_create_symlink(): properly handle absolute-path link targets.
-rw-r--r--src/internal/slibtool_symlink_impl.c14
-rw-r--r--src/internal/slibtool_symlink_impl.h6
-rw-r--r--src/logic/slbt_exec_install.c6
-rw-r--r--src/logic/slbt_exec_link.c31
4 files changed, 37 insertions, 20 deletions
diff --git a/src/internal/slibtool_symlink_impl.c b/src/internal/slibtool_symlink_impl.c
index ca7f6cd..0b1daa0 100644
--- a/src/internal/slibtool_symlink_impl.c
+++ b/src/internal/slibtool_symlink_impl.c
@@ -23,9 +23,11 @@ int slbt_create_symlink(
struct slbt_exec_ctx * ectx,
const char * target,
const char * lnkname,
- bool flawrapper)
+ uint32_t options)
{
int fdcwd;
+ int fliteral;
+ int fwrapper;
char ** oargv;
const char * slash;
char * ln[5];
@@ -36,12 +38,20 @@ int slbt_create_symlink(
char atarget[PATH_MAX];
char * suffix = 0;
+ /* options */
+ fliteral = (options & SLBT_SYMLINK_LITERAL);
+ fwrapper = (options & SLBT_SYMLINK_WRAPPER);
+
/* symlink is a placeholder? */
if ((dctx->cctx->drvflags & SLBT_DEV_NULL_FLAGS)
&& !strcmp(target,"/dev/null")) {
slash = target;
suffix = ".disabled";
+ /* target is an absolute path? */
+ } else if (fliteral) {
+ slash = target;
+
/* symlink target contains a dirname? */
} else if ((slash = strrchr(target,'/'))) {
slash++;
@@ -52,7 +62,7 @@ int slbt_create_symlink(
}
/* .la wrapper? */
- dotdot = flawrapper ? "../" : "";
+ dotdot = fwrapper ? "../" : "";
/* atarget */
if ((size_t)snprintf(atarget,sizeof(atarget),"%s%s",
diff --git a/src/internal/slibtool_symlink_impl.h b/src/internal/slibtool_symlink_impl.h
index 402208c..5619e75 100644
--- a/src/internal/slibtool_symlink_impl.h
+++ b/src/internal/slibtool_symlink_impl.h
@@ -4,12 +4,16 @@
#include <stdbool.h>
#include <slibtool/slibtool.h>
+#define SLBT_SYMLINK_DEFAULT 0x0000
+#define SLBT_SYMLINK_LITERAL 0x0001
+#define SLBT_SYMLINK_WRAPPER 0x0002
+
int slbt_create_symlink(
const struct slbt_driver_ctx * dctx,
struct slbt_exec_ctx * ectx,
const char * target,
const char * lnkname,
- bool flawrapper);
+ uint32_t options);
int slbt_symlink_is_a_placeholder(int fdcwd, char * lnkpath);
diff --git a/src/logic/slbt_exec_install.c b/src/logic/slbt_exec_install.c
index 3429d91..5e5d440 100644
--- a/src/logic/slbt_exec_install.c
+++ b/src/logic/slbt_exec_install.c
@@ -231,7 +231,7 @@ static int slbt_exec_install_import_libraries(
dctx,ectx,
implib,
hostlnk,
- false))
+ SLBT_SYMLINK_DEFAULT))
return SLBT_NESTED_ERROR(dctx);
return 0;
@@ -540,7 +540,7 @@ static int slbt_exec_install_entry(
if (slbt_create_symlink(
dctx,ectx,
target,dlnkname,
- false))
+ SLBT_SYMLINK_DEFAULT))
return SLBT_NESTED_ERROR(dctx);
if (frelease)
@@ -602,7 +602,7 @@ static int slbt_exec_install_entry(
if (slbt_create_symlink(
dctx,ectx,
target,dlnkname,
- false))
+ SLBT_SYMLINK_DEFAULT))
return SLBT_NESTED_ERROR(dctx);
}
diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c
index 6c0361c..f9bd8d7 100644
--- a/src/logic/slbt_exec_link.c
+++ b/src/logic/slbt_exec_link.c
@@ -1157,7 +1157,7 @@ static int slbt_exec_link_create_import_library(
dctx,ectx,
deffilename,
hosttag,
- false))
+ SLBT_SYMLINK_DEFAULT))
return SLBT_NESTED_ERROR(dctx);
/* libfoo.so.def.{flavor} is under .libs/ */
@@ -1168,7 +1168,7 @@ static int slbt_exec_link_create_import_library(
dctx,ectx,
++slash,
hostlnk,
- false))
+ SLBT_SYMLINK_DEFAULT))
return SLBT_NESTED_ERROR(dctx);
}
@@ -1250,7 +1250,7 @@ static int slbt_exec_link_create_noop_symlink(
dctx,ectx,
"/dev/null",
arfilename,
- false))
+ SLBT_SYMLINK_LITERAL))
return SLBT_NESTED_ERROR(dctx);
return 0;
}
@@ -1362,7 +1362,10 @@ static int slbt_exec_link_create_archive(
if (slbt_exec_link_remove_file(dctx,ectx,arlink))
return SLBT_NESTED_ERROR(dctx);
- if (slbt_create_symlink(dctx,ectx,arfile,arlink,0))
+ if (slbt_create_symlink(
+ dctx,ectx,
+ arfile,arlink,
+ SLBT_SYMLINK_DEFAULT))
return SLBT_NESTED_ERROR(dctx);
}
@@ -1544,7 +1547,7 @@ static int slbt_exec_link_create_library(
dctx,ectx,
dctx->cctx->host.ldrpath,
ectx->rpathfilename,
- 0))
+ SLBT_SYMLINK_LITERAL))
return SLBT_NESTED_ERROR(dctx);
}
@@ -1761,7 +1764,7 @@ static int slbt_exec_link_create_executable(
if (slbt_create_symlink(
dctx,ectx,
dctx->cctx->output,wraplnk,
- false))
+ SLBT_SYMLINK_DEFAULT))
return slbt_exec_link_exit(
&depsmeta,
SLBT_NESTED_ERROR(dctx));
@@ -1800,7 +1803,7 @@ static int slbt_exec_link_create_library_symlink(
if (slbt_create_symlink(
dctx,ectx,
target,lnkname,
- false))
+ SLBT_SYMLINK_DEFAULT))
return SLBT_NESTED_ERROR(dctx);
} else {
sprintf(target,"%s%s.%d.%d.%d%s",
@@ -1838,7 +1841,7 @@ static int slbt_exec_link_create_library_symlink(
return slbt_create_symlink(
dctx,ectx,
target,lnkname,
- false);
+ SLBT_SYMLINK_DEFAULT);
}
int slbt_exec_link(
@@ -1956,7 +1959,7 @@ int slbt_exec_link(
dctx,ectx,
"/dev/null",
ectx->dsofilename,
- false))
+ SLBT_SYMLINK_LITERAL))
return SLBT_NESTED_ERROR(dctx);
/* dynaic library via -module */
@@ -1986,7 +1989,7 @@ int slbt_exec_link(
if (slbt_create_symlink(
dctx,ectx,
target,lnkname,
- false))
+ SLBT_SYMLINK_DEFAULT))
return SLBT_NESTED_ERROR(dctx);
strcpy(target,lnkname);
@@ -1995,7 +1998,7 @@ int slbt_exec_link(
if (slbt_create_symlink(
dctx,ectx,
target,lnkname,
- false))
+ SLBT_SYMLINK_DEFAULT))
return SLBT_NESTED_ERROR(dctx);
}
@@ -2052,7 +2055,7 @@ int slbt_exec_link(
dctx,ectx,
ectx->pimpfilename,
ectx->dimpfilename,
- false))
+ SLBT_SYMLINK_DEFAULT))
return SLBT_NESTED_ERROR(dctx);
/* libfoo.x.y.z.lib.a */
@@ -2096,7 +2099,7 @@ int slbt_exec_link(
dctx,ectx,
output,
ectx->lafilename,
- true)))
+ SLBT_SYMLINK_WRAPPER)))
SLBT_NESTED_ERROR(dctx);
/* .lai wrapper symlink */
@@ -2105,7 +2108,7 @@ int slbt_exec_link(
dctx,ectx,
output,
ectx->laifilename,
- true)))
+ SLBT_SYMLINK_WRAPPER)))
SLBT_NESTED_ERROR(dctx);
/* all done */