summaryrefslogtreecommitdiff
path: root/src/plugins/scripts/python/weechat-python.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/scripts/python/weechat-python.c')
-rw-r--r--src/plugins/scripts/python/weechat-python.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/plugins/scripts/python/weechat-python.c b/src/plugins/scripts/python/weechat-python.c
index dadf38fb7..a49aad852 100644
--- a/src/plugins/scripts/python/weechat-python.c
+++ b/src/plugins/scripts/python/weechat-python.c
@@ -25,6 +25,9 @@
#undef _
#include <Python.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
#include "../../weechat-plugin.h"
#include "../script.h"
@@ -47,6 +50,7 @@ struct t_plugin_script *python_current_script = NULL;
struct t_plugin_script *python_registered_script = NULL;
const char *python_current_script_filename = NULL;
PyThreadState *python_mainThreadState = NULL;
+char *python2_bin = NULL;
/*
* string used to execute action "install":
@@ -68,6 +72,54 @@ char python_buffer_output[128];
/*
+ * weechat_python_set_python2_bin: set path to python 2.x interpreter
+ */
+
+void
+weechat_python_set_python2_bin ()
+{
+ const char *dir_separator;
+ char *path, **paths, bin[4096];
+ char *versions[] = { "2", "2.7", "2.6", "2.5", "2.4", "2.3", "2.2", NULL };
+ int num_paths, i, j, rc;
+ struct stat stat_buf;
+
+ python2_bin = NULL;
+
+ dir_separator = weechat_info_get ("dir_separator", "");
+ path = getenv ("PATH");
+
+ if (dir_separator && path)
+ {
+ paths = weechat_string_split (path, ":", 0, 0, &num_paths);
+ if (paths)
+ {
+ for (i = 0; i < num_paths; i++)
+ {
+ for (j = 0; versions[j]; j++)
+ {
+ snprintf (bin, sizeof (bin), "%s%s%s%s",
+ paths[i], dir_separator, "python",
+ versions[j]);
+ rc = stat (bin, &stat_buf);
+ if ((rc == 0) && (S_ISREG(stat_buf.st_mode)))
+ {
+ python2_bin = strdup (bin);
+ break;
+ }
+ }
+ if (python2_bin)
+ break;
+ }
+ weechat_string_free_split (paths);
+ }
+ }
+
+ if (!python2_bin)
+ python2_bin = strdup ("python");
+}
+
+/*
* weechat_python_hashtable_map_cb: callback called for each key/value in a
* hashtable
*/
@@ -795,6 +847,26 @@ weechat_python_completion_cb (void *data, const char *completion_item,
}
/*
+ * weechat_python_info_cb: callback for info
+ */
+
+const char *
+weechat_python_info_cb (void *data, const char *info_name,
+ const char *arguments)
+{
+ /* make C compiler happy */
+ (void) data;
+ (void) arguments;
+
+ if (weechat_strcasecmp (info_name, "python2_bin") == 0)
+ {
+ return python2_bin;
+ }
+
+ return NULL;
+}
+
+/*
* weechat_python_infolist_cb: callback for infolist
*/
@@ -939,6 +1011,16 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[])
{
weechat_python_plugin = plugin;
+ /*
+ * hook info to get path to python 2.x interpreter
+ * (some scripts using hook_process need that)
+ */
+ weechat_python_set_python2_bin ();
+ weechat_hook_info ("python2_bin",
+ N_("path to python 2.x interpreter"),
+ NULL,
+ &weechat_python_info_cb, NULL);
+
/* init stdout/stderr buffer */
python_buffer_output[0] = '\0';
@@ -1019,6 +1101,8 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
}
/* free some data */
+ if (python2_bin)
+ free (python2_bin);
if (python_action_install_list)
free (python_action_install_list);
if (python_action_remove_list)