|
@@ -20,15 +20,35 @@ page(struct http_request *req)
|
|
|
return (KORE_RESULT_OK);
|
|
|
}
|
|
|
|
|
|
+static char * read_body(struct http_request *req) {
|
|
|
+ int ret;
|
|
|
+ struct kore_buf * buf;
|
|
|
+ u_int8_t data[128];
|
|
|
+ char * body;
|
|
|
+ buf = kore_buf_alloc(128);
|
|
|
+ while(1) {
|
|
|
+ ret = http_body_read(req, data, sizeof(data));
|
|
|
+ if (ret == -1) {
|
|
|
+ kore_buf_free(buf);
|
|
|
+ return NULL;
|
|
|
+ } else if (ret == 0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ kore_buf_append(buf,data,ret);
|
|
|
+ }
|
|
|
+ body = kore_buf_stringify(buf, NULL);
|
|
|
+ kore_buf_free(buf);
|
|
|
+ return body;
|
|
|
+}
|
|
|
+
|
|
|
int handle_time(struct http_request *req) {
|
|
|
int fdesc;
|
|
|
struct rtc_time time;
|
|
|
int ret;
|
|
|
- char *msg;
|
|
|
+ char *result_string;
|
|
|
cJSON *time_json, *json_min, *json_hour, *json_mday,
|
|
|
*json_mon, *json_year, *json_sec, *json_wday;
|
|
|
if(req->method == HTTP_METHOD_GET) {
|
|
|
- char *result_string;
|
|
|
time_json = cJSON_CreateObject();
|
|
|
fdesc = open("/dev/rtc", O_RDONLY);
|
|
|
ret = ioctl(fdesc, RTC_RD_TIME, &time);
|
|
@@ -55,33 +75,21 @@ int handle_time(struct http_request *req) {
|
|
|
return KORE_RESULT_OK;
|
|
|
}
|
|
|
cJSON_Delete(time_json);
|
|
|
- msg = "Error: could not get time from /dev/rtc\n";
|
|
|
- http_response(req, 500, msg, strlen(msg));
|
|
|
+ result_string = "Error: could not get time from /dev/rtc\n";
|
|
|
+ http_response(req, 500, result_string, strlen(result_string));
|
|
|
return KORE_RESULT_OK;
|
|
|
} else if (req->method == HTTP_METHOD_POST) {
|
|
|
- struct kore_buf * buf;
|
|
|
- u_int8_t data[128];
|
|
|
char * body;
|
|
|
- buf = kore_buf_alloc(128);
|
|
|
- while(1) {
|
|
|
- ret = http_body_read(req, data, sizeof(data));
|
|
|
- if (ret == -1) {
|
|
|
- kore_buf_free(buf);
|
|
|
- msg = "Error: could not read body data\n";
|
|
|
- http_response(req, 500, msg, strlen(msg));
|
|
|
- return (KORE_RESULT_OK);
|
|
|
- }
|
|
|
- if (ret == 0) {
|
|
|
- break;
|
|
|
- }
|
|
|
- kore_buf_append(buf,data,ret);
|
|
|
+ body = read_body(req);
|
|
|
+ if (body == NULL) {
|
|
|
+ result_string = "Error: could not read request body\n";
|
|
|
+ http_response(req, 500, result_string, strlen(result_string));
|
|
|
+ return (KORE_RESULT_OK);
|
|
|
}
|
|
|
- body = kore_buf_stringify(buf, NULL);
|
|
|
- kore_buf_free(buf);
|
|
|
time_json = cJSON_Parse(body);
|
|
|
if (time_json == NULL) {
|
|
|
- msg = "Error: could not parse json\n";
|
|
|
- http_response(req, 500, msg, strlen(msg));
|
|
|
+ result_string = "Error: could not parse json\n";
|
|
|
+ http_response(req, 500, result_string, strlen(result_string));
|
|
|
return (KORE_RESULT_OK);
|
|
|
}
|
|
|
json_sec = cJSON_GetObjectItemCaseSensitive(time_json, "seconds");
|
|
@@ -103,8 +111,8 @@ int handle_time(struct http_request *req) {
|
|
|
time.tm_wday = json_wday->valueint;
|
|
|
} else {
|
|
|
cJSON_Delete(time_json);
|
|
|
- msg = "Error: invalid or missing values in json object\n";
|
|
|
- http_response(req, 500, msg, strlen(msg));
|
|
|
+ result_string = "Error: invalid or missing values in json object\n";
|
|
|
+ http_response(req, 500, result_string, strlen(result_string));
|
|
|
return (KORE_RESULT_OK);
|
|
|
}
|
|
|
cJSON_Delete(time_json);
|
|
@@ -112,8 +120,8 @@ int handle_time(struct http_request *req) {
|
|
|
ret = ioctl(fdesc, RTC_SET_TIME, &time);
|
|
|
close(fdesc);
|
|
|
if (ret) {
|
|
|
- msg = "Error: Could not set time via /dev/rtc\n";
|
|
|
- http_response(req, 500, msg, strlen(msg));
|
|
|
+ result_string = "Error: Could not set time via /dev/rtc\n";
|
|
|
+ http_response(req, 500, result_string, strlen(result_string));
|
|
|
return (KORE_RESULT_OK);
|
|
|
}
|
|
|
http_response(req, 200, NULL, 0);
|
|
@@ -165,6 +173,56 @@ int handle_wkalrm(struct http_request *req) {
|
|
|
result_string = "Error: could not get alarm from /dev/rtc\n";
|
|
|
http_response(req, 500, result_string, strlen(result_string));
|
|
|
return KORE_RESULT_OK;
|
|
|
+ } else if (req->method == HTTP_METHOD_POST) {
|
|
|
+ char * body = read_body(req);
|
|
|
+ if (body == NULL) {
|
|
|
+ result_string = "Error: could not read request body\n";
|
|
|
+ http_response(req, 500, result_string, strlen(result_string));
|
|
|
+ return (KORE_RESULT_OK);
|
|
|
+ }
|
|
|
+ alarm_json = cJSON_Parse(body);
|
|
|
+ if (alarm_json == NULL) {
|
|
|
+ result_string = "Error: could not parse json\n";
|
|
|
+ http_response(req, 500, result_string, strlen(result_string));
|
|
|
+ return (KORE_RESULT_OK);
|
|
|
+ }
|
|
|
+ json_sec = cJSON_GetObjectItemCaseSensitive(alarm_json, "seconds");
|
|
|
+ json_min = cJSON_GetObjectItemCaseSensitive(alarm_json, "minutes");
|
|
|
+ json_hour = cJSON_GetObjectItemCaseSensitive(alarm_json, "hour");
|
|
|
+ json_mday = cJSON_GetObjectItemCaseSensitive(alarm_json, "mday");
|
|
|
+ json_mon = cJSON_GetObjectItemCaseSensitive(alarm_json, "month");
|
|
|
+ json_year = cJSON_GetObjectItemCaseSensitive(alarm_json, "year");
|
|
|
+ json_wday = cJSON_GetObjectItemCaseSensitive(alarm_json, "wday");
|
|
|
+ json_enabled = cJSON_GetObjectItemCaseSensitive(alarm_json, "enabled");
|
|
|
+ if (cJSON_IsNumber(json_sec) && cJSON_IsNumber(json_min) && cJSON_IsNumber(json_hour) &&
|
|
|
+ cJSON_IsNumber(json_mday) && cJSON_IsNumber(json_mon) &&
|
|
|
+ cJSON_IsNumber(json_year) && cJSON_IsNumber(json_wday) &&
|
|
|
+ cJSON_IsNumber(json_enabled)) {
|
|
|
+ alarm.time.tm_sec = json_sec->valueint;
|
|
|
+ alarm.time.tm_min = json_min->valueint;
|
|
|
+ alarm.time.tm_hour = json_hour->valueint;
|
|
|
+ alarm.time.tm_mday = json_mday->valueint;
|
|
|
+ alarm.time.tm_mon = json_mon->valueint;
|
|
|
+ alarm.time.tm_year = json_year->valueint;
|
|
|
+ alarm.time.tm_wday = json_wday->valueint;
|
|
|
+ alarm.enabled = json_enabled->valueint;
|
|
|
+ } else {
|
|
|
+ cJSON_Delete(alarm_json);
|
|
|
+ result_string = "Error: invalid or missing values in json object\n";
|
|
|
+ http_response(req, 500, result_string, strlen(result_string));
|
|
|
+ return (KORE_RESULT_OK);
|
|
|
+ }
|
|
|
+ cJSON_Delete(alarm_json);
|
|
|
+ fdesc = open("/dev/rtc", O_WRONLY);
|
|
|
+ ret = ioctl(fdesc, RTC_WKALM_SET, &alarm);
|
|
|
+ close(fdesc);
|
|
|
+ if (ret) {
|
|
|
+ result_string = "Error: Could not set alarm via /dev/rtc\n";
|
|
|
+ http_response(req, 500, result_string, strlen(result_string));
|
|
|
+ return (KORE_RESULT_OK);
|
|
|
+ }
|
|
|
+ http_response(req, 200, NULL, 0);
|
|
|
+ return KORE_RESULT_OK;
|
|
|
} else {
|
|
|
http_response(req, HTTP_STATUS_METHOD_NOT_ALLOWED, NULL, 0);
|
|
|
return (KORE_RESULT_OK);
|