summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2021-05-05 23:29:17 +0000
committermidipix <writeonce@midipix.org>2021-05-05 23:29:17 +0000
commit465de6c0f42fe777f8023fc79f41440d5ec8e365 (patch)
tree04776fd5ea35c257f6b09216b0390aecaae85b8f /src
parent57ed911158ddb499f958edbdc9df93f5125d8aac (diff)
downloadslibtool-465de6c0f42fe777f8023fc79f41440d5ec8e365.tar.bz2
slibtool-465de6c0f42fe777f8023fc79f41440d5ec8e365.tar.xz
install mode: slbt_exec_install_entry: properly handle fussix flavors.
Diffstat (limited to 'src')
-rw-r--r--src/logic/slbt_exec_install.c60
1 files changed, 33 insertions, 27 deletions
diff --git a/src/logic/slbt_exec_install.c b/src/logic/slbt_exec_install.c
index b86e979..124c44d 100644
--- a/src/logic/slbt_exec_install.c
+++ b/src/logic/slbt_exec_install.c
@@ -115,22 +115,16 @@ static int slbt_exec_install_import_libraries(
char * srcdso,
char * dstdir)
{
- int fdcwd;
- char * host;
char * slash;
char * dot;
char * mark;
char srcbuf [PATH_MAX];
char implib [PATH_MAX];
- char hosttag[PATH_MAX];
char hostlnk[PATH_MAX];
char major [128];
char minor [128];
char rev [128];
- /* fdcwd */
- fdcwd = slbt_driver_fdcwd(dctx);
-
/* .libs/libfoo.so.x.y.z */
if ((size_t)snprintf(srcbuf,sizeof(srcbuf),"%s",
srcdso) >= sizeof(srcbuf))
@@ -149,6 +143,13 @@ static int slbt_exec_install_import_libraries(
/* guard against an infinitely long version */
mark = srcbuf + strlen(srcbuf);
+ if (dctx->cctx->asettings.osdfussix[0]) {
+ if (!(dot = strrchr(srcbuf,'.')))
+ return SLBT_CUSTOM_ERROR(dctx,SLBT_ERR_INSTALL_FLOW);
+
+ *dot = 0;
+ }
+
/* rev */
if (!(dot = strrchr(srcbuf,'.')))
return SLBT_CUSTOM_ERROR(dctx,SLBT_ERR_INSTALL_FLOW);
@@ -179,27 +180,9 @@ static int slbt_exec_install_import_libraries(
*dot = 0;
}
- if (!(dot = strrchr(srcbuf,'.')))
- return SLBT_CUSTOM_ERROR(dctx,SLBT_ERR_INSTALL_FLOW);
-
- /* .libs/libfoo.so.def.host */
- if ((size_t)snprintf(hostlnk,sizeof(hostlnk),"%s.def.host",
- srcbuf) >= sizeof(hostlnk))
- return SLBT_BUFFER_ERROR(dctx);
-
- /* libfoo.so.def.{flavor} */
- if (slbt_readlinkat(fdcwd,hostlnk,hosttag,sizeof(hosttag)))
- return SLBT_SYSTEM_ERROR(dctx,hostlnk);
-
- /* host/flabor */
- if (!(host = strrchr(hosttag,'.')))
- return SLBT_CUSTOM_ERROR(dctx,SLBT_ERR_INSTALL_FLOW);
- else
- host++;
-
- /* symlink-based alternate host */
- if (slbt_set_alternate_host(dctx,host,host))
- return SLBT_NESTED_ERROR(dctx);
+ if (!dctx->cctx->asettings.osdfussix[0])
+ if (!(dot = strrchr(srcbuf,'.')))
+ return SLBT_CUSTOM_ERROR(dctx,SLBT_ERR_INSTALL_FLOW);
/* .libs/libfoo.x.y.z.lib.a */
sprintf(dot,"%s%s%s%s",
@@ -345,6 +328,7 @@ static int slbt_exec_install_entry(
int fdcwd;
char * dot;
char * base;
+ char * host;
char * slash;
char * suffix;
char * dsosuffix;
@@ -354,6 +338,7 @@ static int slbt_exec_install_entry(
char dstfile [PATH_MAX];
char slnkname[PATH_MAX];
char dlnkname[PATH_MAX];
+ char hosttag [PATH_MAX];
char lasource[PATH_MAX - 8];
bool fexe = false;
bool fpe;
@@ -447,6 +432,27 @@ static int slbt_exec_install_entry(
strcpy(slnkname,srcfile);
dot = strrchr(slnkname,'.');
+ /* .libs/libfoo.so.def.host */
+ slen = sizeof(slnkname);
+ slen -= (dot - slnkname);
+
+ if ((size_t)snprintf(dot,slen,"%s.def.host",dsosuffix) >= slen)
+ return SLBT_BUFFER_ERROR(dctx);
+
+ /* libfoo.so.def.{flavor} */
+ if (slbt_readlinkat(fdcwd,slnkname,hosttag,sizeof(hosttag)))
+ return SLBT_SYSTEM_ERROR(dctx,slnkname);
+
+ /* host/flabor */
+ if (!(host = strrchr(hosttag,'.')))
+ return SLBT_CUSTOM_ERROR(dctx,SLBT_ERR_INSTALL_FLOW);
+ else
+ host++;
+
+ /* symlink-based alternate host */
+ if (slbt_set_alternate_host(dctx,host,host))
+ return SLBT_NESTED_ERROR(dctx);
+
/* libfoo.a --> libfoo.so.release */
sprintf(dot,"%s.release",dsosuffix);
frelease = fstatat(fdcwd,slnkname,&st,0) ? false : true;