diff --git a/endpoints/api_v1_controllers_discover.c b/endpoints/api_v1_controllers_discover.c index c64eb32..14ea2fb 100644 --- a/endpoints/api_v1_controllers_discover.c +++ b/endpoints/api_v1_controllers_discover.c @@ -197,6 +197,12 @@ api_v1_controllers_discover_POST(struct mg_connection *c, endpoint_args_t *args, uint16_t discovered_command_port = mpack_node_u16(mpack_node_map_uint(root, DISCOVERY_MAPPING_COMMAND_PORT)); uint8_t discovered_relay_count = mpack_node_u8(mpack_node_map_uint(root, DISCOVERY_MAPPING_RELAY_COUNT)); const char *discovered_name = mpack_node_str(mpack_node_map_uint(root, DISCOVERY_MAPPING_NAME)); + size_t discovered_name_len = mpack_node_strlen(mpack_node_map_uint(root, DISCOVERY_MAPPING_NAME)); + + if(discovered_name_len > MAX_NAME_LENGTH) + { + discovered_name_len = MAX_NAME_LENGTH; + } bool found_discovered_in_list = 0; @@ -207,7 +213,7 @@ api_v1_controllers_discover_POST(struct mg_connection *c, endpoint_args_t *args, if(uuid_compare(known_controllers[i]->uid, discovered_id) == 0) { known_controllers[i]->active = 1; - strncpy(known_controllers[i]->name, discovered_name, MAX_NAME_LENGTH); + strncpy(known_controllers[i]->name, discovered_name, discovered_name_len); known_controllers[i]->name[MAX_NAME_LENGTH] = '\0'; known_controllers[i]->port = discovered_command_port; known_controllers[i]->relay_count = discovered_relay_count; diff --git a/endpoints/api_v1_relays.c b/endpoints/api_v1_relays.c new file mode 100644 index 0000000..7b3e762 --- /dev/null +++ b/endpoints/api_v1_relays.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +#include +#include + +void +api_v1_relays_GET(struct mg_connection *c, endpoint_args_t *args, struct http_message *hm) +{ + (void)args; + (void)hm; + relay_t** all_relays = relay_get_all(); + + cJSON *json = cJSON_CreateArray(); + + for(int i = 0; all_relays[i] != NULL; ++i) + { + cJSON *json_relay = relay_to_json(all_relays[i]); + + cJSON_AddItemToArray(json, json_relay); + } + + char *json_str = cJSON_Print(json); + if (json_str == NULL) + { + LOG_ERROR("failed to print relays json\n"); + mg_send_head(c, 500, 2, "Content-Type: application/json\r\n" STANDARD_HEADERS); + mg_printf(c, "[]"); + } + else + { + mg_send_head(c, 200, strlen(json_str), "Content-Type: application/json\r\n" STANDARD_HEADERS); + mg_printf(c, "%s", json_str); + free(json_str); + } + cJSON_Delete(json); + relay_free_list(all_relays); +} diff --git a/include/endpoints/api_v1_relays.h b/include/endpoints/api_v1_relays.h new file mode 100644 index 0000000..cc1dd7a --- /dev/null +++ b/include/endpoints/api_v1_relays.h @@ -0,0 +1,9 @@ +#ifndef CORE_ENDPOINTS_API_V1_RELAYS_H +#define CORE_ENDPOINTS_API_V1_RELAYS_H + +#include + +void +api_v1_relays_GET(struct mg_connection *c, endpoint_args_t *args, struct http_message *hm); + +#endif /* CORE_ENDPOINTS_API_V1_RELAYS_H */ diff --git a/include/models/controller.h b/include/models/controller.h index 150fdb8..3e9cf81 100644 --- a/include/models/controller.h +++ b/include/models/controller.h @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -12,7 +13,7 @@ typedef struct { int id; uuid_t uid; - char name[128]; + char name[MAX_NAME_LENGTH + 1]; char ip[17]; int active; int port; diff --git a/router.c b/router.c index 996d8d3..0bc1855 100644 --- a/router.c +++ b/router.c @@ -5,6 +5,7 @@ #include #include +#include static const int HTTP_METHOD_GET = (1 << 0); static const int HTTP_METHOD_POST = (1 << 1); @@ -61,6 +62,8 @@ router_init() router_register_endpoint("/api/v1/controllers/discover/", HTTP_METHOD_POST, api_v1_controllers_discover_POST); router_register_endpoint("/api/v1/controllers/", HTTP_METHOD_GET, api_v1_controllers_GET); + + router_register_endpoint("/api/v1/relays/", HTTP_METHOD_GET, api_v1_relays_GET); } void