return 0;
}
-const char* pakfire_arch_native(void) {
+int pakfire_arch_native(const char** arch) {
static struct utsname utsname = {};
+ int r;
+ // Fetch uname() data only once
if (!*utsname.machine) {
- if (uname(&utsname) < 0)
- return NULL;
+ r = uname(&utsname);
+ if (r < 0)
+ return -errno;
}
- return utsname.machine;
+ // Return the architecture
+ *arch = utsname.machine;
+
+ return 0;
}
int pakfire_arch_is_compatible(const char* name, const char* compatible_arch) {
which might not be the same as the requested architecture.
*/
static const char* pakfire_arch_is_natively_supported_by_host(const char* name) {
+ const char* native_arch = NULL;
+ int r;
+
if (!name) {
errno = EINVAL;
return NULL;
}
- const char* native_arch = pakfire_arch_native();
+ // Fetch the native architecture
+ r = pakfire_arch_native(&native_arch);
+ if (r < 0)
+ return NULL;
// All hosts support noarch natively
if (pakfire_string_equals(name, "noarch"))
int pakfire_arch_supported(const char* name);
const char** pakfire_supported_arches(void);
-const char* pakfire_arch_native(void);
+int pakfire_arch_native(const char** arch);
const char* pakfire_arch_is_supported_by_host(const char* name);
return -EINVAL;
// Default to the native architecture
- if (!arch)
- arch = pakfire_arch_native();
+ if (!arch) {
+ r = pakfire_arch_native(&arch);
+ if (r < 0)
+ return r;
+ }
// Check path
if (path) {