This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Add sysconf replacement for win32


We cannot get sysconf() from gnulib and the only thing we need it for
is getting the page size. Therefore, of the various possible sysconf
parameters we only define and implement _SC_PAGESIZE in our replacement.

Signed-off-by: Ulf Hermann <ulf.hermann@qt.io>
---
 ChangeLog              |  6 ++++++
 configure.ac           | 20 ++++++++++++++++++++
 libgnu/ChangeLog       |  6 ++++++
 libgnu/Makefile.am     |  8 +++++++-
 libgnu/sysconf_win32.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 81 insertions(+), 1 deletion(-)
 create mode 100644 libgnu/sysconf_win32.c

diff --git a/ChangeLog b/ChangeLog
index 2c0e34d..71c73e5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2017-05-04  Ulf Hermann  <ulf.hermann@qt.io>
 
+	* configure.ac: Check for sysconf() and GetSystemInfo(). Add a
+	declaration of sysconf to config.h if GetSystemInfo() is available,
+	but not sysconf().
+
+2017-05-04  Ulf Hermann  <ulf.hermann@qt.io>
+
 	* configure.ac: Check for sys/mman.h or alternatively MapViewOfFile().
 
 2017-05-03  Ulf Hermann  <ulf.hermann@qt.io>
diff --git a/configure.ac b/configure.ac
index 6a2f991..2d3ad04 100644
--- a/configure.ac
+++ b/configure.ac
@@ -557,6 +557,26 @@ if test "x$ac_cv_header_sys_mman_h" != "xyes"; then
 fi
 AM_CONDITIONAL(USE_WIN32_MMAN, [test "x$ac_cv_have_decl_MapViewOfFile" = "xyes"])
 
+AC_CHECK_DECLS([sysconf], [], [], [[#include <unistd.h>]])
+AM_CONDITIONAL(HAVE_SYSCONF, [test "x$ac_cv_have_decl_sysconf" = "xyes"])
+if test "x$ac_cv_have_decl_sysconf" != "xyes"; then
+	AC_CHECK_DECLS([GetSystemInfo], [], [], [[#include <sysinfoapi.h>]])
+fi
+AM_CONDITIONAL(USE_WIN32_SYSCONF, [test "x$ac_cv_have_decl_GetSystemInfo" = "xyes"])
+
+if test "x$ac_cv_have_decl_GetSystemInfo" = "xyes"; then
+	AC_DEFINE([USE_WIN32_SYSCONF], [1], [Use sysconf replacement for win32])
+fi
+
+AH_VERBATIM([USE_WIN32_SYSCONF],
+	[/* Define sysconf(3) here if it is not available from a system header. */
+#undef USE_WIN32_SYSCONF
+#ifdef USE_WIN32_SYSCONF
+#define _SC_PAGESIZE 1
+long sysconf(int name);
+#endif
+])
+
 dnl Check if we have <linux/bpf.h> for EM_BPF disassembly.
 AC_CHECK_HEADERS(linux/bpf.h)
 AM_CONDITIONAL(HAVE_LINUX_BPF_H, [test "x$ac_cv_header_linux_bpf_h" = "xyes"])
diff --git a/libgnu/ChangeLog b/libgnu/ChangeLog
index 60a049f..aa0e603 100644
--- a/libgnu/ChangeLog
+++ b/libgnu/ChangeLog
@@ -1,5 +1,11 @@
 2017-05-04  Ulf Hermann  <ulf.hermann@qt.io>
 
+	* Makefile.am: If sysconf() is unavailable, but GetSystemInfo() is
+	available, compile the win32 version of sysconf.
+	* sysconf_win32.c: New file.
+
+2017-05-04  Ulf Hermann  <ulf.hermann@qt.io>
+
 	* Makefile.am: If sys/mman.h is unavailable, but MapViewOfFile is,
 	then use our own implementation of mmap and related functions.
 	* mman_win32.c: New file.
diff --git a/libgnu/Makefile.am b/libgnu/Makefile.am
index 5af121a..05a8f61 100644
--- a/libgnu/Makefile.am
+++ b/libgnu/Makefile.am
@@ -35,7 +35,7 @@ noinst_LIBRARIES =
 MOSTLYCLEANFILES =
 MOSTLYCLEANDIRS =
 BUILT_SOURCES =
-EXTRA_DIST = endian.in.h byteswap.in.h sys_mman.win32.h mman_win32.c
+EXTRA_DIST = endian.in.h byteswap.in.h sys_mman.win32.h mman_win32.c sysconf_win32.c
 CLEANFILES =
 SUFFIXES =
 
@@ -69,3 +69,9 @@ if USE_WIN32_MMAN
 libgnu_a_SOURCES += mman_win32.c
 endif
 endif
+
+if !HAVE_SYSCONF
+if USE_WIN32_SYSCONF
+libgnu_a_SOURCES += sysconf_win32.c
+endif
+endif
diff --git a/libgnu/sysconf_win32.c b/libgnu/sysconf_win32.c
new file mode 100644
index 0000000..34ddf4b
--- /dev/null
+++ b/libgnu/sysconf_win32.c
@@ -0,0 +1,42 @@
+/* Replacement for sysconf() on windows
+   Copyright (C) 2017 The Qt Company Ltd.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of either
+
+     * the GNU Lesser General Public License as published by the Free
+       Software Foundation; either version 3 of the License, or (at
+       your option) any later version
+
+   or
+
+     * the GNU General Public License as published by the Free
+       Software Foundation; either version 2 of the License, or (at
+       your option) any later version
+
+   or both in parallel, as here.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received copies of the GNU General Public License and
+   the GNU Lesser General Public License along with this program.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+#include <sysinfoapi.h>
+#include <errno.h>
+
+long int sysconf(int name) {
+  if (name == _SC_PAGESIZE) {
+    SYSTEM_INFO info;
+    GetSystemInfo(&info);
+    return info.dwPageSize;
+  } else {
+    errno = EINVAL;
+    return -1;
+  }
+}
-- 
2.1.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]