gst/gstplugin.c: Fixes plugin registering on Mac OSX. Fixes #172526

Original commit message from CVS:
Patch by:  jonathan at kaolin.hn.org

* gst/gstplugin.c: (gst_plugin_check_module),
(gst_plugin_check_file), (gst_plugin_load_file):
Fixes plugin registering on Mac OSX.  Fixes #172526
This commit is contained in:
Thomas Vander Stichele 2005-05-03 12:02:39 +00:00
parent db178c7961
commit 282e19c277
2 changed files with 59 additions and 35 deletions

View file

@ -1,3 +1,11 @@
2005-05-03 Thomas Vander Stichele <thomas at apestaart dot org>
Patch by: jonathan at kaolin.hn.org
* gst/gstplugin.c: (gst_plugin_check_module),
(gst_plugin_check_file), (gst_plugin_load_file):
Fixes plugin registering on Mac OSX. Fixes #172526
2005-05-03 Thomas Vander Stichele <thomas at apestaart dot org>
* configure.ac:
@ -408,7 +416,7 @@
* gst/elements/gstfdsrc.c:
Fix cygwin compile error (#169732).
2005-03-10 Jan Schmidt,,, <thaytan@mad.scientist.com>
2005-03-10 Jan Schmidt <thaytan@mad.scientist.com>
* gst/registries/gstlibxmlregistry.c: (load_plugin), (load_paths):
g_free allocated GstPlugins, since they're not GstObjects.

View file

@ -301,6 +301,46 @@ _gst_plugin_fault_handler_setup (void)
static void _gst_plugin_fault_handler_setup ();
/**
* gst_plugin_check_module:
* @module: GModule handle to check for pluginness
* @error: pointer to a NULL-valued GError
* @pptr: pointer to a gpointer used to return the gst_plugin_desc symbol
* (can be NULL)
*
* Checks if the given module is a GStreamer plugin
*
* Returns: TRUE if the given module is a GStreamer plugin
*/
static gboolean
gst_plugin_check_module (GModule * module, const char *filename,
GError ** error, gpointer * pptr)
{
gpointer ptr;
if (pptr == NULL)
pptr = &ptr;
if (module == NULL) {
GST_DEBUG ("Error loading plugin %s, reason: %s", filename,
g_module_error ());
g_set_error (error, GST_PLUGIN_ERROR, GST_PLUGIN_ERROR_MODULE,
"Error loading plugin %s, reason: %s", filename, g_module_error ());
return FALSE;
}
if (!g_module_symbol (module, "gst_plugin_desc", pptr)) {
GST_DEBUG ("Could not find plugin entry point in \"%s\"", filename);
g_set_error (error,
GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE,
"Could not find plugin entry point in \"%s\"", filename);
return FALSE;
}
return TRUE;
}
/**
* gst_plugin_check_file:
* @filename: the plugin filename to check for pluginness
@ -315,7 +355,7 @@ gst_plugin_check_file (const gchar * filename, GError ** error)
{
GModule *module;
struct stat file_status;
gpointer ptr;
gboolean check;
g_return_val_if_fail (filename != NULL, FALSE);
@ -335,28 +375,12 @@ gst_plugin_check_file (const gchar * filename, GError ** error)
}
module = g_module_open (filename, G_MODULE_BIND_LAZY);
if (module == NULL) {
GST_DEBUG ("Error loading plugin %s, reason: %s\n", filename,
g_module_error ());
g_set_error (error, GST_PLUGIN_ERROR, GST_PLUGIN_ERROR_MODULE,
"Error loading plugin %s, reason: %s\n", filename, g_module_error ());
return FALSE;
}
if (!g_module_symbol (module, "gst_plugin_desc", &ptr)) {
GST_DEBUG ("Could not find plugin entry point in \"%s\"", filename);
g_set_error (error,
GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE,
"Could not find plugin entry point in \"%s\"", filename);
g_module_close (module);
return FALSE;
}
/* it's a plugin */
GST_INFO ("looks like a gst plugin \"%s\"", filename);
check = gst_plugin_check_module (module, filename, error, NULL);
g_module_close (module);
return TRUE;
GST_INFO ("file \"%s\" %s look like a gst plugin", filename,
check ? "does" : "doesn't");
return check;
}
/**
@ -382,16 +406,11 @@ gst_plugin_load_file (const gchar * filename, GError ** error)
GST_CAT_DEBUG (GST_CAT_PLUGIN_LOADING, "attempt to load plugin \"%s\"",
filename);
if (!gst_plugin_check_file (filename, error))
return NULL;
module = g_module_open (filename, G_MODULE_BIND_LAZY);
if (module == NULL)
goto load_error;
if (!g_module_symbol (module, "gst_plugin_desc", &ptr))
goto load_error;
if (!gst_plugin_check_module (module, filename, error, &ptr)) /* handles module == NULL case */
return NULL;
desc = (GstPluginDesc *) ptr;
@ -404,6 +423,7 @@ gst_plugin_load_file (const gchar * filename, GError ** error)
} else {
free_plugin = FALSE;
if (gst_plugin_is_loaded (plugin)) {
g_module_close (module);
if (plugin->filename && strcmp (plugin->filename, filename) != 0) {
GST_WARNING
("plugin %p from file \"%s\" with same name %s is already "
@ -456,15 +476,11 @@ gst_plugin_load_file (const gchar * filename, GError ** error)
GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE,
"gst_plugin_register_func failed for plugin \"%s\"", filename);
g_module_close (module);
if (free_plugin)
g_free (plugin);
return NULL;
}
load_error:
g_set_error (error,
GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE, "generic load error for \"%s\"", filename);
return NULL;
}
static void