summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2016-04-22 17:09:26 -0400
committermidipix <writeonce@midipix.org>2016-04-23 09:25:22 -0400
commit2da3b0fad5a2432bb259131cf72a48eb14f8ec9c (patch)
tree66cb7528d56775ef357a41dc2de1eb128d3a8e17 /src
parenta21ac16a21223b03b38808d0d43d9cf204f4deb7 (diff)
downloadslibtool-2da3b0fad5a2432bb259131cf72a48eb14f8ec9c.tar.bz2
slibtool-2da3b0fad5a2432bb259131cf72a48eb14f8ec9c.tar.xz
added slbt_archive_import(): work around ar(1) MRI parser limitations.
Diffstat (limited to 'src')
-rw-r--r--src/helper/slbt_archive_import.c49
1 files changed, 47 insertions, 2 deletions
diff --git a/src/helper/slbt_archive_import.c b/src/helper/slbt_archive_import.c
index 358b578..b3842f8 100644
--- a/src/helper/slbt_archive_import.c
+++ b/src/helper/slbt_archive_import.c
@@ -7,12 +7,44 @@
#include <stdlib.h>
#include <limits.h>
#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
#include <stdbool.h>
#include <sys/wait.h>
#include <slibtool/slibtool.h>
#include "slibtool_spawn_impl.h"
+static char * slbt_mri_argument(
+ char * arg,
+ char * buf)
+{
+ int i;
+ char * lnk;
+ char mricwd[PATH_MAX];
+ char target[PATH_MAX];
+
+ if ((!(strchr(arg,'+'))) && (!(strchr(arg,'-'))))
+ return arg;
+
+ if (!(getcwd(mricwd,sizeof(mricwd))))
+ return 0;
+
+ if ((size_t)snprintf(target,sizeof(target),"%s/%s",
+ mricwd,arg) >= sizeof(target))
+ return 0;
+
+ for (i=0,lnk=0; i<1024 && !lnk; i++) {
+ if (!(tmpnam(buf)))
+ return 0;
+
+ if (!(symlink(target,buf)))
+ lnk = buf;
+ }
+
+ return lnk;
+}
+
static int slbt_archive_import_child(
char * program,
int fd[2])
@@ -44,6 +76,10 @@ int slbt_archive_import(
int code;
int fd[2];
FILE * fout;
+ char * dst;
+ char * src;
+ char mridst [L_tmpnam];
+ char mrisrc [L_tmpnam];
char program[PATH_MAX];
if ((size_t)snprintf(program,sizeof(program),"%s",
@@ -66,6 +102,9 @@ int slbt_archive_import(
ectx->pid = pid;
+ dst = slbt_mri_argument(dstarchive,mridst);
+ src = slbt_mri_argument(srcarchive,mrisrc);
+
if ((fout = fdopen(fd[1],"a"))) {
ret = (fprintf(
fout,
@@ -73,8 +112,8 @@ int slbt_archive_import(
"ADDLIB %s\n"
"SAVE\n"
"END\n",
- dstarchive,
- srcarchive) < 0)
+ dst,
+ src) < 0)
? -1 : 0;
fclose(fout);
@@ -90,6 +129,12 @@ int slbt_archive_import(
&ectx->exitcode,
0);
+ if (dst == mridst)
+ unlink(dst);
+
+ if (src == mrisrc)
+ unlink(src);
+
return ret || (code != pid) || ectx->exitcode
? -1 : 0;
}