From: Felix Fietkau Date: Thu, 20 Oct 2011 23:28:36 +0000 (+0200) Subject: proto-shell: pass the return code of the proto task to the teardown handler X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=31e8b6e9a4c0db86d27f6bdb21678bb48735a8a1;p=oweals%2Fnetifd.git proto-shell: pass the return code of the proto task to the teardown handler --- 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); }