Partial exec, environment variables
This commit is contained in:
37
ce/interp.c
37
ce/interp.c
@@ -340,7 +340,7 @@ static void help (struct context* context) {
|
||||
}
|
||||
|
||||
static void cmd_cancel_proc (void* arg) {
|
||||
int pid = (int)arg;
|
||||
int pid = (int)(uintptr_t)arg;
|
||||
|
||||
char ch = 0;
|
||||
do {
|
||||
@@ -350,6 +350,18 @@ static void cmd_cancel_proc (void* arg) {
|
||||
kill (pid);
|
||||
}
|
||||
|
||||
static void cmd_collect_proc (void* arg) {
|
||||
#define RECV_MAX (1024 * 16)
|
||||
|
||||
for (;;) {
|
||||
char recv[RECV_MAX];
|
||||
memset (recv, 0, sizeof (recv));
|
||||
mail_receive (&recv, sizeof (recv) - 1);
|
||||
|
||||
mail_send (e_pgid, recv, strlen (recv));
|
||||
}
|
||||
}
|
||||
|
||||
static void execute_cmd (struct ast_cmd* cmd, struct context* context) {
|
||||
if (strcmp (cmd->name, "echo") == 0) {
|
||||
echo (context, cmd->args, cmd->arg_count);
|
||||
@@ -398,19 +410,40 @@ static void execute_cmd (struct ast_cmd* cmd, struct context* context) {
|
||||
return;
|
||||
}
|
||||
|
||||
int pid = exec (volume, path);
|
||||
int pid = exec_partial (volume, path);
|
||||
|
||||
if (pid < 0) {
|
||||
cprintf (context, "ERROR could not run '%s': %s\n", cmd->name, str_status[-pid]);
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < cmd->arg_count; i++) {
|
||||
char* arg = cmd->args[i];
|
||||
char *key, *value;
|
||||
|
||||
char* sep = strchr (arg, '=');
|
||||
|
||||
if (sep != NULL) {
|
||||
*sep = '\0';
|
||||
|
||||
key = arg;
|
||||
value = sep + 1;
|
||||
|
||||
env_set (pid, key, value, strlen (value) + 1);
|
||||
}
|
||||
}
|
||||
|
||||
exec_partial_fini (pid);
|
||||
|
||||
struct process_data* cancel_pdata = process_spawn (&cmd_cancel_proc, (void*)pid);
|
||||
struct process_data* collect_pdata = process_spawn (&cmd_collect_proc, NULL);
|
||||
|
||||
wait_for_pid (pid);
|
||||
|
||||
kill (cancel_pdata->pid);
|
||||
process_data_free (cancel_pdata);
|
||||
kill (collect_pdata->pid);
|
||||
process_data_free (collect_pdata);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user