summary refs log tree commit diff stats
path: root/src/common/plugin.c
diff options
context:
space:
mode:
authorTingPing <tingping@tingping.se>2013-08-10 19:44:38 -0400
committerTingPing <tingping@tingping.se>2013-08-10 19:44:38 -0400
commit0b95c1c444fd87583ae87ea3c59e883b5bfbbd0e (patch)
tree6efeb9871254fa3a5c6071558c061a820287b83c /src/common/plugin.c
parent41c0c345cd45f01ec313de05aac7a1715ebd4476 (diff)
parent2917a83d7b5c8660d6eb518eb3d781faff32c3d3 (diff)
Merge branch 'pluginreload'
Diffstat (limited to 'src/common/plugin.c')
-rw-r--r--src/common/plugin.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/common/plugin.c b/src/common/plugin.c
index 50157ea1..9ce387c8 100644
--- a/src/common/plugin.c
+++ b/src/common/plugin.c
@@ -512,6 +512,44 @@ plugin_auto_load (session *sess)
 	g_free (sub_dir);
 }
 
+int
+plugin_reload (session *sess, char *name, int by_filename)
+{
+	GSList *list;
+	char *filename;
+	char *ret;
+	hexchat_plugin *pl;
+
+	list = plugin_list;
+	while (list)
+	{
+		pl = list->data;
+		/* static-plugins (plugin-timer.c) have a NULL filename */
+		if ((by_filename && pl->filename && g_ascii_strcasecmp (name, pl->filename) == 0) ||
+			 (by_filename && pl->filename && g_ascii_strcasecmp (name, file_part (pl->filename)) == 0) ||
+			(!by_filename && g_ascii_strcasecmp (name, pl->name) == 0))
+		{
+			/* statically linked plugins have a NULL filename */
+			if (pl->filename != NULL && !pl->fake)
+			{
+				filename = g_strdup (pl->filename);
+				plugin_free (pl, TRUE, FALSE);
+				ret = plugin_load (sess, filename, NULL);
+				g_free (filename);
+				if (ret == NULL)
+					return 1;
+				else
+					return 0;
+			}
+			else
+				return 2;
+		}
+		list = list->next;
+	}
+
+	return 0;
+}
+
 #endif
 
 static GSList *