PKG_CHECK_MODULES([UUID], [uuid])
PKG_CHECK_MODULES([ZSTD], [libzstd])
+save_LIBS="$LIBS"
+
+# subid
+#LIBS=
+#AC_SEARCH_LIBS([subid_init], [subid],
+# [AC_DEFINE([HAVE_SUBID], [], [subid is present])],
+# [AC_MSG_WARN([*** subid library not found])])
+#SUBID_LIBS="$LIBS"
+#AC_SUBST(SUBID_LIBS)
+
+LIBS="$save_LIBS"
+
AC_ARG_WITH([systemdsystemunitdir],
AS_HELP_STRING([--with-systemdsystemunitdir=DIR], [Directory for systemd service files]),
[], [with_systemdsystemunitdir=$($PKG_CONFIG --variable=systemdsystemunitdir systemd)])
#include <stdio.h>
#include <stdlib.h>
+#ifdef HAVE_SUBID
+#include <shadow/subid.h>
+#endif
+
#include <pakfire/logging.h>
#include <pakfire/pakfire.h>
#include <pakfire/pwd.h>
// SUBUID/SUBGID
+#ifdef HAVE_SUBID
+
+static int pakfire_getsubid(struct pakfire* pakfire, const char* owner,
+ struct pakfire_subid* subid, int (callback)(const char* owner, struct subid_range** ranges)) {
+ struct subid_range* ranges = NULL;
+ int count;
+ int r = -1;
+
+ if (!subid_init(PACKAGE_NAME, stderr)) {
+ ERROR(pakfire, "Could not setup subid: %m\n");
+ return 1;
+ }
+
+ count = callback(owner, &ranges);
+ if (count < 0) {
+ ERROR(pakfire, "Could not fetch subids for %s: %m\n", owner);
+ goto ERROR;
+ }
+
+ // Store the result
+ for (int i = 0; i < count; i++) {
+ subid->id = ranges[i].start;
+ subid->length = ranges[i].count;
+ r = 0;
+ break;
+ }
+
+ERROR:
+ if (ranges)
+ free(ranges);
+
+ return r;
+}
+
+int pakfire_getsubuid(struct pakfire* pakfire, const char* owner, struct pakfire_subid* subid) {
+ return pakfire_getsubid(pakfire, owner, subid, subid_get_uid_ranges);
+}
+
+int pakfire_getsubgid(struct pakfire* pakfire, const char* owner, struct pakfire_subid* subid) {
+ return pakfire_getsubid(pakfire, owner, subid, subid_get_gid_ranges);
+}
+
+# else /* Our own implementation */
+
static int pakfire_fgetsubid(struct pakfire* pakfire, struct pakfire_subid* subid, FILE* f) {
int r;