X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=proto-shell.c;h=038fb0b8ff7e980babed5934386a114de6277f19;hp=78585df40b09957ca540adbd55561c9fb438519c;hb=a02432a5ecbb588964a1800122a213822da96f3c;hpb=6c735bda1dbf9a0aaaa6fbae95d3dfe557e97bf8 diff --git a/proto-shell.c b/proto-shell.c index 78585df..038fb0b 100644 --- a/proto-shell.c +++ b/proto-shell.c @@ -30,8 +30,9 @@ #include "interface.h" #include "interface-ip.h" #include "proto.h" +#include "system.h" -static struct netifd_fd proto_fd; +static int proto_fd = -1; enum proto_shell_sm { S_IDLE, @@ -316,6 +317,8 @@ proto_shell_free(struct interface_proto_state *proto) struct proto_shell_state *state; state = container_of(proto, struct proto_shell_state, proto); + uloop_timeout_cancel(&state->teardown_timeout); + proto_shell_clear_host_dep(state); netifd_kill_process(&state->script_task); netifd_kill_process(&state->proto_task); free(state->config); @@ -380,6 +383,8 @@ enum { NOTIFY_DATA, NOTIFY_KEEP, NOTIFY_HOST, + NOTIFY_DNS, + NOTIFY_DNS_SEARCH, __NOTIFY_LAST }; @@ -399,6 +404,8 @@ static const struct blobmsg_policy notify_attr[__NOTIFY_LAST] = { [NOTIFY_DATA] = { .name = "data", .type = BLOBMSG_TYPE_TABLE }, [NOTIFY_KEEP] = { .name = "keep", .type = BLOBMSG_TYPE_BOOL }, [NOTIFY_HOST] = { .name = "host", .type = BLOBMSG_TYPE_STRING }, + [NOTIFY_DNS] = { .name = "dns", .type = BLOBMSG_TYPE_ARRAY }, + [NOTIFY_DNS_SEARCH] = { .name = "dns_search", .type = BLOBMSG_TYPE_ARRAY }, }; static int @@ -450,6 +457,7 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr *data, interface_set_l3_dev(iface, dev); device_claim(&iface->l3_dev); + device_set_present(dev, true); } if (!keep) @@ -463,6 +471,12 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr *data, if ((cur = tb[NOTIFY_ROUTES6]) != NULL) proto_shell_parse_route_list(state->proto.iface, cur, true); + if ((cur = tb[NOTIFY_DNS])) + interface_add_dns_server_list(&iface->proto_ip, cur); + + if ((cur = tb[NOTIFY_DNS_SEARCH])) + interface_add_dns_search_list(&iface->proto_ip, cur); + interface_update_complete(state->proto.iface); if (!keep) @@ -624,6 +638,22 @@ proto_shell_add_host_dependency(struct proto_shell_state *state, struct blob_att } static int +proto_shell_setup_failed(struct proto_shell_state *state) +{ + switch (state->sm) { + case S_IDLE: + state->proto.proto_event(&state->proto, IFPEV_LINK_LOST); + /* fall through */ + case S_SETUP: + proto_shell_handler(&state->proto, PROTO_CMD_TEARDOWN, false); + break; + default: + break; + } + return 0; +} + +static int proto_shell_notify(struct interface_proto_state *proto, struct blob_attr *attr) { struct proto_shell_state *state; @@ -650,6 +680,8 @@ proto_shell_notify(struct interface_proto_state *proto, struct blob_attr *attr) return proto_shell_set_available(state, tb); case 6: return proto_shell_add_host_dependency(state, tb); + case 7: + return proto_shell_setup_failed(state); default: return UBUS_STATUS_INVALID_ARGUMENT; } @@ -674,10 +706,10 @@ proto_shell_attach(const struct proto_handler *h, struct interface *iface, state->proto.cb = proto_shell_handler; state->teardown_timeout.cb = proto_shell_teardown_timeout_cb; state->script_task.cb = proto_shell_script_cb; - state->script_task.dir_fd = proto_fd.fd; + state->script_task.dir_fd = proto_fd; state->script_task.log_prefix = iface->name; state->proto_task.cb = proto_shell_task_cb; - state->proto_task.dir_fd = proto_fd.fd; + state->proto_task.dir_fd = proto_fd; state->proto_task.log_prefix = iface->name; state->handler = container_of(h, struct proto_shell_handler, proto); @@ -877,11 +909,11 @@ static void __init proto_shell_init(void) if (chdir("./proto")) goto close_cur; - proto_fd.fd = open(".", O_RDONLY | O_DIRECTORY); - if (proto_fd.fd < 0) + proto_fd = open(".", O_RDONLY | O_DIRECTORY); + if (proto_fd < 0) goto close_cur; - netifd_fd_add(&proto_fd); + system_fd_set_cloexec(proto_fd); glob("./*.sh", 0, NULL, &g); for (i = 0; i < g.gl_pathc; i++) proto_shell_add_script(g.gl_pathv[i]);