Allow passing additional parameters to shell_exec()
This allows for specifying multiple command line parameters to be passed on to the command in a way similar to fork_exec(). This is useful if we want to wrap editor or pager invocations in a shell. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
parent
2951cf8320
commit
ce13b70c5a
@ -930,7 +930,7 @@ void str_toupper (char *);
|
|||||||
void file_close (FILE *, const char *);
|
void file_close (FILE *, const char *);
|
||||||
void psleep (unsigned);
|
void psleep (unsigned);
|
||||||
int fork_exec (int *, int *, const char *, const char *const *);
|
int fork_exec (int *, int *, const char *, const char *const *);
|
||||||
int shell_exec (int *, int *, const char *);
|
int shell_exec (int *, int *, const char *, const char *const *);
|
||||||
int child_wait (int *, int *, int);
|
int child_wait (int *, int *, int);
|
||||||
void press_any_key (void);
|
void press_any_key (void);
|
||||||
void print_apoint (const char *, long, struct apoint *);
|
void print_apoint (const char *, long, struct apoint *);
|
||||||
|
@ -1180,6 +1180,7 @@ void
|
|||||||
day_pipe_item (void)
|
day_pipe_item (void)
|
||||||
{
|
{
|
||||||
char cmd[BUFSIZ] = "";
|
char cmd[BUFSIZ] = "";
|
||||||
|
char const *arg[] = { cmd, NULL };
|
||||||
int pout;
|
int pout;
|
||||||
int pid;
|
int pid;
|
||||||
FILE *fpout;
|
FILE *fpout;
|
||||||
@ -1196,7 +1197,7 @@ day_pipe_item (void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
wins_prepare_external ();
|
wins_prepare_external ();
|
||||||
if ((pid = shell_exec (NULL, &pout, cmd)))
|
if ((pid = shell_exec (NULL, &pout, *arg, arg)))
|
||||||
{
|
{
|
||||||
fpout = fdopen (pout, "w");
|
fpout = fdopen (pout, "w");
|
||||||
|
|
||||||
|
@ -469,6 +469,7 @@ void
|
|||||||
todo_pipe_item (void)
|
todo_pipe_item (void)
|
||||||
{
|
{
|
||||||
char cmd[BUFSIZ] = "";
|
char cmd[BUFSIZ] = "";
|
||||||
|
char const *arg[] = { cmd, NULL };
|
||||||
int pout;
|
int pout;
|
||||||
int pid;
|
int pid;
|
||||||
FILE *fpout;
|
FILE *fpout;
|
||||||
@ -479,7 +480,7 @@ todo_pipe_item (void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
wins_prepare_external ();
|
wins_prepare_external ();
|
||||||
if ((pid = shell_exec (NULL, &pout, cmd)))
|
if ((pid = shell_exec (NULL, &pout, *arg, arg)))
|
||||||
{
|
{
|
||||||
fpout = fdopen (pout, "w");
|
fpout = fdopen (pout, "w");
|
||||||
|
|
||||||
|
43
src/utils.c
43
src/utils.c
@ -1015,10 +1015,47 @@ fork_exec (int *pfdin, int *pfdout, const char *path, const char *const *arg)
|
|||||||
|
|
||||||
/* Execute an external program in a shell. */
|
/* Execute an external program in a shell. */
|
||||||
int
|
int
|
||||||
shell_exec (int *pfdin, int *pfdout, const char *cmd)
|
shell_exec (int *pfdin, int *pfdout, const char *path, const char *const *arg)
|
||||||
{
|
{
|
||||||
const char *arg[] = { "/bin/sh", "-c", cmd, NULL };
|
int argc, i;
|
||||||
return fork_exec (pfdin, pfdout, *arg, arg);
|
const char **narg;
|
||||||
|
char *arg0 = NULL;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
for (argc = 0; arg[argc]; argc++)
|
||||||
|
;
|
||||||
|
|
||||||
|
if (argc < 1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
narg = mem_calloc (argc + 4, sizeof (const char *));
|
||||||
|
|
||||||
|
narg[0] = "sh";
|
||||||
|
narg[1] = "-c";
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
arg0 = mem_malloc (strlen (path) + 6);
|
||||||
|
sprintf (arg0, "%s \"$@\"", path);
|
||||||
|
narg[2] = arg0;
|
||||||
|
|
||||||
|
for (i = 0; i < argc; i++)
|
||||||
|
narg[i + 3] = arg[i];
|
||||||
|
narg[argc + 3] = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
narg[2] = path;
|
||||||
|
narg[3] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fork_exec (pfdin, pfdout, *narg, narg);
|
||||||
|
|
||||||
|
if (arg0)
|
||||||
|
mem_free (arg0);
|
||||||
|
mem_free (narg);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for a child process to terminate. */
|
/* Wait for a child process to terminate. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user