+static void
+dlopen_self(uc_vm_t *vm)
+{
+ uc_value_t *search, *entry;
+ char *path, *wildcard;
+ void *dlh = NULL;
+ size_t i;
+
+ search = ucv_property_get(uc_vm_scope_get(vm), "REQUIRE_SEARCH_PATH");
+
+ for (i = 0; !dlh && i < ucv_array_length(search); i++) {
+ entry = ucv_array_get(search, i);
+ path = ucv_string_get(entry);
+ wildcard = path ? strchr(path, '*') : NULL;
+
+ if (wildcard) {
+ xasprintf(&path, "%.*slua%s", (int)(wildcard - path), path, wildcard + 1);
+ dlh = dlopen(path, RTLD_LAZY|RTLD_GLOBAL);
+ dlerror(); /* clear error */
+ free(path);
+ }
+ }
+}
+