- if (interval->cancelled)
- free(interval);
-}
-
-static void handle_set_interval(struct blob_attr *msg, struct blob_attr *data)
-{
- static struct blobmsg_policy set_interval_policy[2] = {
- { .type = BLOBMSG_TYPE_STRING },
- { .type = BLOBMSG_TYPE_STRING },
- };
- struct blob_attr *tb[2];
- struct cmd_interval *interval;
- struct blob_attr *_msg, *_data;
- char *_key;
- char *name;
- int msecs;
-
- blobmsg_parse_array(set_interval_policy, 2, tb, blobmsg_data(data), blobmsg_data_len(data));
- if (!tb[0] || !tb[1])
- return;
- name = blobmsg_get_string(tb[0]);
- msecs = strtol(blobmsg_get_string(tb[1]), NULL, 0);
-
- interval = calloc_a(sizeof(struct cmd_interval),
- &_key, strlen(name) + 1,
- &_msg, blob_pad_len(msg),
- &_data, blob_pad_len(data),
- NULL);
- if (!interval)
- return;
-
- strcpy(_key, name);
- interval->avl.key = _key;
- interval->msg = _msg;
- interval->data = _data;
- clock_gettime(CLOCK_MONOTONIC, &interval->start);
- interval->timeout.cb = handle_set_interval_timeout;
- interval->process.cb = handle_set_interval_process_cb;
-
- memcpy(interval->msg, msg, blob_pad_len(msg));
- memcpy(interval->data, data, blob_pad_len(data));
-
- avl_insert(&cmd_intervals, &interval->avl);
-
- uloop_timeout_set(&interval->timeout, msecs);
-}
-
-static void handle_clear_interval(struct blob_attr *msg, struct blob_attr *data)
-{
- static struct blobmsg_policy clear_interval_policy = {
- .type = BLOBMSG_TYPE_STRING,
- };
- struct blob_attr *tb;
- struct cmd_interval *interval;
- char *name;
-
- blobmsg_parse_array(&clear_interval_policy, 1, &tb, blobmsg_data(data), blobmsg_data_len(data));
- if (!tb)
- return;
- name = blobmsg_get_string(tb);
-
- interval = avl_find_element(&cmd_intervals, name, interval, avl);
- if (interval) {
- uloop_timeout_cancel(&interval->timeout);
- avl_delete(&cmd_intervals, &interval->avl);
- if (interval->process.pending)
- interval->cancelled = true;
- else
- free(interval);
- }