summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/classes/AnimatedSprite3D.xml5
-rw-r--r--drivers/dummy/rasterizer_dummy.h35
-rwxr-xr-xmisc/hooks/pre-commit-clang-format3
-rwxr-xr-xmisc/scripts/file_format.sh11
-rw-r--r--modules/gltf/gltf_skin.cpp2
-rw-r--r--platform/javascript/detect.py16
-rw-r--r--platform/javascript/godot_js.h1
-rw-r--r--platform/javascript/js/libs/library_godot_os.js5
-rw-r--r--platform/javascript/os_javascript.cpp4
-rw-r--r--platform/javascript/os_javascript.h1
-rw-r--r--platform/linuxbsd/SCsub3
-rw-r--r--platform/linuxbsd/detect.py4
-rw-r--r--platform/linuxbsd/joypad_linux.cpp36
-rw-r--r--platform/linuxbsd/joypad_linux.h7
-rw-r--r--platform/linuxbsd/libudev-so_wrap.c828
-rw-r--r--platform/linuxbsd/libudev-so_wrap.h285
-rw-r--r--scene/3d/sprite_3d.cpp3
-rw-r--r--servers/rendering/renderer_rd/shaders/skeleton.glsl2
18 files changed, 1218 insertions, 33 deletions
diff --git a/doc/classes/AnimatedSprite3D.xml b/doc/classes/AnimatedSprite3D.xml
index e1fb78e5b5..02ccab4e05 100644
--- a/doc/classes/AnimatedSprite3D.xml
+++ b/doc/classes/AnimatedSprite3D.xml
@@ -49,6 +49,11 @@
</member>
</members>
<signals>
+ <signal name="animation_finished">
+ <description>
+ Emitted when the animation is finished (when it plays the last frame). If the animation is looping, this signal is emitted every time the last frame is drawn.
+ </description>
+ </signal>
<signal name="frame_changed">
<description>
Emitted when [member frame] changed.
diff --git a/drivers/dummy/rasterizer_dummy.h b/drivers/dummy/rasterizer_dummy.h
index 082f247476..a76520dcdb 100644
--- a/drivers/dummy/rasterizer_dummy.h
+++ b/drivers/dummy/rasterizer_dummy.h
@@ -210,8 +210,22 @@ public:
bool can_create_resources_async() const override { return false; }
/* TEXTURE API */
- RID texture_allocate() override { return RID(); }
- void texture_2d_initialize(RID p_texture, const Ref<Image> &p_image) override {}
+ struct DummyTexture {
+ Ref<Image> image;
+ };
+ mutable RID_PtrOwner<DummyTexture> texture_owner;
+
+ RID texture_allocate() override {
+ DummyTexture *texture = memnew(DummyTexture);
+ ERR_FAIL_COND_V(!texture, RID());
+ return texture_owner.make_rid(texture);
+ }
+ void texture_2d_initialize(RID p_texture, const Ref<Image> &p_image) override {
+ DummyTexture *t = texture_owner.getornull(p_texture);
+ ERR_FAIL_COND(!t);
+ t->image = p_image->duplicate();
+ }
+
void texture_2d_layered_initialize(RID p_texture, const Vector<Ref<Image>> &p_layers, RS::TextureLayeredType p_layered_type) override {}
void texture_2d_update_immediate(RID p_texture, const Ref<Image> &p_image, int p_layer = 0) override {}
void texture_2d_update(RID p_texture, const Ref<Image> &p_image, int p_layer = 0) override {}
@@ -224,7 +238,12 @@ public:
void texture_2d_layered_placeholder_initialize(RID p_texture, RenderingServer::TextureLayeredType p_layered_type) override {}
void texture_3d_placeholder_initialize(RID p_texture) override {}
- Ref<Image> texture_2d_get(RID p_texture) const override { return Ref<Image>(); }
+ Ref<Image> texture_2d_get(RID p_texture) const override {
+ DummyTexture *t = texture_owner.getornull(p_texture);
+ ERR_FAIL_COND_V(!t, Ref<Image>());
+ return t->image;
+ }
+
Ref<Image> texture_2d_layer_get(RID p_texture, int p_layer) const override { return Ref<Image>(); }
Vector<Ref<Image>> texture_3d_get(RID p_texture) const override { return Vector<Ref<Image>>(); }
@@ -635,7 +654,15 @@ public:
Rect2i render_target_get_sdf_rect(RID p_render_target) const override { return Rect2i(); }
RS::InstanceType get_base_type(RID p_rid) const override { return RS::INSTANCE_NONE; }
- bool free(RID p_rid) override { return true; }
+ bool free(RID p_rid) override {
+ if (texture_owner.owns(p_rid)) {
+ // delete the texture
+ DummyTexture *texture = texture_owner.getornull(p_rid);
+ texture_owner.free(p_rid);
+ memdelete(texture);
+ }
+ return true;
+ }
bool has_os_feature(const String &p_feature) const override { return false; }
diff --git a/misc/hooks/pre-commit-clang-format b/misc/hooks/pre-commit-clang-format
index 6467efe22e..1cbc576565 100755
--- a/misc/hooks/pre-commit-clang-format
+++ b/misc/hooks/pre-commit-clang-format
@@ -125,6 +125,9 @@ do
if grep -q "platform/android/java/lib/src/com" <<< $file; then
continue;
fi
+ if grep -q "\-so_wrap." <<< $file; then
+ continue;
+ fi
# ignore file if we do check for file extensions and the file
# does not match any of the extensions specified in $FILE_EXTS
diff --git a/misc/scripts/file_format.sh b/misc/scripts/file_format.sh
index 0e9db68a90..795431cd28 100755
--- a/misc/scripts/file_format.sh
+++ b/misc/scripts/file_format.sh
@@ -30,6 +30,8 @@ while IFS= read -rd '' f; do
continue
elif [[ "$f" == "platform/android/java/lib/src/com/google"* ]]; then
continue
+ elif [[ "$f" == *"-so_wrap."* ]]; then
+ continue
fi
# Ensure that files are UTF-8 formatted.
recode UTF-8 "$f" 2> /dev/null
@@ -38,15 +40,6 @@ while IFS= read -rd '' f; do
# Remove trailing space characters and ensures that files end
# with newline characters. -l option handles newlines conveniently.
perl -i -ple 's/\s*$//g' "$f"
- # Remove the character sequence "== true" if it has a leading space.
- perl -i -pe 's/\x20== true//g' "$f"
-
- if [[ $(uname) == "Linux" ]] && [[ "$f" != *"xml" ]]; then
- # Remove empty lines after the opening brace of indented blocks.
- sed -z -i 's/\x7B\x0A\x0A\x09/\x7B\x0A\x09/g' "$f"
- # Remove empty lines before the closing brace (in some cases).
- sed -z -i 's/\x0A\x0A\x7D/\x0A\x7D/g' "$f"
- fi
done
git diff > patch.patch
diff --git a/modules/gltf/gltf_skin.cpp b/modules/gltf/gltf_skin.cpp
index fd39e4f45a..5a61e5778c 100644
--- a/modules/gltf/gltf_skin.cpp
+++ b/modules/gltf/gltf_skin.cpp
@@ -142,7 +142,7 @@ void GLTFSkin::set_joint_i_to_name(Dictionary p_joint_i_to_name) {
joint_i_to_name = Map<int, StringName>();
Array keys = p_joint_i_to_name.keys();
for (int i = 0; i < keys.size(); i++) {
- joint_i_to_name[keys[i]] = joint_i_to_name[keys[i]];
+ joint_i_to_name[keys[i]] = p_joint_i_to_name[keys[i]];
}
}
diff --git a/platform/javascript/detect.py b/platform/javascript/detect.py
index 653d18f791..4297088c09 100644
--- a/platform/javascript/detect.py
+++ b/platform/javascript/detect.py
@@ -92,9 +92,9 @@ def configure(env):
if not env["threads_enabled"]:
print("Threads must be enabled to build the editor. Please add the 'threads_enabled=yes' option")
sys.exit(255)
- if env["initial_memory"] < 32:
- print("Editor build requires at least 32MiB of initial memory. Forcing it.")
- env["initial_memory"] = 32
+ if env["initial_memory"] < 64:
+ print("Editor build requires at least 64MiB of initial memory. Forcing it.")
+ env["initial_memory"] = 64
elif env["builtin_icu"]:
env.Append(CCFLAGS=["-frtti"])
else:
@@ -229,7 +229,15 @@ def configure(env):
env.Append(LINKFLAGS=["-s", "OFFSCREEN_FRAMEBUFFER=1"])
# callMain for manual start.
- env.Append(LINKFLAGS=["-s", "EXTRA_EXPORTED_RUNTIME_METHODS=['callMain']"])
+ env.Append(LINKFLAGS=["-s", "EXTRA_EXPORTED_RUNTIME_METHODS=['callMain','cwrap']"])
# Add code that allow exiting runtime.
env.Append(LINKFLAGS=["-s", "EXIT_RUNTIME=1"])
+
+ # TODO remove once we have GLES support back (temporary fix undefined symbols due to dead code elimination).
+ env.Append(
+ LINKFLAGS=[
+ "-s",
+ "EXPORTED_FUNCTIONS=['_main', '_emscripten_webgl_get_current_context', '_emscripten_webgl_commit_frame', '_emscripten_webgl_create_context']",
+ ]
+ )
diff --git a/platform/javascript/godot_js.h b/platform/javascript/godot_js.h
index d2a2fbd6db..f0da8b7ca3 100644
--- a/platform/javascript/godot_js.h
+++ b/platform/javascript/godot_js.h
@@ -49,6 +49,7 @@ extern int godot_js_os_fs_is_persistent();
extern void godot_js_os_fs_sync(void (*p_callback)());
extern int godot_js_os_execute(const char *p_json);
extern void godot_js_os_shell_open(const char *p_uri);
+extern int godot_js_os_hw_concurrency_get();
// Display
extern int godot_js_display_screen_dpi_get();
diff --git a/platform/javascript/js/libs/library_godot_os.js b/platform/javascript/js/libs/library_godot_os.js
index 9fde4a84e1..3ffcd655b7 100644
--- a/platform/javascript/js/libs/library_godot_os.js
+++ b/platform/javascript/js/libs/library_godot_os.js
@@ -282,6 +282,11 @@ const GodotOS = {
godot_js_os_shell_open: function (p_uri) {
window.open(GodotRuntime.parseString(p_uri), '_blank');
},
+
+ godot_js_os_hw_concurrency_get__sig: 'i',
+ godot_js_os_hw_concurrency_get: function () {
+ return navigator.hardwareConcurrency || 1;
+ },
};
autoAddDeps(GodotOS, '$GodotOS');
diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp
index b922b2ba91..0b1650076c 100644
--- a/platform/javascript/os_javascript.cpp
+++ b/platform/javascript/os_javascript.cpp
@@ -129,6 +129,10 @@ int OS_JavaScript::get_process_id() const {
ERR_FAIL_V_MSG(0, "OS::get_process_id() is not available on the HTML5 platform.");
}
+int OS_JavaScript::get_processor_count() const {
+ return godot_js_os_hw_concurrency_get();
+}
+
bool OS_JavaScript::_check_internal_feature_support(const String &p_feature) {
if (p_feature == "HTML5" || p_feature == "web") {
return true;
diff --git a/platform/javascript/os_javascript.h b/platform/javascript/os_javascript.h
index 8db62d9d1c..81bb9c5f3d 100644
--- a/platform/javascript/os_javascript.h
+++ b/platform/javascript/os_javascript.h
@@ -74,6 +74,7 @@ public:
Error create_process(const String &p_path, const List<String> &p_arguments, ProcessID *r_child_id = nullptr) override;
Error kill(const ProcessID &p_pid) override;
int get_process_id() const override;
+ int get_processor_count() const override;
String get_executable_path() const override;
Error shell_open(String p_uri) override;
diff --git a/platform/linuxbsd/SCsub b/platform/linuxbsd/SCsub
index ddc698a55b..46714e9502 100644
--- a/platform/linuxbsd/SCsub
+++ b/platform/linuxbsd/SCsub
@@ -16,6 +16,9 @@ common_x11 = [
"key_mapping_x11.cpp",
]
+if "udev" in env and env["udev"]:
+ common_x11.append("libudev-so_wrap.c")
+
prog = env.add_program("#bin/godot", ["godot_linuxbsd.cpp"] + common_x11)
if env["debug_symbols"] and env["separate_debug_symbols"]:
diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py
index 40d2078ebb..f87e9cf886 100644
--- a/platform/linuxbsd/detect.py
+++ b/platform/linuxbsd/detect.py
@@ -325,14 +325,14 @@ def configure(env):
if platform.system() == "Linux":
env.Append(CPPDEFINES=["JOYDEV_ENABLED"])
-
if env["udev"]:
if os.system("pkg-config --exists libudev") == 0: # 0 means found
print("Enabling udev support")
env.Append(CPPDEFINES=["UDEV_ENABLED"])
- env.ParseConfig("pkg-config libudev --cflags --libs")
else:
print("libudev development libraries not found, disabling udev support")
+ else:
+ env["udev"] = False # Linux specific
# Linkflags below this line should typically stay the last ones
if not env["builtin_zlib"]:
diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp
index 4e96e6d687..d1115b146b 100644
--- a/platform/linuxbsd/joypad_linux.cpp
+++ b/platform/linuxbsd/joypad_linux.cpp
@@ -39,7 +39,7 @@
#include <unistd.h>
#ifdef UDEV_ENABLED
-#include <libudev.h>
+#include "libudev-so_wrap.h"
#endif
#define LONG_BITS (sizeof(long) * 8)
@@ -72,13 +72,22 @@ void JoypadLinux::Joypad::reset() {
}
JoypadLinux::JoypadLinux(Input *in) {
- exit_udev = false;
+#ifdef UDEV_ENABLED
+ use_udev = initialize_libudev() == 0;
+ if (use_udev) {
+ print_verbose("JoypadLinux: udev enabled and loaded successfully.");
+ } else {
+ print_verbose("JoypadLinux: udev enabled, but couldn't be loaded. Falling back to /dev/input to detect joypads.");
+ }
+#else
+ print_verbose("JoypadLinux: udev disabled, parsing /dev/input to detect joypads.");
+#endif
input = in;
joy_thread.start(joy_thread_func, this);
}
JoypadLinux::~JoypadLinux() {
- exit_udev = true;
+ exit_monitor = true;
joy_thread.wait_to_finish();
close_joypad();
}
@@ -92,11 +101,18 @@ void JoypadLinux::joy_thread_func(void *p_user) {
void JoypadLinux::run_joypad_thread() {
#ifdef UDEV_ENABLED
- udev *_udev = udev_new();
- ERR_FAIL_COND(!_udev);
- enumerate_joypads(_udev);
- monitor_joypads(_udev);
- udev_unref(_udev);
+ if (use_udev) {
+ udev *_udev = udev_new();
+ if (!_udev) {
+ use_udev = false;
+ ERR_FAIL_MSG("Failed getting an udev context, falling back to parsing /dev/input.");
+ }
+ enumerate_joypads(_udev);
+ monitor_joypads(_udev);
+ udev_unref(_udev);
+ } else {
+ monitor_joypads();
+ }
#else
monitor_joypads();
#endif
@@ -137,7 +153,7 @@ void JoypadLinux::monitor_joypads(udev *p_udev) {
udev_monitor_enable_receiving(mon);
int fd = udev_monitor_get_fd(mon);
- while (!exit_udev) {
+ while (!exit_monitor) {
fd_set fds;
struct timeval tv;
int ret;
@@ -179,7 +195,7 @@ void JoypadLinux::monitor_joypads(udev *p_udev) {
#endif
void JoypadLinux::monitor_joypads() {
- while (!exit_udev) {
+ while (!exit_monitor) {
{
MutexLock lock(joy_mutex);
diff --git a/platform/linuxbsd/joypad_linux.h b/platform/linuxbsd/joypad_linux.h
index bf343b7ceb..2cca0700d6 100644
--- a/platform/linuxbsd/joypad_linux.h
+++ b/platform/linuxbsd/joypad_linux.h
@@ -70,10 +70,13 @@ private:
void reset();
};
- bool exit_udev;
+#ifdef UDEV_ENABLED
+ bool use_udev = false;
+#endif
+ bool exit_monitor = false;
Mutex joy_mutex;
Thread joy_thread;
- Input *input;
+ Input *input = nullptr;
Joypad joypads[JOYPADS_MAX];
Vector<String> attached_devices;
diff --git a/platform/linuxbsd/libudev-so_wrap.c b/platform/linuxbsd/libudev-so_wrap.c
new file mode 100644
index 0000000000..7ffac1ee08
--- /dev/null
+++ b/platform/linuxbsd/libudev-so_wrap.c
@@ -0,0 +1,828 @@
+// This file is generated. Do not edit!
+// see https://github.com/hpvb/dynload-wrapper for details
+// generated by ./generate-wrapper.py 0.1 on 2021-02-17 13:14:24
+// flags: ./generate-wrapper.py --include /usr/include/libudev.h --sys-include <libudev.h> --soname libudev.so.1 --init-name libudev --omit-prefix gnu_ --output-header libudev-so_wrap.h --output-implementation libudev-so_wrap.c
+//
+#include <dlfcn.h>
+#include <stdio.h>
+#define udev_ref udev_ref_orig
+#define udev_unref udev_unref_orig
+#define udev_new udev_new_orig
+#define udev_set_log_fn udev_set_log_fn_orig
+#define udev_get_log_priority udev_get_log_priority_orig
+#define udev_set_log_priority udev_set_log_priority_orig
+#define udev_get_userdata udev_get_userdata_orig
+#define udev_set_userdata udev_set_userdata_orig
+#define udev_list_entry_get_next udev_list_entry_get_next_orig
+#define udev_list_entry_get_by_name udev_list_entry_get_by_name_orig
+#define udev_list_entry_get_name udev_list_entry_get_name_orig
+#define udev_list_entry_get_value udev_list_entry_get_value_orig
+#define udev_device_ref udev_device_ref_orig
+#define udev_device_unref udev_device_unref_orig
+#define udev_device_get_udev udev_device_get_udev_orig
+#define udev_device_new_from_syspath udev_device_new_from_syspath_orig
+#define udev_device_new_from_devnum udev_device_new_from_devnum_orig
+#define udev_device_new_from_subsystem_sysname udev_device_new_from_subsystem_sysname_orig
+#define udev_device_new_from_device_id udev_device_new_from_device_id_orig
+#define udev_device_new_from_environment udev_device_new_from_environment_orig
+#define udev_device_get_parent udev_device_get_parent_orig
+#define udev_device_get_parent_with_subsystem_devtype udev_device_get_parent_with_subsystem_devtype_orig
+#define udev_device_get_devpath udev_device_get_devpath_orig
+#define udev_device_get_subsystem udev_device_get_subsystem_orig
+#define udev_device_get_devtype udev_device_get_devtype_orig
+#define udev_device_get_syspath udev_device_get_syspath_orig
+#define udev_device_get_sysname udev_device_get_sysname_orig
+#define udev_device_get_sysnum udev_device_get_sysnum_orig
+#define udev_device_get_devnode udev_device_get_devnode_orig
+#define udev_device_get_is_initialized udev_device_get_is_initialized_orig
+#define udev_device_get_devlinks_list_entry udev_device_get_devlinks_list_entry_orig
+#define udev_device_get_properties_list_entry udev_device_get_properties_list_entry_orig
+#define udev_device_get_tags_list_entry udev_device_get_tags_list_entry_orig
+#define udev_device_get_sysattr_list_entry udev_device_get_sysattr_list_entry_orig
+#define udev_device_get_property_value udev_device_get_property_value_orig
+#define udev_device_get_driver udev_device_get_driver_orig
+#define udev_device_get_devnum udev_device_get_devnum_orig
+#define udev_device_get_action udev_device_get_action_orig
+#define udev_device_get_seqnum udev_device_get_seqnum_orig
+#define udev_device_get_usec_since_initialized udev_device_get_usec_since_initialized_orig
+#define udev_device_get_sysattr_value udev_device_get_sysattr_value_orig
+#define udev_device_set_sysattr_value udev_device_set_sysattr_value_orig
+#define udev_device_has_tag udev_device_has_tag_orig
+#define udev_monitor_ref udev_monitor_ref_orig
+#define udev_monitor_unref udev_monitor_unref_orig
+#define udev_monitor_get_udev udev_monitor_get_udev_orig
+#define udev_monitor_new_from_netlink udev_monitor_new_from_netlink_orig
+#define udev_monitor_enable_receiving udev_monitor_enable_receiving_orig
+#define udev_monitor_set_receive_buffer_size udev_monitor_set_receive_buffer_size_orig
+#define udev_monitor_get_fd udev_monitor_get_fd_orig
+#define udev_monitor_receive_device udev_monitor_receive_device_orig
+#define udev_monitor_filter_add_match_subsystem_devtype udev_monitor_filter_add_match_subsystem_devtype_orig
+#define udev_monitor_filter_add_match_tag udev_monitor_filter_add_match_tag_orig
+#define udev_monitor_filter_update udev_monitor_filter_update_orig
+#define udev_monitor_filter_remove udev_monitor_filter_remove_orig
+#define udev_enumerate_ref udev_enumerate_ref_orig
+#define udev_enumerate_unref udev_enumerate_unref_orig
+#define udev_enumerate_get_udev udev_enumerate_get_udev_orig
+#define udev_enumerate_new udev_enumerate_new_orig
+#define udev_enumerate_add_match_subsystem udev_enumerate_add_match_subsystem_orig
+#define udev_enumerate_add_nomatch_subsystem udev_enumerate_add_nomatch_subsystem_orig
+#define udev_enumerate_add_match_sysattr udev_enumerate_add_match_sysattr_orig
+#define udev_enumerate_add_nomatch_sysattr udev_enumerate_add_nomatch_sysattr_orig
+#define udev_enumerate_add_match_property udev_enumerate_add_match_property_orig
+#define udev_enumerate_add_match_sysname udev_enumerate_add_match_sysname_orig
+#define udev_enumerate_add_match_tag udev_enumerate_add_match_tag_orig
+#define udev_enumerate_add_match_parent udev_enumerate_add_match_parent_orig
+#define udev_enumerate_add_match_is_initialized udev_enumerate_add_match_is_initialized_orig
+#define udev_enumerate_add_syspath udev_enumerate_add_syspath_orig
+#define udev_enumerate_scan_devices udev_enumerate_scan_devices_orig
+#define udev_enumerate_scan_subsystems udev_enumerate_scan_subsystems_orig
+#define udev_enumerate_get_list_entry udev_enumerate_get_list_entry_orig
+#define udev_queue_ref udev_queue_ref_orig
+#define udev_queue_unref udev_queue_unref_orig
+#define udev_queue_get_udev udev_queue_get_udev_orig
+#define udev_queue_new udev_queue_new_orig
+#define udev_queue_get_kernel_seqnum udev_queue_get_kernel_seqnum_orig
+#define udev_queue_get_udev_seqnum udev_queue_get_udev_seqnum_orig
+#define udev_queue_get_udev_is_active udev_queue_get_udev_is_active_orig
+#define udev_queue_get_queue_is_empty udev_queue_get_queue_is_empty_orig
+#define udev_queue_get_seqnum_is_finished udev_queue_get_seqnum_is_finished_orig
+#define udev_queue_get_seqnum_sequence_is_finished udev_queue_get_seqnum_sequence_is_finished_orig
+#define udev_queue_get_fd udev_queue_get_fd_orig
+#define udev_queue_flush udev_queue_flush_orig
+#define udev_queue_get_queued_list_entry udev_queue_get_queued_list_entry_orig
+#define udev_hwdb_new udev_hwdb_new_orig
+#define udev_hwdb_ref udev_hwdb_ref_orig
+#define udev_hwdb_unref udev_hwdb_unref_orig
+#define udev_hwdb_get_properties_list_entry udev_hwdb_get_properties_list_entry_orig
+#define udev_util_encode_string udev_util_encode_string_orig
+#include <libudev.h>
+#undef udev_ref
+#undef udev_unref
+#undef udev_new
+#undef udev_set_log_fn
+#undef udev_get_log_priority
+#undef udev_set_log_priority
+#undef udev_get_userdata
+#undef udev_set_userdata
+#undef udev_list_entry_get_next
+#undef udev_list_entry_get_by_name
+#undef udev_list_entry_get_name
+#undef udev_list_entry_get_value
+#undef udev_device_ref
+#undef udev_device_unref
+#undef udev_device_get_udev
+#undef udev_device_new_from_syspath
+#undef udev_device_new_from_devnum
+#undef udev_device_new_from_subsystem_sysname
+#undef udev_device_new_from_device_id
+#undef udev_device_new_from_environment
+#undef udev_device_get_parent
+#undef udev_device_get_parent_with_subsystem_devtype
+#undef udev_device_get_devpath
+#undef udev_device_get_subsystem
+#undef udev_device_get_devtype
+#undef udev_device_get_syspath
+#undef udev_device_get_sysname
+#undef udev_device_get_sysnum
+#undef udev_device_get_devnode
+#undef udev_device_get_is_initialized
+#undef udev_device_get_devlinks_list_entry
+#undef udev_device_get_properties_list_entry
+#undef udev_device_get_tags_list_entry
+#undef udev_device_get_sysattr_list_entry
+#undef udev_device_get_property_value
+#undef udev_device_get_driver
+#undef udev_device_get_devnum
+#undef udev_device_get_action
+#undef udev_device_get_seqnum
+#undef udev_device_get_usec_since_initialized
+#undef udev_device_get_sysattr_value
+#undef udev_device_set_sysattr_value
+#undef udev_device_has_tag
+#undef udev_monitor_ref
+#undef udev_monitor_unref
+#undef udev_monitor_get_udev
+#undef udev_monitor_new_from_netlink
+#undef udev_monitor_enable_receiving
+#undef udev_monitor_set_receive_buffer_size
+#undef udev_monitor_get_fd
+#undef udev_monitor_receive_device
+#undef udev_monitor_filter_add_match_subsystem_devtype
+#undef udev_monitor_filter_add_match_tag
+#undef udev_monitor_filter_update
+#undef udev_monitor_filter_remove
+#undef udev_enumerate_ref
+#undef udev_enumerate_unref
+#undef udev_enumerate_get_udev
+#undef udev_enumerate_new
+#undef udev_enumerate_add_match_subsystem
+#undef udev_enumerate_add_nomatch_subsystem
+#undef udev_enumerate_add_match_sysattr
+#undef udev_enumerate_add_nomatch_sysattr
+#undef udev_enumerate_add_match_property
+#undef udev_enumerate_add_match_sysname
+#undef udev_enumerate_add_match_tag
+#undef udev_enumerate_add_match_parent
+#undef udev_enumerate_add_match_is_initialized
+#undef udev_enumerate_add_syspath
+#undef udev_enumerate_scan_devices
+#undef udev_enumerate_scan_subsystems
+#undef udev_enumerate_get_list_entry
+#undef udev_queue_ref
+#undef udev_queue_unref
+#undef udev_queue_get_udev
+#undef udev_queue_new
+#undef udev_queue_get_kernel_seqnum
+#undef udev_queue_get_udev_seqnum
+#undef udev_queue_get_udev_is_active
+#undef udev_queue_get_queue_is_empty
+#undef udev_queue_get_seqnum_is_finished
+#undef udev_queue_get_seqnum_sequence_is_finished
+#undef udev_queue_get_fd
+#undef udev_queue_flush
+#undef udev_queue_get_queued_list_entry
+#undef udev_hwdb_new
+#undef udev_hwdb_ref
+#undef udev_hwdb_unref
+#undef udev_hwdb_get_properties_list_entry
+#undef udev_util_encode_string
+struct udev* (*udev_ref)(struct udev*);
+struct udev* (*udev_unref)(struct udev*);
+struct udev* (*udev_new)( void);
+void (*udev_set_log_fn)(struct udev*, void*);
+int (*udev_get_log_priority)(struct udev*);
+void (*udev_set_log_priority)(struct udev*, int);
+void* (*udev_get_userdata)(struct udev*);
+void (*udev_set_userdata)(struct udev*, void*);
+struct udev_list_entry* (*udev_list_entry_get_next)(struct udev_list_entry*);
+struct udev_list_entry* (*udev_list_entry_get_by_name)(struct udev_list_entry*,const char*);
+const char* (*udev_list_entry_get_name)(struct udev_list_entry*);
+const char* (*udev_list_entry_get_value)(struct udev_list_entry*);
+struct udev_device* (*udev_device_ref)(struct udev_device*);
+struct udev_device* (*udev_device_unref)(struct udev_device*);
+struct udev* (*udev_device_get_udev)(struct udev_device*);
+struct udev_device* (*udev_device_new_from_syspath)(struct udev*,const char*);
+struct udev_device* (*udev_device_new_from_devnum)(struct udev*, char, dev_t);
+struct udev_device* (*udev_device_new_from_subsystem_sysname)(struct udev*,const char*,const char*);
+struct udev_device* (*udev_device_new_from_device_id)(struct udev*,const char*);
+struct udev_device* (*udev_device_new_from_environment)(struct udev*);
+struct udev_device* (*udev_device_get_parent)(struct udev_device*);
+struct udev_device* (*udev_device_get_parent_with_subsystem_devtype)(struct udev_device*,const char*,const char*);
+const char* (*udev_device_get_devpath)(struct udev_device*);
+const char* (*udev_device_get_subsystem)(struct udev_device*);
+const char* (*udev_device_get_devtype)(struct udev_device*);
+const char* (*udev_device_get_syspath)(struct udev_device*);
+const char* (*udev_device_get_sysname)(struct udev_device*);
+const char* (*udev_device_get_sysnum)(struct udev_device*);
+const char* (*udev_device_get_devnode)(struct udev_device*);
+int (*udev_device_get_is_initialized)(struct udev_device*);
+struct udev_list_entry* (*udev_device_get_devlinks_list_entry)(struct udev_device*);
+struct udev_list_entry* (*udev_device_get_properties_list_entry)(struct udev_device*);
+struct udev_list_entry* (*udev_device_get_tags_list_entry)(struct udev_device*);
+struct udev_list_entry* (*udev_device_get_sysattr_list_entry)(struct udev_device*);
+const char* (*udev_device_get_property_value)(struct udev_device*,const char*);
+const char* (*udev_device_get_driver)(struct udev_device*);
+dev_t (*udev_device_get_devnum)(struct udev_device*);
+const char* (*udev_device_get_action)(struct udev_device*);
+unsigned long long int (*udev_device_get_seqnum)(struct udev_device*);
+unsigned long long int (*udev_device_get_usec_since_initialized)(struct udev_device*);
+const char* (*udev_device_get_sysattr_value)(struct udev_device*,const char*);
+int (*udev_device_set_sysattr_value)(struct udev_device*,const char*,const char*);
+int (*udev_device_has_tag)(struct udev_device*,const char*);
+struct udev_monitor* (*udev_monitor_ref)(struct udev_monitor*);
+struct udev_monitor* (*udev_monitor_unref)(struct udev_monitor*);
+struct udev* (*udev_monitor_get_udev)(struct udev_monitor*);
+struct udev_monitor* (*udev_monitor_new_from_netlink)(struct udev*,const char*);
+int (*udev_monitor_enable_receiving)(struct udev_monitor*);
+int (*udev_monitor_set_receive_buffer_size)(struct udev_monitor*, int);
+int (*udev_monitor_get_fd)(struct udev_monitor*);
+struct udev_device* (*udev_monitor_receive_device)(struct udev_monitor*);
+int (*udev_monitor_filter_add_match_subsystem_devtype)(struct udev_monitor*,const char*,const char*);
+int (*udev_monitor_filter_add_match_tag)(struct udev_monitor*,const char*);
+int (*udev_monitor_filter_update)(struct udev_monitor*);
+int (*udev_monitor_filter_remove)(struct udev_monitor*);
+struct udev_enumerate* (*udev_enumerate_ref)(struct udev_enumerate*);
+struct udev_enumerate* (*udev_enumerate_unref)(struct udev_enumerate*);
+struct udev* (*udev_enumerate_get_udev)(struct udev_enumerate*);
+struct udev_enumerate* (*udev_enumerate_new)(struct udev*);
+int (*udev_enumerate_add_match_subsystem)(struct udev_enumerate*,const char*);
+int (*udev_enumerate_add_nomatch_subsystem)(struct udev_enumerate*,const char*);
+int (*udev_enumerate_add_match_sysattr)(struct udev_enumerate*,const char*,const char*);
+int (*udev_enumerate_add_nomatch_sysattr)(struct udev_enumerate*,const char*,const char*);
+int (*udev_enumerate_add_match_property)(struct udev_enumerate*,const char*,const char*);
+int (*udev_enumerate_add_match_sysname)(struct udev_enumerate*,const char*);
+int (*udev_enumerate_add_match_tag)(struct udev_enumerate*,const char*);
+int (*udev_enumerate_add_match_parent)(struct udev_enumerate*,struct udev_device*);
+int (*udev_enumerate_add_match_is_initialized)(struct udev_enumerate*);
+int (*udev_enumerate_add_syspath)(struct udev_enumerate*,const char*);
+int (*udev_enumerate_scan_devices)(struct udev_enumerate*);
+int (*udev_enumerate_scan_subsystems)(struct udev_enumerate*);
+struct udev_list_entry* (*udev_enumerate_get_list_entry)(struct udev_enumerate*);
+struct udev_queue* (*udev_queue_ref)(struct udev_queue*);
+struct udev_queue* (*udev_queue_unref)(struct udev_queue*);
+struct udev* (*udev_queue_get_udev)(struct udev_queue*);
+struct udev_queue* (*udev_queue_new)(struct udev*);
+unsigned long long int (*udev_queue_get_kernel_seqnum)(struct udev_queue*);
+unsigned long long int (*udev_queue_get_udev_seqnum)(struct udev_queue*);
+int (*udev_queue_get_udev_is_active)(struct udev_queue*);
+int (*udev_queue_get_queue_is_empty)(struct udev_queue*);
+int (*udev_queue_get_seqnum_is_finished)(struct udev_queue*, unsigned long long int);
+int (*udev_queue_get_seqnum_sequence_is_finished)(struct udev_queue*, unsigned long long int, unsigned long long int);
+int (*udev_queue_get_fd)(struct udev_queue*);
+int (*udev_queue_flush)(struct udev_queue*);
+struct udev_list_entry* (*udev_queue_get_queued_list_entry)(struct udev_queue*);
+struct udev_hwdb* (*udev_hwdb_new)(struct udev*);
+struct udev_hwdb* (*udev_hwdb_ref)(struct udev_hwdb*);
+struct udev_hwdb* (*udev_hwdb_unref)(struct udev_hwdb*);
+struct udev_list_entry* (*udev_hwdb_get_properties_list_entry)(struct udev_hwdb*,const char*, unsigned);
+int (*udev_util_encode_string)(const char*, char*, size_t);int initialize_libudev() {
+ void *handle;
+ char *error;
+ handle = dlopen("libudev.so.1", RTLD_NOW | RTLD_DEEPBIND);
+ if (!handle) {
+ fprintf(stderr, "%s\n", dlerror());
+ return(1);
+ }
+ dlerror();
+// udev_ref
+ *(void **) (&udev_ref) = dlsym(handle, "udev_ref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_unref
+ *(void **) (&udev_unref) = dlsym(handle, "udev_unref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_new
+ *(void **) (&udev_new) = dlsym(handle, "udev_new");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_set_log_fn
+ *(void **) (&udev_set_log_fn) = dlsym(handle, "udev_set_log_fn");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_get_log_priority
+ *(void **) (&udev_get_log_priority) = dlsym(handle, "udev_get_log_priority");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_set_log_priority
+ *(void **) (&udev_set_log_priority) = dlsym(handle, "udev_set_log_priority");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_get_userdata
+ *(void **) (&udev_get_userdata) = dlsym(handle, "udev_get_userdata");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_set_userdata
+ *(void **) (&udev_set_userdata) = dlsym(handle, "udev_set_userdata");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_list_entry_get_next
+ *(void **) (&udev_list_entry_get_next) = dlsym(handle, "udev_list_entry_get_next");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_list_entry_get_by_name
+ *(void **) (&udev_list_entry_get_by_name) = dlsym(handle, "udev_list_entry_get_by_name");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_list_entry_get_name
+ *(void **) (&udev_list_entry_get_name) = dlsym(handle, "udev_list_entry_get_name");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_list_entry_get_value
+ *(void **) (&udev_list_entry_get_value) = dlsym(handle, "udev_list_entry_get_value");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_ref
+ *(void **) (&udev_device_ref) = dlsym(handle, "udev_device_ref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_unref
+ *(void **) (&udev_device_unref) = dlsym(handle, "udev_device_unref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_udev
+ *(void **) (&udev_device_get_udev) = dlsym(handle, "udev_device_get_udev");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_new_from_syspath
+ *(void **) (&udev_device_new_from_syspath) = dlsym(handle, "udev_device_new_from_syspath");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_new_from_devnum
+ *(void **) (&udev_device_new_from_devnum) = dlsym(handle, "udev_device_new_from_devnum");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_new_from_subsystem_sysname
+ *(void **) (&udev_device_new_from_subsystem_sysname) = dlsym(handle, "udev_device_new_from_subsystem_sysname");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_new_from_device_id
+ *(void **) (&udev_device_new_from_device_id) = dlsym(handle, "udev_device_new_from_device_id");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_new_from_environment
+ *(void **) (&udev_device_new_from_environment) = dlsym(handle, "udev_device_new_from_environment");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_parent
+ *(void **) (&udev_device_get_parent) = dlsym(handle, "udev_device_get_parent");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_parent_with_subsystem_devtype
+ *(void **) (&udev_device_get_parent_with_subsystem_devtype) = dlsym(handle, "udev_device_get_parent_with_subsystem_devtype");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_devpath
+ *(void **) (&udev_device_get_devpath) = dlsym(handle, "udev_device_get_devpath");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_subsystem
+ *(void **) (&udev_device_get_subsystem) = dlsym(handle, "udev_device_get_subsystem");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_devtype
+ *(void **) (&udev_device_get_devtype) = dlsym(handle, "udev_device_get_devtype");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_syspath
+ *(void **) (&udev_device_get_syspath) = dlsym(handle, "udev_device_get_syspath");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_sysname
+ *(void **) (&udev_device_get_sysname) = dlsym(handle, "udev_device_get_sysname");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_sysnum
+ *(void **) (&udev_device_get_sysnum) = dlsym(handle, "udev_device_get_sysnum");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_devnode
+ *(void **) (&udev_device_get_devnode) = dlsym(handle, "udev_device_get_devnode");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_is_initialized
+ *(void **) (&udev_device_get_is_initialized) = dlsym(handle, "udev_device_get_is_initialized");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_devlinks_list_entry
+ *(void **) (&udev_device_get_devlinks_list_entry) = dlsym(handle, "udev_device_get_devlinks_list_entry");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_properties_list_entry
+ *(void **) (&udev_device_get_properties_list_entry) = dlsym(handle, "udev_device_get_properties_list_entry");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_tags_list_entry
+ *(void **) (&udev_device_get_tags_list_entry) = dlsym(handle, "udev_device_get_tags_list_entry");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_sysattr_list_entry
+ *(void **) (&udev_device_get_sysattr_list_entry) = dlsym(handle, "udev_device_get_sysattr_list_entry");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_property_value
+ *(void **) (&udev_device_get_property_value) = dlsym(handle, "udev_device_get_property_value");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_driver
+ *(void **) (&udev_device_get_driver) = dlsym(handle, "udev_device_get_driver");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_devnum
+ *(void **) (&udev_device_get_devnum) = dlsym(handle, "udev_device_get_devnum");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_action
+ *(void **) (&udev_device_get_action) = dlsym(handle, "udev_device_get_action");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_seqnum
+ *(void **) (&udev_device_get_seqnum) = dlsym(handle, "udev_device_get_seqnum");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_usec_since_initialized
+ *(void **) (&udev_device_get_usec_since_initialized) = dlsym(handle, "udev_device_get_usec_since_initialized");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_get_sysattr_value
+ *(void **) (&udev_device_get_sysattr_value) = dlsym(handle, "udev_device_get_sysattr_value");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_set_sysattr_value
+ *(void **) (&udev_device_set_sysattr_value) = dlsym(handle, "udev_device_set_sysattr_value");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_device_has_tag
+ *(void **) (&udev_device_has_tag) = dlsym(handle, "udev_device_has_tag");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_ref
+ *(void **) (&udev_monitor_ref) = dlsym(handle, "udev_monitor_ref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_unref
+ *(void **) (&udev_monitor_unref) = dlsym(handle, "udev_monitor_unref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_get_udev
+ *(void **) (&udev_monitor_get_udev) = dlsym(handle, "udev_monitor_get_udev");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_new_from_netlink
+ *(void **) (&udev_monitor_new_from_netlink) = dlsym(handle, "udev_monitor_new_from_netlink");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_enable_receiving
+ *(void **) (&udev_monitor_enable_receiving) = dlsym(handle, "udev_monitor_enable_receiving");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_set_receive_buffer_size
+ *(void **) (&udev_monitor_set_receive_buffer_size) = dlsym(handle, "udev_monitor_set_receive_buffer_size");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_get_fd
+ *(void **) (&udev_monitor_get_fd) = dlsym(handle, "udev_monitor_get_fd");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_receive_device
+ *(void **) (&udev_monitor_receive_device) = dlsym(handle, "udev_monitor_receive_device");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_filter_add_match_subsystem_devtype
+ *(void **) (&udev_monitor_filter_add_match_subsystem_devtype) = dlsym(handle, "udev_monitor_filter_add_match_subsystem_devtype");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_filter_add_match_tag
+ *(void **) (&udev_monitor_filter_add_match_tag) = dlsym(handle, "udev_monitor_filter_add_match_tag");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_filter_update
+ *(void **) (&udev_monitor_filter_update) = dlsym(handle, "udev_monitor_filter_update");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_monitor_filter_remove
+ *(void **) (&udev_monitor_filter_remove) = dlsym(handle, "udev_monitor_filter_remove");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_ref
+ *(void **) (&udev_enumerate_ref) = dlsym(handle, "udev_enumerate_ref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_unref
+ *(void **) (&udev_enumerate_unref) = dlsym(handle, "udev_enumerate_unref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_get_udev
+ *(void **) (&udev_enumerate_get_udev) = dlsym(handle, "udev_enumerate_get_udev");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_new
+ *(void **) (&udev_enumerate_new) = dlsym(handle, "udev_enumerate_new");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_add_match_subsystem
+ *(void **) (&udev_enumerate_add_match_subsystem) = dlsym(handle, "udev_enumerate_add_match_subsystem");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_add_nomatch_subsystem
+ *(void **) (&udev_enumerate_add_nomatch_subsystem) = dlsym(handle, "udev_enumerate_add_nomatch_subsystem");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_add_match_sysattr
+ *(void **) (&udev_enumerate_add_match_sysattr) = dlsym(handle, "udev_enumerate_add_match_sysattr");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_add_nomatch_sysattr
+ *(void **) (&udev_enumerate_add_nomatch_sysattr) = dlsym(handle, "udev_enumerate_add_nomatch_sysattr");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_add_match_property
+ *(void **) (&udev_enumerate_add_match_property) = dlsym(handle, "udev_enumerate_add_match_property");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_add_match_sysname
+ *(void **) (&udev_enumerate_add_match_sysname) = dlsym(handle, "udev_enumerate_add_match_sysname");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_add_match_tag
+ *(void **) (&udev_enumerate_add_match_tag) = dlsym(handle, "udev_enumerate_add_match_tag");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_add_match_parent
+ *(void **) (&udev_enumerate_add_match_parent) = dlsym(handle, "udev_enumerate_add_match_parent");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_add_match_is_initialized
+ *(void **) (&udev_enumerate_add_match_is_initialized) = dlsym(handle, "udev_enumerate_add_match_is_initialized");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_add_syspath
+ *(void **) (&udev_enumerate_add_syspath) = dlsym(handle, "udev_enumerate_add_syspath");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_scan_devices
+ *(void **) (&udev_enumerate_scan_devices) = dlsym(handle, "udev_enumerate_scan_devices");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_scan_subsystems
+ *(void **) (&udev_enumerate_scan_subsystems) = dlsym(handle, "udev_enumerate_scan_subsystems");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_enumerate_get_list_entry
+ *(void **) (&udev_enumerate_get_list_entry) = dlsym(handle, "udev_enumerate_get_list_entry");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_ref
+ *(void **) (&udev_queue_ref) = dlsym(handle, "udev_queue_ref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_unref
+ *(void **) (&udev_queue_unref) = dlsym(handle, "udev_queue_unref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_get_udev
+ *(void **) (&udev_queue_get_udev) = dlsym(handle, "udev_queue_get_udev");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_new
+ *(void **) (&udev_queue_new) = dlsym(handle, "udev_queue_new");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_get_kernel_seqnum
+ *(void **) (&udev_queue_get_kernel_seqnum) = dlsym(handle, "udev_queue_get_kernel_seqnum");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_get_udev_seqnum
+ *(void **) (&udev_queue_get_udev_seqnum) = dlsym(handle, "udev_queue_get_udev_seqnum");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_get_udev_is_active
+ *(void **) (&udev_queue_get_udev_is_active) = dlsym(handle, "udev_queue_get_udev_is_active");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_get_queue_is_empty
+ *(void **) (&udev_queue_get_queue_is_empty) = dlsym(handle, "udev_queue_get_queue_is_empty");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_get_seqnum_is_finished
+ *(void **) (&udev_queue_get_seqnum_is_finished) = dlsym(handle, "udev_queue_get_seqnum_is_finished");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_get_seqnum_sequence_is_finished
+ *(void **) (&udev_queue_get_seqnum_sequence_is_finished) = dlsym(handle, "udev_queue_get_seqnum_sequence_is_finished");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_get_fd
+ *(void **) (&udev_queue_get_fd) = dlsym(handle, "udev_queue_get_fd");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_flush
+ *(void **) (&udev_queue_flush) = dlsym(handle, "udev_queue_flush");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_queue_get_queued_list_entry
+ *(void **) (&udev_queue_get_queued_list_entry) = dlsym(handle, "udev_queue_get_queued_list_entry");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_hwdb_new
+ *(void **) (&udev_hwdb_new) = dlsym(handle, "udev_hwdb_new");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_hwdb_ref
+ *(void **) (&udev_hwdb_ref) = dlsym(handle, "udev_hwdb_ref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_hwdb_unref
+ *(void **) (&udev_hwdb_unref) = dlsym(handle, "udev_hwdb_unref");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_hwdb_get_properties_list_entry
+ *(void **) (&udev_hwdb_get_properties_list_entry) = dlsym(handle, "udev_hwdb_get_properties_list_entry");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+// udev_util_encode_string
+ *(void **) (&udev_util_encode_string) = dlsym(handle, "udev_util_encode_string");
+ error = dlerror();
+ if (error != NULL) {
+ fprintf(stderr, "%s\n", error);
+ }
+return 0;
+}
diff --git a/platform/linuxbsd/libudev-so_wrap.h b/platform/linuxbsd/libudev-so_wrap.h
new file mode 100644
index 0000000000..360e2d287a
--- /dev/null
+++ b/platform/linuxbsd/libudev-so_wrap.h
@@ -0,0 +1,285 @@
+// This file is generated. Do not edit!
+// see https://github.com/hpvb/dynload-wrapper for details
+// generated by ./generate-wrapper.py 0.1 on 2021-02-17 13:14:24
+// flags: ./generate-wrapper.py --include /usr/include/libudev.h --sys-include <libudev.h> --soname libudev.so.1 --init-name libudev --omit-prefix gnu_ --output-header libudev-so_wrap.h --output-implementation libudev-so_wrap.c
+//
+#include <dlfcn.h>
+#include <stdio.h>
+#define udev_ref udev_ref_orig
+#define udev_unref udev_unref_orig
+#define udev_new udev_new_orig
+#define udev_set_log_fn udev_set_log_fn_orig
+#define udev_get_log_priority udev_get_log_priority_orig
+#define udev_set_log_priority udev_set_log_priority_orig
+#define udev_get_userdata udev_get_userdata_orig
+#define udev_set_userdata udev_set_userdata_orig
+#define udev_list_entry_get_next udev_list_entry_get_next_orig
+#define udev_list_entry_get_by_name udev_list_entry_get_by_name_orig
+#define udev_list_entry_get_name udev_list_entry_get_name_orig
+#define udev_list_entry_get_value udev_list_entry_get_value_orig
+#define udev_device_ref udev_device_ref_orig
+#define udev_device_unref udev_device_unref_orig
+#define udev_device_get_udev udev_device_get_udev_orig
+#define udev_device_new_from_syspath udev_device_new_from_syspath_orig
+#define udev_device_new_from_devnum udev_device_new_from_devnum_orig
+#define udev_device_new_from_subsystem_sysname udev_device_new_from_subsystem_sysname_orig
+#define udev_device_new_from_device_id udev_device_new_from_device_id_orig
+#define udev_device_new_from_environment udev_device_new_from_environment_orig
+#define udev_device_get_parent udev_device_get_parent_orig
+#define udev_device_get_parent_with_subsystem_devtype udev_device_get_parent_with_subsystem_devtype_orig
+#define udev_device_get_devpath udev_device_get_devpath_orig
+#define udev_device_get_subsystem udev_device_get_subsystem_orig
+#define udev_device_get_devtype udev_device_get_devtype_orig
+#define udev_device_get_syspath udev_device_get_syspath_orig
+#define udev_device_get_sysname udev_device_get_sysname_orig
+#define udev_device_get_sysnum udev_device_get_sysnum_orig
+#define udev_device_get_devnode udev_device_get_devnode_orig
+#define udev_device_get_is_initialized udev_device_get_is_initialized_orig
+#define udev_device_get_devlinks_list_entry udev_device_get_devlinks_list_entry_orig
+#define udev_device_get_properties_list_entry udev_device_get_properties_list_entry_orig
+#define udev_device_get_tags_list_entry udev_device_get_tags_list_entry_orig
+#define udev_device_get_sysattr_list_entry udev_device_get_sysattr_list_entry_orig
+#define udev_device_get_property_value udev_device_get_property_value_orig
+#define udev_device_get_driver udev_device_get_driver_orig
+#define udev_device_get_devnum udev_device_get_devnum_orig
+#define udev_device_get_action udev_device_get_action_orig
+#define udev_device_get_seqnum udev_device_get_seqnum_orig
+#define udev_device_get_usec_since_initialized udev_device_get_usec_since_initialized_orig
+#define udev_device_get_sysattr_value udev_device_get_sysattr_value_orig
+#define udev_device_set_sysattr_value udev_device_set_sysattr_value_orig
+#define udev_device_has_tag udev_device_has_tag_orig
+#define udev_monitor_ref udev_monitor_ref_orig
+#define udev_monitor_unref udev_monitor_unref_orig
+#define udev_monitor_get_udev udev_monitor_get_udev_orig
+#define udev_monitor_new_from_netlink udev_monitor_new_from_netlink_orig
+#define udev_monitor_enable_receiving udev_monitor_enable_receiving_orig
+#define udev_monitor_set_receive_buffer_size udev_monitor_set_receive_buffer_size_orig
+#define udev_monitor_get_fd udev_monitor_get_fd_orig
+#define udev_monitor_receive_device udev_monitor_receive_device_orig
+#define udev_monitor_filter_add_match_subsystem_devtype udev_monitor_filter_add_match_subsystem_devtype_orig
+#define udev_monitor_filter_add_match_tag udev_monitor_filter_add_match_tag_orig
+#define udev_monitor_filter_update udev_monitor_filter_update_orig
+#define udev_monitor_filter_remove udev_monitor_filter_remove_orig
+#define udev_enumerate_ref udev_enumerate_ref_orig
+#define udev_enumerate_unref udev_enumerate_unref_orig
+#define udev_enumerate_get_udev udev_enumerate_get_udev_orig
+#define udev_enumerate_new udev_enumerate_new_orig
+#define udev_enumerate_add_match_subsystem udev_enumerate_add_match_subsystem_orig
+#define udev_enumerate_add_nomatch_subsystem udev_enumerate_add_nomatch_subsystem_orig
+#define udev_enumerate_add_match_sysattr udev_enumerate_add_match_sysattr_orig
+#define udev_enumerate_add_nomatch_sysattr udev_enumerate_add_nomatch_sysattr_orig
+#define udev_enumerate_add_match_property udev_enumerate_add_match_property_orig
+#define udev_enumerate_add_match_sysname udev_enumerate_add_match_sysname_orig
+#define udev_enumerate_add_match_tag udev_enumerate_add_match_tag_orig
+#define udev_enumerate_add_match_parent udev_enumerate_add_match_parent_orig
+#define udev_enumerate_add_match_is_initialized udev_enumerate_add_match_is_initialized_orig
+#define udev_enumerate_add_syspath udev_enumerate_add_syspath_orig
+#define udev_enumerate_scan_devices udev_enumerate_scan_devices_orig
+#define udev_enumerate_scan_subsystems udev_enumerate_scan_subsystems_orig
+#define udev_enumerate_get_list_entry udev_enumerate_get_list_entry_orig
+#define udev_queue_ref udev_queue_ref_orig
+#define udev_queue_unref udev_queue_unref_orig
+#define udev_queue_get_udev udev_queue_get_udev_orig
+#define udev_queue_new udev_queue_new_orig
+#define udev_queue_get_kernel_seqnum udev_queue_get_kernel_seqnum_orig
+#define udev_queue_get_udev_seqnum udev_queue_get_udev_seqnum_orig
+#define udev_queue_get_udev_is_active udev_queue_get_udev_is_active_orig
+#define udev_queue_get_queue_is_empty udev_queue_get_queue_is_empty_orig
+#define udev_queue_get_seqnum_is_finished udev_queue_get_seqnum_is_finished_orig
+#define udev_queue_get_seqnum_sequence_is_finished udev_queue_get_seqnum_sequence_is_finished_orig
+#define udev_queue_get_fd udev_queue_get_fd_orig
+#define udev_queue_flush udev_queue_flush_orig
+#define udev_queue_get_queued_list_entry udev_queue_get_queued_list_entry_orig
+#define udev_hwdb_new udev_hwdb_new_orig
+#define udev_hwdb_ref udev_hwdb_ref_orig
+#define udev_hwdb_unref udev_hwdb_unref_orig
+#define udev_hwdb_get_properties_list_entry udev_hwdb_get_properties_list_entry_orig
+#define udev_util_encode_string udev_util_encode_string_orig
+#include <libudev.h>
+#undef udev_ref
+#undef udev_unref
+#undef udev_new
+#undef udev_set_log_fn
+#undef udev_get_log_priority
+#undef udev_set_log_priority
+#undef udev_get_userdata
+#undef udev_set_userdata
+#undef udev_list_entry_get_next
+#undef udev_list_entry_get_by_name
+#undef udev_list_entry_get_name
+#undef udev_list_entry_get_value
+#undef udev_device_ref
+#undef udev_device_unref
+#undef udev_device_get_udev
+#undef udev_device_new_from_syspath
+#undef udev_device_new_from_devnum
+#undef udev_device_new_from_subsystem_sysname
+#undef udev_device_new_from_device_id
+#undef udev_device_new_from_environment
+#undef udev_device_get_parent
+#undef udev_device_get_parent_with_subsystem_devtype
+#undef udev_device_get_devpath
+#undef udev_device_get_subsystem
+#undef udev_device_get_devtype
+#undef udev_device_get_syspath
+#undef udev_device_get_sysname
+#undef udev_device_get_sysnum
+#undef udev_device_get_devnode
+#undef udev_device_get_is_initialized
+#undef udev_device_get_devlinks_list_entry
+#undef udev_device_get_properties_list_entry
+#undef udev_device_get_tags_list_entry
+#undef udev_device_get_sysattr_list_entry
+#undef udev_device_get_property_value
+#undef udev_device_get_driver
+#undef udev_device_get_devnum
+#undef udev_device_get_action
+#undef udev_device_get_seqnum
+#undef udev_device_get_usec_since_initialized
+#undef udev_device_get_sysattr_value
+#undef udev_device_set_sysattr_value
+#undef udev_device_has_tag
+#undef udev_monitor_ref
+#undef udev_monitor_unref
+#undef udev_monitor_get_udev
+#undef udev_monitor_new_from_netlink
+#undef udev_monitor_enable_receiving
+#undef udev_monitor_set_receive_buffer_size
+#undef udev_monitor_get_fd
+#undef udev_monitor_receive_device
+#undef udev_monitor_filter_add_match_subsystem_devtype
+#undef udev_monitor_filter_add_match_tag
+#undef udev_monitor_filter_update
+#undef udev_monitor_filter_remove
+#undef udev_enumerate_ref
+#undef udev_enumerate_unref
+#undef udev_enumerate_get_udev
+#undef udev_enumerate_new
+#undef udev_enumerate_add_match_subsystem
+#undef udev_enumerate_add_nomatch_subsystem
+#undef udev_enumerate_add_match_sysattr
+#undef udev_enumerate_add_nomatch_sysattr
+#undef udev_enumerate_add_match_property
+#undef udev_enumerate_add_match_sysname
+#undef udev_enumerate_add_match_tag
+#undef udev_enumerate_add_match_parent
+#undef udev_enumerate_add_match_is_initialized
+#undef udev_enumerate_add_syspath
+#undef udev_enumerate_scan_devices
+#undef udev_enumerate_scan_subsystems
+#undef udev_enumerate_get_list_entry
+#undef udev_queue_ref
+#undef udev_queue_unref
+#undef udev_queue_get_udev
+#undef udev_queue_new
+#undef udev_queue_get_kernel_seqnum
+#undef udev_queue_get_udev_seqnum
+#undef udev_queue_get_udev_is_active
+#undef udev_queue_get_queue_is_empty
+#undef udev_queue_get_seqnum_is_finished
+#undef udev_queue_get_seqnum_sequence_is_finished
+#undef udev_queue_get_fd
+#undef udev_queue_flush
+#undef udev_queue_get_queued_list_entry
+#undef udev_hwdb_new
+#undef udev_hwdb_ref
+#undef udev_hwdb_unref
+#undef udev_hwdb_get_properties_list_entry
+#undef udev_util_encode_string
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern struct udev* (*udev_ref)(struct udev*);
+extern struct udev* (*udev_unref)(struct udev*);
+extern struct udev* (*udev_new)( void);
+extern void (*udev_set_log_fn)(struct udev*, void*);
+extern int (*udev_get_log_priority)(struct udev*);
+extern void (*udev_set_log_priority)(struct udev*, int);
+extern void* (*udev_get_userdata)(struct udev*);
+extern void (*udev_set_userdata)(struct udev*, void*);
+extern struct udev_list_entry* (*udev_list_entry_get_next)(struct udev_list_entry*);
+extern struct udev_list_entry* (*udev_list_entry_get_by_name)(struct udev_list_entry*,const char*);
+extern const char* (*udev_list_entry_get_name)(struct udev_list_entry*);
+extern const char* (*udev_list_entry_get_value)(struct udev_list_entry*);
+extern struct udev_device* (*udev_device_ref)(struct udev_device*);
+extern struct udev_device* (*udev_device_unref)(struct udev_device*);
+extern struct udev* (*udev_device_get_udev)(struct udev_device*);
+extern struct udev_device* (*udev_device_new_from_syspath)(struct udev*,const char*);
+extern struct udev_device* (*udev_device_new_from_devnum)(struct udev*, char, dev_t);
+extern struct udev_device* (*udev_device_new_from_subsystem_sysname)(struct udev*,const char*,const char*);
+extern struct udev_device* (*udev_device_new_from_device_id)(struct udev*,const char*);
+extern struct udev_device* (*udev_device_new_from_environment)(struct udev*);
+extern struct udev_device* (*udev_device_get_parent)(struct udev_device*);
+extern struct udev_device* (*udev_device_get_parent_with_subsystem_devtype)(struct udev_device*,const char*,const char*);
+extern const char* (*udev_device_get_devpath)(struct udev_device*);
+extern const char* (*udev_device_get_subsystem)(struct udev_device*);
+extern const char* (*udev_device_get_devtype)(struct udev_device*);
+extern const char* (*udev_device_get_syspath)(struct udev_device*);
+extern const char* (*udev_device_get_sysname)(struct udev_device*);
+extern const char* (*udev_device_get_sysnum)(struct udev_device*);
+extern const char* (*udev_device_get_devnode)(struct udev_device*);
+extern int (*udev_device_get_is_initialized)(struct udev_device*);
+extern struct udev_list_entry* (*udev_device_get_devlinks_list_entry)(struct udev_device*);
+extern struct udev_list_entry* (*udev_device_get_properties_list_entry)(struct udev_device*);
+extern struct udev_list_entry* (*udev_device_get_tags_list_entry)(struct udev_device*);
+extern struct udev_list_entry* (*udev_device_get_sysattr_list_entry)(struct udev_device*);
+extern const char* (*udev_device_get_property_value)(struct udev_device*,const char*);
+extern const char* (*udev_device_get_driver)(struct udev_device*);
+extern dev_t (*udev_device_get_devnum)(struct udev_device*);
+extern const char* (*udev_device_get_action)(struct udev_device*);
+extern unsigned long long int (*udev_device_get_seqnum)(struct udev_device*);
+extern unsigned long long int (*udev_device_get_usec_since_initialized)(struct udev_device*);
+extern const char* (*udev_device_get_sysattr_value)(struct udev_device*,const char*);
+extern int (*udev_device_set_sysattr_value)(struct udev_device*,const char*,const char*);
+extern int (*udev_device_has_tag)(struct udev_device*,const char*);
+extern struct udev_monitor* (*udev_monitor_ref)(struct udev_monitor*);
+extern struct udev_monitor* (*udev_monitor_unref)(struct udev_monitor*);
+extern struct udev* (*udev_monitor_get_udev)(struct udev_monitor*);
+extern struct udev_monitor* (*udev_monitor_new_from_netlink)(struct udev*,const char*);
+extern int (*udev_monitor_enable_receiving)(struct udev_monitor*);
+extern int (*udev_monitor_set_receive_buffer_size)(struct udev_monitor*, int);
+extern int (*udev_monitor_get_fd)(struct udev_monitor*);
+extern struct udev_device* (*udev_monitor_receive_device)(struct udev_monitor*);
+extern int (*udev_monitor_filter_add_match_subsystem_devtype)(struct udev_monitor*,const char*,const char*);
+extern int (*udev_monitor_filter_add_match_tag)(struct udev_monitor*,const char*);
+extern int (*udev_monitor_filter_update)(struct udev_monitor*);
+extern int (*udev_monitor_filter_remove)(struct udev_monitor*);
+extern struct udev_enumerate* (*udev_enumerate_ref)(struct udev_enumerate*);
+extern struct udev_enumerate* (*udev_enumerate_unref)(struct udev_enumerate*);
+extern struct udev* (*udev_enumerate_get_udev)(struct udev_enumerate*);
+extern struct udev_enumerate* (*udev_enumerate_new)(struct udev*);
+extern int (*udev_enumerate_add_match_subsystem)(struct udev_enumerate*,const char*);
+extern int (*udev_enumerate_add_nomatch_subsystem)(struct udev_enumerate*,const char*);
+extern int (*udev_enumerate_add_match_sysattr)(struct udev_enumerate*,const char*,const char*);
+extern int (*udev_enumerate_add_nomatch_sysattr)(struct udev_enumerate*,const char*,const char*);
+extern int (*udev_enumerate_add_match_property)(struct udev_enumerate*,const char*,const char*);
+extern int (*udev_enumerate_add_match_sysname)(struct udev_enumerate*,const char*);
+extern int (*udev_enumerate_add_match_tag)(struct udev_enumerate*,const char*);
+extern int (*udev_enumerate_add_match_parent)(struct udev_enumerate*,struct udev_device*);
+extern int (*udev_enumerate_add_match_is_initialized)(struct udev_enumerate*);
+extern int (*udev_enumerate_add_syspath)(struct udev_enumerate*,const char*);
+extern int (*udev_enumerate_scan_devices)(struct udev_enumerate*);
+extern int (*udev_enumerate_scan_subsystems)(struct udev_enumerate*);
+extern struct udev_list_entry* (*udev_enumerate_get_list_entry)(struct udev_enumerate*);
+extern struct udev_queue* (*udev_queue_ref)(struct udev_queue*);
+extern struct udev_queue* (*udev_queue_unref)(struct udev_queue*);
+extern struct udev* (*udev_queue_get_udev)(struct udev_queue*);
+extern struct udev_queue* (*udev_queue_new)(struct udev*);
+extern unsigned long long int (*udev_queue_get_kernel_seqnum)(struct udev_queue*);
+extern unsigned long long int (*udev_queue_get_udev_seqnum)(struct udev_queue*);
+extern int (*udev_queue_get_udev_is_active)(struct udev_queue*);
+extern int (*udev_queue_get_queue_is_empty)(struct udev_queue*);
+extern int (*udev_queue_get_seqnum_is_finished)(struct udev_queue*, unsigned long long int);
+extern int (*udev_queue_get_seqnum_sequence_is_finished)(struct udev_queue*, unsigned long long int, unsigned long long int);
+extern int (*udev_queue_get_fd)(struct udev_queue*);
+extern int (*udev_queue_flush)(struct udev_queue*);
+extern struct udev_list_entry* (*udev_queue_get_queued_list_entry)(struct udev_queue*);
+extern struct udev_hwdb* (*udev_hwdb_new)(struct udev*);
+extern struct udev_hwdb* (*udev_hwdb_ref)(struct udev_hwdb*);
+extern struct udev_hwdb* (*udev_hwdb_unref)(struct udev_hwdb*);
+extern struct udev_list_entry* (*udev_hwdb_get_properties_list_entry)(struct udev_hwdb*,const char*, unsigned);
+extern int (*udev_util_encode_string)(const char*, char*, size_t);
+int initialize_libudev();
+#ifdef __cplusplus
+}
+#endif
diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp
index c26224d0e3..cb2df9130f 100644
--- a/scene/3d/sprite_3d.cpp
+++ b/scene/3d/sprite_3d.cpp
@@ -888,11 +888,13 @@ void AnimatedSprite3D::_notification(int p_what) {
} else {
frame = fc - 1;
}
+ emit_signal(SceneStringNames::get_singleton()->animation_finished);
} else {
frame++;
}
_queue_update();
+ emit_signal(SceneStringNames::get_singleton()->frame_changed);
}
float to_process = MIN(timeout, remaining);
@@ -1082,6 +1084,7 @@ void AnimatedSprite3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_frame"), &AnimatedSprite3D::get_frame);
ADD_SIGNAL(MethodInfo("frame_changed"));
+ ADD_SIGNAL(MethodInfo("animation_finished"));
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "frames", PROPERTY_HINT_RESOURCE_TYPE, "SpriteFrames"), "set_sprite_frames", "get_sprite_frames");
ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "animation"), "set_animation", "get_animation");
diff --git a/servers/rendering/renderer_rd/shaders/skeleton.glsl b/servers/rendering/renderer_rd/shaders/skeleton.glsl
index d675e548d7..680d1045cd 100644
--- a/servers/rendering/renderer_rd/shaders/skeleton.glsl
+++ b/servers/rendering/renderer_rd/shaders/skeleton.glsl
@@ -100,7 +100,7 @@ void main() {
for (uint i = 0; i < params.blend_shape_count; i++) {
float w = blend_shape_weights.data[i];
- if ((w < 0.0001) || (w > 0.0001)) {
+ if (abs(w) > 0.0001) {
uint base_offset = (params.vertex_count * i + index) * params.vertex_stride;
blend_vertex += uintBitsToFloat(uvec3(src_blend_shapes.data[base_offset + 0], src_blend_shapes.data[base_offset + 1], src_blend_shapes.data[base_offset + 2])) * w;