summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--project/headers.mk1
-rw-r--r--src/internal/slibtool_readlink_impl.h24
-rw-r--r--src/logic/slbt_exec_install.c3
3 files changed, 27 insertions, 1 deletions
diff --git a/project/headers.mk b/project/headers.mk
index 7b036f6..eacad87 100644
--- a/project/headers.mk
+++ b/project/headers.mk
@@ -6,6 +6,7 @@ INTERNAL_HEADERS = \
$(PROJECT_DIR)/src/internal/argv/argv.h \
$(PROJECT_DIR)/src/internal/$(PACKAGE)_driver_impl.h \
$(PROJECT_DIR)/src/internal/$(PACKAGE)_install_impl.h \
+ $(PROJECT_DIR)/src/internal/$(PACKAGE)_readlink_impl.h \
$(PROJECT_DIR)/src/internal/$(PACKAGE)_spawn_impl.h \
$(PROJECT_DIR)/src/internal/$(PACKAGE)_symlink_impl.h \
diff --git a/src/internal/slibtool_readlink_impl.h b/src/internal/slibtool_readlink_impl.h
new file mode 100644
index 0000000..f66e10b
--- /dev/null
+++ b/src/internal/slibtool_readlink_impl.h
@@ -0,0 +1,24 @@
+/*******************************************************************/
+/* slibtool: a skinny libtool implementation, written in C */
+/* Copyright (C) 2016 Z. Gilboa */
+/* Released under the Standard MIT License; see COPYING.SLIBTOOL. */
+/*******************************************************************/
+
+#include <unistd.h>
+
+static inline int slbt_readlink(
+ const char * restrict path,
+ char * restrict buf,
+ ssize_t bufsize)
+{
+ ssize_t ret;
+
+ if ((ret = readlink(path,buf,bufsize)) <= 0)
+ return -1;
+ else if (ret == bufsize)
+ return -1;
+ else {
+ buf[ret] = '\0';
+ return 0;
+ }
+}
diff --git a/src/logic/slbt_exec_install.c b/src/logic/slbt_exec_install.c
index 22d1e22..c2e334a 100644
--- a/src/logic/slbt_exec_install.c
+++ b/src/logic/slbt_exec_install.c
@@ -15,6 +15,7 @@
#include <slibtool/slibtool.h>
#include "slibtool_install_impl.h"
+#include "slibtool_readlink_impl.h"
#include "slibtool_spawn_impl.h"
#include "slibtool_symlink_impl.h"
#include "argv/argv.h"
@@ -168,7 +169,7 @@ static int slbt_exec_install_entry(
base = slnkname;
/* source (build) symlink target */
- if (readlink(slnkname,target,sizeof(target)) <= 0) {
+ if (slbt_readlink(slnkname,target,sizeof(target)) < 0) {
/* -avoid-version? */
if (stat(slnkname,&st))
return -1;