bool teardown_wait_task;
struct netifd_process proto_task;
+ int last_error;
};
static int
struct proto_shell_state *state;
struct proto_shell_handler *handler;
struct netifd_process *proc;
- const char *argv[6];
+ static char error_buf[32];
+ const char *argv[7];
+ char *envp[2];
const char *action;
char *config;
- int ret, i = 0;
+ int ret, i = 0, j = 0;
state = container_of(proto, struct proto_shell_state, proto);
handler = state->handler;
if (cmd == PROTO_CMD_SETUP) {
action = "setup";
proc = &state->setup_task;
+ state->last_error = -1;
} else {
action = "teardown";
proc = &state->teardown_task;
state->teardown_pending = true;
return 0;
}
+ if (state->last_error >= 0) {
+ snprintf(error_buf, sizeof(error_buf), "ERROR=%d", state->last_error);
+ envp[j++] = error_buf;
+ }
}
config = blobmsg_format_json(state->config, true);
if (proto->iface->main_dev.dev)
argv[i++] = proto->iface->main_dev.dev->ifname;
argv[i] = NULL;
+ envp[j] = NULL;
- ret = netifd_start_process(argv, NULL, proc);
+ ret = netifd_start_process(argv, envp, proc);
free(config);
return ret;
return;
}
+ state->last_error = ret;
state->proto.proto_event(&state->proto, IFPEV_LINK_LOST);
proto_shell_handler(&state->proto, PROTO_CMD_TEARDOWN, false);
}