[icinga-checkins] icinga.org: icinga2/master: Build fix for *NIX systems with a non-GNU libc.

git at icinga.org git at icinga.org
Sun Feb 10 17:15:46 CET 2013


Module: icinga2
Branch: master
Commit: 8667bba7e02e46097335b5a4d40a0df1af8f773f
URL:    https://git.icinga.org/?p=icinga2.git;a=commit;h=8667bba7e02e46097335b5a4d40a0df1af8f773f

Author: Gunnar Beutner <gunnar.beutner at netways.de>
Date:   Sun Feb 10 17:15:18 2013 +0100

Build fix for *NIX systems with a non-GNU libc.

---

 configure.ac                    |    1 +
 lib/base/Makefile.am            |    2 +
 third-party/Makefile.am         |    1 +
 third-party/execvpe/Makefile.am |    9 ++
 third-party/execvpe/execvpe.c   |  172 +++++++++++++++++++++++++++++++++++++++
 third-party/execvpe/execvpe.h   |   19 +++++
 6 files changed, 204 insertions(+), 0 deletions(-)

diff --git a/configure.ac b/configure.ac
index 0f9cec0..30f9aaf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -119,6 +119,7 @@ lib/remoting/Makefile
 test/Makefile
 third-party/Makefile
 third-party/cJSON/Makefile
+third-party/execvpe/Makefile
 third-party/mmatch/Makefile
 third-party/popen-noshell/Makefile
 ])
diff --git a/lib/base/Makefile.am b/lib/base/Makefile.am
index e853892..537884c 100644
--- a/lib/base/Makefile.am
+++ b/lib/base/Makefile.am
@@ -75,6 +75,7 @@ libbase_la_CPPFLAGS = \
 	$(LTDLINCL) \
 	$(BOOST_CPPFLAGS) \
 	$(OPENSSL_INCLUDES) \
+	-I${top_srcdir}/third-party/execvpe \
 	-I${top_srcdir}/third-party/mmatch \
 	-I${top_srcdir}/third-party/cJSON \
 	-I${top_srcdir}/third-party/popen-noshell
@@ -92,6 +93,7 @@ libbase_la_LIBADD = \
 	$(BOOST_SIGNALS_LIB) \
 	$(BOOST_THREAD_LIB) \
 	$(BOOST_SYSTEM_LIB) \
+	${top_builddir}/third-party/execvpe/libexecvpe.la \
 	${top_builddir}/third-party/mmatch/libmmatch.la \
 	${top_builddir}/third-party/cJSON/libcJSON.la \
 	${top_builddir}/third-party/popen-noshell/libpopen_noshell.la
diff --git a/third-party/Makefile.am b/third-party/Makefile.am
index 2e4968a..6574c6e 100644
--- a/third-party/Makefile.am
+++ b/third-party/Makefile.am
@@ -3,5 +3,6 @@
 SUBDIRS = \
 	ltdl \
 	cJSON \
+	execvpe \
 	mmatch \
 	popen-noshell
diff --git a/third-party/execvpe/Makefile.am b/third-party/execvpe/Makefile.am
new file mode 100644
index 0000000..f14b04c
--- /dev/null
+++ b/third-party/execvpe/Makefile.am
@@ -0,0 +1,9 @@
+## Process this file with automake to produce Makefile.in
+
+
+noinst_LTLIBRARIES =  \
+	libexecvpe.la
+
+libexecvpe_la_SOURCES =  \
+	execvpe.c \
+	execvpe.h
diff --git a/third-party/execvpe/execvpe.c b/third-party/execvpe/execvpe.c
new file mode 100644
index 0000000..6ce1e9d
--- /dev/null
+++ b/third-party/execvpe/execvpe.c
@@ -0,0 +1,172 @@
+/* -----------------------------------------------------------------------------
+   (c) The University of Glasgow 1995-2004
+
+   Our low-level exec() variant.
+   -------------------------------------------------------------------------- */
+#include "execvpe.h"
+
+#ifdef __GLASGOW_HASKELL__
+#include "Rts.h"
+#endif
+
+#if !(defined(_MSC_VER) || defined(__MINGW32__) || defined(_WIN32)) /* to the end */
+#ifndef __QNXNTO__
+
+/* Evidently non-Posix. */
+/* #include "PosixSource.h" */
+
+#include <unistd.h>
+#include <sys/time.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+/*
+ * We want the search semantics of execvp, but we want to provide our
+ * own environment, like execve.  The following copyright applies to
+ * this code, as it is a derivative of execvp:
+ *-
+ * Copyright (c) 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+int
+execvpe(char *name, char *const argv[], char **envp)
+{
+    register int lp, ln;
+    register char *p;
+    int eacces=0, etxtbsy=0;
+    char *bp, *cur, *path, *buf = 0;
+
+    /* If it's an absolute or relative path name, it's easy. */
+    if (strchr(name, '/')) {
+	bp = (char *) name;
+	cur = path = buf = NULL;
+	goto retry;
+    }
+
+    /* Get the path we're searching. */
+    if (!(path = getenv("PATH"))) {
+#ifdef HAVE_CONFSTR
+        ln = confstr(_CS_PATH, NULL, 0);
+        if ((cur = path = malloc(ln + 1)) != NULL) {
+	    path[0] = ':';
+	    (void) confstr (_CS_PATH, path + 1, ln);
+	}
+#else
+        if ((cur = path = malloc(1 + 1)) != NULL) {
+	    path[0] = ':';
+	    path[1] = '\0';
+	}
+#endif
+    } else
+	cur = path = strdup(path);
+
+    if (path == NULL || (bp = buf = malloc(strlen(path)+strlen(name)+2)) == NULL)
+	goto done;
+
+    while (cur != NULL) {
+	p = cur;
+        if ((cur = strchr(cur, ':')) != NULL)
+	    *cur++ = '\0';
+
+	/*
+	 * It's a SHELL path -- double, leading and trailing colons mean the current
+	 * directory.
+	 */
+	if (!*p) {
+	    p = ".";
+	    lp = 1;
+	} else
+	    lp = strlen(p);
+	ln = strlen(name);
+
+	memcpy(buf, p, lp);
+	buf[lp] = '/';
+	memcpy(buf + lp + 1, name, ln);
+	buf[lp + ln + 1] = '\0';
+
+      retry:
+        (void) execve(bp, argv, envp);
+	switch (errno) {
+	case EACCES:
+	    eacces = 1;
+	    break;
+	case ENOENT:
+	    break;
+	case ENOEXEC:
+	    {
+		register size_t cnt;
+		register char **ap;
+
+		for (cnt = 0, ap = (char **) argv; *ap; ++ap, ++cnt)
+		    ;
+		if ((ap = malloc((cnt + 2) * sizeof(char *))) != NULL) {
+		    memcpy(ap + 2, argv + 1, cnt * sizeof(char *));
+
+		    ap[0] = "sh";
+		    ap[1] = bp;
+		    (void) execve("/bin/sh", ap, envp);
+		    free(ap);
+		}
+		goto done;
+	    }
+	case ETXTBSY:
+	    if (etxtbsy < 3)
+		(void) sleep(++etxtbsy);
+	    goto retry;
+	default:
+	    goto done;
+	}
+    }
+    if (eacces)
+	errno = EACCES;
+    else if (!errno)
+	errno = ENOENT;
+  done:
+    if (path)
+	free(path);
+    if (buf)
+	free(buf);
+    return (-1);
+}
+#endif
+
+
+/* Copied verbatim from ghc/lib/std/cbits/system.c. */
+void pPrPr_disableITimers (void)
+{
+#ifdef __GLASGOW_HASKELL__
+    stopTimer();
+#endif
+}
+
+#endif
diff --git a/third-party/execvpe/execvpe.h b/third-party/execvpe/execvpe.h
new file mode 100644
index 0000000..c599f11
--- /dev/null
+++ b/third-party/execvpe/execvpe.h
@@ -0,0 +1,19 @@
+/* ----------------------------------------------------------------------------
+   (c) The University of Glasgow 2004
+
+   Interface for code in execvpe.c
+   ------------------------------------------------------------------------- */
+
+#include <errno.h>
+#include <sys/types.h>
+#if HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(_WIN32)
+#ifndef __QNXNTO__
+extern int execvpe(char *name, char *const argv[], char **envp);
+#endif
+extern void pPrPr_disableITimers (void);
+#endif
+





More information about the icinga-checkins mailing list