File getauxval.diff of Package rpm.openSUSE_13.1_Update

commit 60835b20180c1be351ff95fa8c8d930afada0e4c
Author: Kirill A. Shutemov <kirill@shutemov.name>
Date:   Mon Jul 1 03:25:32 2013 +0300

Use getauxval(3) to read auxv data
    
glibc >= 2.16 provides getauxval(): a reliable way to retrieve a value
from the auxiliary vector. It doesn't rely on /proc filesystem.
    
Let's switch to it and get rid of /proc dependency.
    
Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name>
Signed-off-by: Panu Matilainen <pmatilai@redhat.com>

--- configure.ac.orig	2013-07-12 12:25:38.000000000 +0000
+++ configure.ac	2013-07-12 12:35:18.000000000 +0000
@@ -518,6 +518,7 @@ dnl Checks for library functions.
 AC_CHECK_FUNCS(putenv)
 AC_CHECK_FUNCS(mempcpy)
 AC_CHECK_FUNCS(fdatasync)
+AC_CHECK_FUNCS(getauxval)
 
 AC_REPLACE_FUNCS(stpcpy stpncpy)
 
--- lib/rpmrc.c.orig	2013-07-12 12:25:38.000000000 +0000
+++ lib/rpmrc.c	2013-07-12 12:34:34.000000000 +0000
@@ -20,6 +20,10 @@
 #define __power_pc() 0
 #endif
 
+#ifdef HAVE_GETAUXVAL
+#include <sys/auxv.h>
+#endif
+
 #include <rpm/rpmlib.h>			/* RPM_MACTABLE*, Rc-prototypes */
 #include <rpm/rpmmacro.h>
 #include <rpm/rpmfileutil.h>
@@ -922,13 +926,19 @@ static int is_geode(void)
 
 #if defined(__linux__) && defined(__powerpc__)
 /**
- * Populate rpmat structure with parsed info from /proc/self/auxv
+ * Populate rpmat structure with auxv values
  */
-static void parse_auxv(void)
+static void read_auxv(void)
 {
     static int oneshot = 1;
 
     if (oneshot) {
+#ifdef HAVE_GETAUXVAL
+	rpmat.platform = (char *) getauxval(AT_PLATFORM);
+	if (!rpmat.platform)
+	    rpmat.platform = "";
+	rpmat.hwcap = getauxval(AT_HWCAP);
+#else
 	rpmat.platform = "";
 	int fd = open("/proc/self/auxv", O_RDONLY);
 
@@ -953,6 +963,7 @@ static void parse_auxv(void)
 	    }
 	    close(fd);
 	}
+#endif
 	oneshot = 0; /* only try once even if it fails */
     }
     return;
@@ -972,7 +983,7 @@ static void defaultMachine(const char **
 
 #if defined(__linux__) && defined(__powerpc__)
     /* Populate rpmat struct with hw info */
-    parse_auxv();
+    read_auxv();
 #endif
 
     while (!gotDefaults) {
openSUSE Build Service is sponsored by