projects
/
project
/
netifd.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
8f689d0
)
proto-shell: pass the return code of the proto task to the teardown handler
author
Felix Fietkau
<nbd@openwrt.org>
Thu, 20 Oct 2011 23:28:36 +0000
(
01:28
+0200)
committer
Felix Fietkau
<nbd@openwrt.org>
Thu, 20 Oct 2011 23:28:40 +0000
(
01:28
+0200)
proto-shell.c
patch
|
blob
|
history
diff --git
a/proto-shell.c
b/proto-shell.c
index 3b5311ce17a228f55e4ef90eb415f9e40a823e7e..726977adb06d400d2b46efad5ba49322a1ac34c6 100644
(file)
--- 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;
bool teardown_wait_task;
struct netifd_process proto_task;
+ int last_error;
};
static int
};
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;
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;
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;
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;
if (cmd == PROTO_CMD_SETUP) {
action = "setup";
proc = &state->setup_task;
+ state->last_error = -1;
} else {
action = "teardown";
proc = &state->teardown_task;
} 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;
}
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);
}
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;
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;
free(config);
return ret;
@@
-146,6
+155,7
@@
proto_shell_task_cb(struct netifd_process *p, int ret)
return;
}
return;
}
+ state->last_error = ret;
state->proto.proto_event(&state->proto, IFPEV_LINK_LOST);
proto_shell_handler(&state->proto, PROTO_CMD_TEARDOWN, false);
}
state->proto.proto_event(&state->proto, IFPEV_LINK_LOST);
proto_shell_handler(&state->proto, PROTO_CMD_TEARDOWN, false);
}