X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=proto-shell.c;h=415eb74c0d126bf486aba42287b458f3a4b85e3d;hp=0e1412ba53bda1e40839eef264ce67261fe32842;hb=f8276b9b149f3b0c8f3cdf8d3d0c232bd92e3464;hpb=745016bc4a0c143296861d6a322042f217467e28 diff --git a/proto-shell.c b/proto-shell.c index 0e1412b..415eb74 100644 --- a/proto-shell.c +++ b/proto-shell.c @@ -18,7 +18,7 @@ #include "interface-ip.h" #include "proto.h" -static int proto_fd; +static struct netifd_fd proto_fd; struct proto_shell_handler { struct list_head list; @@ -86,7 +86,7 @@ proto_shell_handler(struct interface_proto_state *proto, argv[i++] = proto->iface->main_dev.dev->ifname; argv[i] = NULL; - ret = netifd_start_process(argv, NULL, proto_fd, proc); + ret = netifd_start_process(argv, NULL, proc); free(config); return ret; @@ -125,10 +125,6 @@ proto_shell_teardown_cb(struct netifd_process *p, int ret) return; netifd_kill_process(&state->proto_task); - - if (state->l3_dev.dev) - device_remove_user(&state->l3_dev); - state->proto.proto_event(&state->proto, IFPEV_DOWN); } @@ -322,11 +318,14 @@ proto_shell_update_link(struct proto_shell_state *state, struct blob_attr **tb) if (!tb[NOTIFY_IFNAME]) { if (!state->proto.iface->main_dev.dev) return UBUS_STATUS_INVALID_ARGUMENT; - } else if (!state->l3_dev.dev) { + } else { + if (state->l3_dev.dev) + device_remove_user(&state->l3_dev); + device_add_user(&state->l3_dev, device_get(blobmsg_data(tb[NOTIFY_IFNAME]), true)); - device_claim(&state->l3_dev); state->proto.iface->l3_dev = &state->l3_dev; + device_claim(&state->l3_dev); } interface_ip_update_start(state->proto.iface); @@ -401,7 +400,7 @@ proto_shell_run_command(struct proto_shell_state *state, struct blob_attr **tb) if (!fill_string_list(tb[NOTIFY_ENV], env, ARRAY_SIZE(env))) goto error; - netifd_start_process((const char **) argv, (char **) env, proto_fd, &state->proto_task); + netifd_start_process((const char **) argv, (char **) env, &state->proto_task); return 0; @@ -469,8 +468,14 @@ proto_shell_attach(const struct proto_handler *h, struct interface *iface, state->proto.cb = proto_shell_handler; state->setup_timeout.cb = proto_shell_setup_timeout_cb; state->setup_task.cb = proto_shell_setup_cb; + state->setup_task.dir_fd = proto_fd.fd; + state->setup_task.log_prefix = iface->name; state->teardown_task.cb = proto_shell_teardown_cb; + state->teardown_task.dir_fd = proto_fd.fd; + state->teardown_task.log_prefix = iface->name; state->proto_task.cb = proto_shell_task_cb; + state->proto_task.dir_fd = proto_fd.fd; + state->proto_task.log_prefix = iface->name; state->handler = container_of(h, struct proto_shell_handler, proto); return &state->proto; @@ -673,10 +678,11 @@ void __init proto_shell_init(void) if (chdir("./proto")) goto close_cur; - proto_fd = open(".", O_RDONLY | O_DIRECTORY); - if (proto_fd < 0) + proto_fd.fd = open(".", O_RDONLY | O_DIRECTORY); + if (proto_fd.fd < 0) goto close_cur; + netifd_fd_add(&proto_fd); glob("./*.sh", 0, NULL, &g); for (i = 0; i < g.gl_pathc; i++) proto_shell_add_script(g.gl_pathv[i]);