proto-shell: allow running protocols without proto_task.
[project/netifd.git] / proto-shell.c
index bc4c658..50f1b5b 100644 (file)
@@ -44,6 +44,7 @@ struct proto_shell_handler {
        char *config_buf;
        char *script_name;
        bool init_available;
+       bool no_proto_task;
 
        struct uci_blob_param_list config;
 };
@@ -284,11 +285,12 @@ proto_shell_task_finish(struct proto_shell_state *state,
                if (task == &state->proto_task)
                        proto_shell_handler(&state->proto, PROTO_CMD_TEARDOWN,
                                            false);
-               if (task == &state->script_task) {
+               else if (task == &state->script_task) {
                        if (state->renew_pending)
                                proto_shell_handler(&state->proto,
                                                    PROTO_CMD_RENEW, false);
-                       else if (!state->proto_task.uloop.pending &&
+                       else if (!state->handler->no_proto_task &&
+                                !state->proto_task.uloop.pending &&
                                 state->sm == S_SETUP)
                                proto_shell_handler(&state->proto,
                                                    PROTO_CMD_TEARDOWN,
@@ -818,6 +820,12 @@ proto_shell_add_handler(const char *script, const char *name, json_object *obj)
        if (tmp && json_object_get_boolean(tmp))
                handler->proto.flags |= PROTO_FLAG_NODEV;
 
+       tmp = json_get_field(obj, "no-proto-task", json_type_boolean);
+       if (tmp && json_object_get_boolean(tmp))
+               handler->no_proto_task = true;
+       else
+               handler->no_proto_task = false;
+
        tmp = json_get_field(obj, "available", json_type_boolean);
        if (tmp && json_object_get_boolean(tmp))
                handler->proto.flags |= PROTO_FLAG_INIT_AVAILABLE;