changeset 737:8a8873e7a552

Make shell command and its option rc file options instead of hardcoded strings. This allows users to modify the shell command that execute "editors". Two new options appear in rc file: - shell.path (default to "/bin/sh") - shell.options (default to "-c") These options can only be changed from the rc file, not at runtime. Tests are made to check that shell.path is not empty and lead to an executable file.
author zas_
date Thu, 22 May 2008 20:22:13 +0000
parents a7289f9e8d29
children ff8b802eac58
files src/editors.c src/main.c src/main.h src/options.h src/rcfile.c
diffstat 5 files changed, 42 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/editors.c	Thu May 22 13:00:45 2008 +0000
+++ b/src/editors.c	Thu May 22 20:22:13 2008 +0000
@@ -27,8 +27,6 @@
 #define EDITOR_WINDOW_WIDTH 500
 #define EDITOR_WINDOW_HEIGHT 300
 
-#define COMMAND_SHELL "/bin/sh"
-#define COMMAND_OPT  "-c"
 
 
 typedef struct _EditorVerboseData EditorVerboseData;
@@ -579,14 +577,30 @@
 
 	if (ok)
 		{
+		ok = (options->shell.path && *options->shell.path);
+		if (!ok) log_printf("ERROR: empty shell command\n");
+			
+		if (ok)
+			{
+			ok = (access(options->shell.path, X_OK) == 0);
+			if (!ok) log_printf("ERROR: cannot execute shell command '%s'\n", options->shell.path);
+			}
+
+		if (!ok) ed->flags |= EDITOR_ERROR_CANT_EXEC;
+		}
+
+	if (ok)
+		{
 		gchar *working_directory;
 		gchar *args[4];
+		guint n = 0;
 
 		working_directory = remove_level_from_path(fd->path);
-		args[0] = COMMAND_SHELL;
-		args[1] = COMMAND_OPT;
-		args[2] = command;
-		args[3] = NULL;
+		args[n++] = options->shell.path;
+		if (options->shell.options && *options->shell.options)
+			args[n++] = options->shell.options;
+		args[n++] = command;
+		args[n] = NULL;
 
 		ok = g_spawn_async_with_pipes(working_directory, args, NULL,
 				      G_SPAWN_DO_NOT_REAP_CHILD, /* GSpawnFlags */
--- a/src/main.c	Thu May 22 13:00:45 2008 +0000
+++ b/src/main.c	Thu May 22 20:22:13 2008 +0000
@@ -580,6 +580,9 @@
 	sidecar_ext_add_defaults();
 	options->layout.order = g_strdup("123");
 	options->properties.tabs_order = g_strdup(info_tab_default_order());
+
+	options->shell.path = g_strdup(GQ_DEFAULT_SHELL_PATH);
+	options->shell.options = g_strdup(GQ_DEFAULT_SHELL_OPTIONS);
 }
 
 static void exit_program_final(void)
--- a/src/main.h	Thu May 22 13:00:45 2008 +0000
+++ b/src/main.h	Thu May 22 20:22:13 2008 +0000
@@ -90,6 +90,9 @@
 
 #define GQ_EDITOR_GENERIC_SLOTS 10
 
+#define GQ_DEFAULT_SHELL_PATH "/bin/sh"
+#define GQ_DEFAULT_SHELL_OPTIONS "-c"
+
 #define COLOR_PROFILE_INPUTS 4
 
 #define DEFAULT_THUMB_WIDTH	96
--- a/src/options.h	Thu May 22 13:00:45 2008 +0000
+++ b/src/options.h	Thu May 22 20:22:13 2008 +0000
@@ -110,6 +110,12 @@
 	/* editors */
 	Editor editor[GQ_EDITOR_SLOTS];
 
+	/* shell */
+	struct {
+		gchar *path;
+		gchar *options;
+	} shell;
+	
 	/* file sorting */
 	struct {
 		SortType method;
--- a/src/rcfile.c	Thu May 22 13:00:45 2008 +0000
+++ b/src/rcfile.c	Thu May 22 20:22:13 2008 +0000
@@ -548,6 +548,12 @@
 	WRITE_INT(color_profile.screen_type);
 	WRITE_CHAR(color_profile.screen_file);
 
+
+	WRITE_SUBTITLE("Shell command");
+	WRITE_CHAR(shell.path);
+	WRITE_CHAR(shell.options);
+
+
 	WRITE_SUBTITLE("External Programs");
 	secure_fprintf(ssi, "# Maximum of %d programs (external_1 through external_%d)\n", GQ_EDITOR_GENERIC_SLOTS, GQ_EDITOR_GENERIC_SLOTS);
 	secure_fprintf(ssi, "# external_%d through external_%d are used for file ops\n", GQ_EDITOR_GENERIC_SLOTS + 1, GQ_EDITOR_SLOTS);
@@ -879,6 +885,10 @@
 		READ_INT(color_profile.screen_type);
 		READ_CHAR(color_profile.screen_file);
 
+		/* Shell command */
+		READ_CHAR(shell.path);
+		READ_CHAR(shell.options);
+
 		/* External Programs */
 
 		if (is_numbered_option(option, "external_", &i))