summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core.c11
-rw-r--r--src/rest.c1
-rw-r--r--src/rest.h2
3 files changed, 14 insertions, 0 deletions
diff --git a/src/core.c b/src/core.c
index 6aa9b5c..9fe83bf 100644
--- a/src/core.c
+++ b/src/core.c
@@ -186,14 +186,25 @@ static void og_agent_reset_state(struct og_client *cli)
memset(cli->buf, 0, sizeof(cli->buf));
}
+#define OG_AGENT_CMD_TIMEOUT 900
+
static void og_agent_deliver_pending_cmd(struct og_client *cli)
{
+ struct timeval now, elapsed;
const struct og_cmd *cmd;
cmd = og_cmd_find(inet_ntoa(cli->addr.sin_addr));
if (!cmd)
return;
+ gettimeofday(&now, NULL);
+ timersub(&now, &cmd->tv, &elapsed);
+ if (elapsed.tv_sec >= OG_AGENT_CMD_TIMEOUT) {
+ og_dbi_update_action(cmd->id, false);
+ og_cmd_free(cmd);
+ return;
+ }
+
og_send_request(cmd->method, cmd->type, &cmd->params, cmd->json);
cli->last_cmd_id = cmd->id;
diff --git a/src/rest.c b/src/rest.c
index 41738ea..0835f68 100644
--- a/src/rest.c
+++ b/src/rest.c
@@ -2323,6 +2323,7 @@ static void og_cmd_init(struct og_cmd *cmd, enum og_rest_method method,
cmd->params.ips_array[0] = strdup(cmd->ip);
cmd->params.ips_array_len = 1;
cmd->json = root;
+ gettimeofday(&cmd->tv, NULL);
}
static int og_cmd_legacy_wol(const char *input, struct og_cmd *cmd)
diff --git a/src/rest.h b/src/rest.h
index 43ddd66..9c4f5e8 100644
--- a/src/rest.h
+++ b/src/rest.h
@@ -2,6 +2,7 @@
#define OG_REST_H
#include <ev.h>
+#include <sys/time.h>
extern struct ev_loop *og_loop;
@@ -89,6 +90,7 @@ struct og_cmd {
enum og_rest_method method;
struct og_msg_params params;
json_t *json;
+ struct timeval tv;
};
const struct og_cmd *og_cmd_find(const char *client_ip);