From 2baf1cc107ba6041a3856b77d33140ac876ad6f0 Mon Sep 17 00:00:00 2001 From: midipix Date: Thu, 21 Jun 2018 09:50:26 -0400 Subject: link mode: --disable-{shared|static}: use differently-named placeholders. --- src/internal/slibtool_symlink_impl.c | 44 ++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 5 deletions(-) (limited to 'src/internal/slibtool_symlink_impl.c') 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")); +} -- cgit v1.2.3