Skip to content

Commit

Permalink
Make shell command and its option rc file options instead of hardcode…
Browse files Browse the repository at this point in the history
…d 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.
  • Loading branch information
Laurent Monin committed May 22, 2008
1 parent 94c67ee commit b5d0f1f
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 6 deletions.
26 changes: 20 additions & 6 deletions src/editors.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -577,16 +575,32 @@ static gint editor_command_one(const gchar *template, GList *list, EditorData *e

ok = !(ed->flags & EDITOR_ERROR_MASK);

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 */
Expand Down
3 changes: 3 additions & 0 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,9 @@ static void setup_default_options(void)
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)
Expand Down
3 changes: 3 additions & 0 deletions src/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions src/options.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ struct _ConfOptions
/* editors */
Editor editor[GQ_EDITOR_SLOTS];

/* shell */
struct {
gchar *path;
gchar *options;
} shell;

/* file sorting */
struct {
SortType method;
Expand Down
10 changes: 10 additions & 0 deletions src/rcfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,12 @@ void save_options(void)
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);
Expand Down Expand Up @@ -879,6 +885,10 @@ void load_options(void)
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))
Expand Down

0 comments on commit b5d0f1f

Please sign in to comment.