summaryrefslogtreecommitdiff
path: root/src/internal/slibtool_symlink_impl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal/slibtool_symlink_impl.c')
-rw-r--r--src/internal/slibtool_symlink_impl.c44
1 files changed, 39 insertions, 5 deletions
diff --git a/src/internal/slibtool_symlink_impl.c b/src/internal/slibtool_symlink_impl.c
index 72d693a..b5b9b28 100644
--- a/src/internal/slibtool_symlink_impl.c
+++ b/src/internal/slibtool_symlink_impl.c
@@ -11,6 +11,7 @@
#include "slibtool_errinfo_impl.h"
#include "slibtool_symlink_impl.h"
+#include "slibtool_readlink_impl.h"
#define SLBT_DEV_NULL_FLAGS (SLBT_DRIVER_ALL_STATIC \
| SLBT_DRIVER_DISABLE_SHARED \
@@ -29,19 +30,29 @@ int slbt_create_symlink(
char * dotdot;
char tmplnk [PATH_MAX];
char lnkarg [PATH_MAX];
+ char alnkarg[PATH_MAX];
char atarget[PATH_MAX];
+ char * suffix = 0;
- /* atarget */
+ /* symlink is a placeholder? */
if ((dctx->cctx->drvflags & SLBT_DEV_NULL_FLAGS)
- && !strcmp(target,"/dev/null"))
- slash = target;
- else if ((slash = strrchr(target,'/')))
+ && !strcmp(target,"/dev/null")) {
+ slash = target;
+ suffix = ".disabled";
+
+ /* symlink target contains a dirname? */
+ } else if ((slash = strrchr(target,'/'))) {
slash++;
- else
+
+ /* symlink target is a basename */
+ } else {
slash = target;
+ }
+ /* .la wrapper? */
dotdot = flawrapper ? "../" : "";
+ /* atarget */
if ((size_t)snprintf(atarget,sizeof(atarget),"%s%s",
dotdot,slash) >= sizeof(atarget))
return SLBT_BUFFER_ERROR(dctx);
@@ -51,6 +62,12 @@ int slbt_create_symlink(
lnkname) >= sizeof(tmplnk))
return SLBT_BUFFER_ERROR(dctx);
+ /* placeholder? */
+ if (suffix) {
+ sprintf(alnkarg,"%s%s",lnkname,suffix);
+ lnkname = alnkarg;
+ }
+
/* lnkarg */
strcpy(lnkarg,lnkname);
@@ -90,3 +107,20 @@ int slbt_create_symlink(
? SLBT_SYSTEM_ERROR(dctx)
: 0;
}
+
+int slbt_symlink_is_a_placeholder(char * lnkpath)
+{
+ size_t len;
+ char slink [PATH_MAX];
+ char target[PATH_MAX];
+ const char suffix[] = ".disabled";
+
+ if ((sizeof(slink)-sizeof(suffix)) < (len=strlen(lnkpath)))
+ return 0;
+
+ memcpy(slink,lnkpath,len);
+ memcpy(&slink[len],suffix,sizeof(suffix));
+
+ return (!slbt_readlink(slink,target,sizeof(target)))
+ && (!strcmp(target,"/dev/null"));
+}