summaryrefslogtreecommitdiffhomepage
path: root/proto-shell.c
diff options
context:
space:
mode:
Diffstat (limited to 'proto-shell.c')
-rw-r--r--proto-shell.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/proto-shell.c b/proto-shell.c
index 3b5311c..726977a 100644
--- a/proto-shell.c
+++ b/proto-shell.c
@@ -42,6 +42,7 @@ struct proto_shell_state {
bool teardown_wait_task;
struct netifd_process proto_task;
+ int last_error;
};
static int
@@ -51,10 +52,12 @@ proto_shell_handler(struct interface_proto_state *proto,
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;
@@ -62,6 +65,7 @@ proto_shell_handler(struct interface_proto_state *proto,
if (cmd == PROTO_CMD_SETUP) {
action = "setup";
proc = &state->setup_task;
+ state->last_error = -1;
} else {
action = "teardown";
proc = &state->teardown_task;
@@ -71,6 +75,10 @@ proto_shell_handler(struct interface_proto_state *proto,
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);
@@ -85,8 +93,9 @@ proto_shell_handler(struct interface_proto_state *proto,
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;
@@ -146,6 +155,7 @@ proto_shell_task_cb(struct netifd_process *p, int ret)
return;
}
+ state->last_error = ret;
state->proto.proto_event(&state->proto, IFPEV_LINK_LOST);
proto_shell_handler(&state->proto, PROTO_CMD_TEARDOWN, false);
}