+/*
+ * Function for use with lt_dlforeachfile. The user data must point to
+ * a UPkg with the GTypeModule name field initialized. If a suitable file
+ * is found and could be successfully opened for reading, the pkg class member
+ * will be filled in.
+ */
+static int find_package_by_name(const char *filename, void *data)
+{
+ GTypeModule *m = G_TYPE_MODULE(data);
+ UPkg *upkg = U_PKG(data);
+
+ const char *base;
+ size_t len;
+ char *buf;
+
+ base = strrchr(filename, '/');
+ if (base) {
+ base++;
+ } else {
+ base = filename;
+ }
+
+ if (str_cmp_lower(base, m->name) != 0)
+ return 0;
+
+ len = strlen(filename);
+ buf = malloc(len + sizeof **u_pkg_exts);
+ if (!buf)
+ return 0;
+ strcpy(buf, filename);
+
+ for (unsigned i = 0; i < sizeof u_pkg_exts / sizeof *u_pkg_exts; i++) {
+ strcpy(buf+len, u_pkg_exts[i]);
+ upkg->pkg = upkg_fopen(buf);
+ if (!upkg->pkg) {
+ free(buf);
+ return 1;
+ }
+ }
+
+ free(buf);
+ return 0;
+}
+