misc: Add internal __getauxval2 function

The explicit error return value (without in-band signaling) avoids
complicated steps to detect errors based on whether errno has been
updated.

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
Florian Weimer 2020-10-27 10:42:10 +01:00
parent 0ce51bef34
commit 562ef5e69e
2 changed files with 32 additions and 6 deletions

View File

@ -5,4 +5,9 @@
extern __typeof (getauxval) __getauxval;
libc_hidden_proto (__getauxval)
/* Like getauxval, but writes the value to *RESULT and returns true if
found, or returns false. Does not set errno. */
_Bool __getauxval2 (unsigned long int type, unsigned long int *result);
libc_hidden_proto (__getauxval2)
#endif /* !_ISOMAC */

View File

@ -18,26 +18,47 @@
#include <sys/auxv.h>
#include <errno.h>
#include <ldsodefs.h>
#include <stdbool.h>
unsigned long int
__getauxval (unsigned long int type)
bool
__getauxval2 (unsigned long int type, unsigned long int *result)
{
#ifdef HAVE_AUX_VECTOR
ElfW(auxv_t) *p;
#endif
if (type == AT_HWCAP)
return GLRO(dl_hwcap);
{
*result = GLRO(dl_hwcap);
return true;
}
else if (type == AT_HWCAP2)
return GLRO(dl_hwcap2);
{
*result = GLRO(dl_hwcap2);
return true;
}
#ifdef HAVE_AUX_VECTOR
for (p = GLRO(dl_auxv); p->a_type != AT_NULL; p++)
if (p->a_type == type)
return p->a_un.a_val;
{
*result = p->a_un.a_val;
return true;
}
#endif
return false;
}
libc_hidden_def (__getauxval2)
unsigned long int
__getauxval (unsigned long int type)
{
unsigned long int result;
if (__getauxval2 (type, &result))
return result;
__set_errno (ENOENT);
return 0;
}