static rc_ReturnCode_t send_reg_payload(const char *payload, size_t payloadLen, int *regId) { rc_ReturnCode_t res; char *rpayload = NULL, *respPayload = NULL; uint32_t respPayloadLen; yajl_val yval = NULL; res = emp_send_and_wait_response(EMP_REGISTERSMSLISTENER, 0, payload, payloadLen, &respPayload, &respPayloadLen); if (res != RC_OK) goto quit; rpayload = strndup(respPayload, respPayloadLen); if (rpayload == NULL) { res = RC_NO_MEMORY; goto quit; } YAJL_TREE_PARSE(yval, rpayload); if (yval->type != yajl_t_number) { SWI_LOG("SMS", ERROR, "Invalid regId type received from RA, got type=%u, expected %u\n", __FUNCTION__, yval->type, yajl_t_number); res = RC_BAD_PARAMETER; goto quit; } *regId = YAJL_GET_INTEGER(yval); quit: yajl_tree_free(yval); free(respPayload); free(rpayload); return res; }
static swi_status_t emp_trigger_response_timeout() { swi_status_t res; res = emp_send_and_wait_response(EMP_TRIGGER_TIMEOUT, 0, NULL, 0, NULL, NULL); if (res != SWI_STATUS_IPC_TIMEOUT) return res; return SWI_STATUS_OK; }
rc_ReturnCode_t swi_sms_Unregister(swi_sms_regId_t regId) { rc_ReturnCode_t res; char *payload, *respPayload; size_t payloadLen; uint32_t respPayloadLen; cb_list_t *entry, *tmp; yajl_gen gen; for (entry = cb_list; entry; entry = entry->next) if (entry == regId) break; if (entry == NULL) return RC_BAD_PARAMETER; YAJL_GEN_ALLOC(gen); YAJL_GEN_INTEGER(entry->regId, "regId"); YAJL_GEN_GET_BUF(payload, payloadLen); res = emp_send_and_wait_response(EMP_UNREGISTERSMSLISTENER, 0, payload, payloadLen, &respPayload, &respPayloadLen); yajl_gen_clear(gen); yajl_gen_free(gen); if (res != RC_OK) { SWI_LOG("SMS", ERROR, "Error while unregister sms, res=%d\n", res); SWI_LOG("SMS", ERROR, "got error msg=%s\n", respPayload); goto quit; } pthread_mutex_lock(&handler_lock); if (cb_list == regId) { free(cb_list); cb_list = NULL; } else { for (entry = cb_list; entry; entry = entry->next) { if (entry->next == regId) { break; } } tmp = entry->next; entry->next = tmp->next; free(tmp->payload); free(tmp); } pthread_mutex_unlock(&handler_lock); quit: free(respPayload); return res; }
static swi_status_t emp_reconnecting() { // Asking EMP testing server to simulate a crash, in this way EMP // can handles reconnecting emp_send_and_wait_response(EMP_IPC_BROKEN, 0, NULL, 0, NULL, NULL); while (reconnected == 0) usleep(1000 * 5); // 5ms return SWI_STATUS_OK; }
static swi_status_t emp_fail_reconnecting() { swi_status_t res; do { res = emp_send_and_wait_response(EMP_SIMULATE_CRASH, 0, NULL, 0, NULL, NULL); } while (res != SWI_STATUS_SERVER_UNREACHABLE); return SWI_STATUS_OK; }
rc_ReturnCode_t swi_sms_Send(const char *recipientPtr, const char* messagePtr, swi_sms_Format_t format) { rc_ReturnCode_t res; char *payload, *respPayload; const char *smsFormat = ""; size_t payloadLen; uint32_t respPayloadLen; yajl_gen gen; if (recipientPtr == NULL || messagePtr == NULL || format < SWI_SMS_7BITS || format > SWI_SMS_UCS2) return RC_BAD_PARAMETER; switch(format) { case SWI_SMS_7BITS: smsFormat = "7bits"; break; case SWI_SMS_8BITS: smsFormat = "8bits"; break; case SWI_SMS_UCS2: smsFormat = "ucs2"; break; default: break; } YAJL_GEN_ALLOC(gen); yajl_gen_array_open(gen); YAJL_GEN_STRING(recipientPtr, "recipientPtr"); YAJL_GEN_STRING(messagePtr, "messagePtr"); YAJL_GEN_STRING(smsFormat, "smsFormat"); yajl_gen_array_close(gen); YAJL_GEN_GET_BUF(payload, payloadLen); res = emp_send_and_wait_response(EMP_SENDSMS, 0, payload, payloadLen, &respPayload, &respPayloadLen); yajl_gen_clear(gen); yajl_gen_free(gen); if (res != RC_OK) { SWI_LOG("SMS", ERROR, "error while sending sms, res=%d\n", res); SWI_LOG("SMS", ERROR, "got error msg=%s\n", respPayload); } free(respPayload); return res; }
swi_status_t swi_sys_Reboot(const char* reasonPtr) { char *payload = NULL; size_t payloadLen = 0; swi_status_t res; yajl_gen gen; YAJL_GEN_ALLOC(gen); if (reasonPtr == NULL) goto emp_send; YAJL_GEN_STRING(reasonPtr, "reasonPtr"); YAJL_GEN_GET_BUF(payload, payloadLen); emp_send: res = emp_send_and_wait_response(EMP_REBOOT, 0, payload, payloadLen, NULL, NULL); yajl_gen_clear(gen); yajl_gen_free(gen); return res; }
static void * send_cmd(void *arg) { uintptr_t id = (uintptr_t)arg, i = 0, fd = -1; swi_status_t res; uint8_t rbufferLen; size_t payloadLen = 0; uint32_t respPayloadLen = 0; char *payload = NULL, *rbuffer = NULL, *respPayload = NULL; yajl_gen gen; ssize_t ret; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); // Allocating payload with a random size modulo 256 fd = open("/dev/urandom", O_RDONLY); ret = read(fd, &rbufferLen, sizeof(rbufferLen)); if (ret != sizeof(rbufferLen)) { SWI_LOG("EMP_TEST", ERROR, "EMP sender thread #%" PRIuPTR " failed: unable to get random payload size\n", id); return NULL; } if (rbufferLen == 0) rbufferLen++; rbuffer = malloc(rbufferLen); // Generating random payload with displayable characters for (i = 0; i < rbufferLen; i++) { ret = read(fd, rbuffer + i, sizeof(rbuffer[i])); if (ret != sizeof(rbuffer[i])) { SWI_LOG("EMP_TEST", ERROR, "EMP sender thread #%" PRIuPTR " failed: unable to generate random payload\n", id); return NULL; } rbuffer[i] = rbuffer[i] % 127; if (rbuffer[i] < (char)0x33) rbuffer[i] = (char)0x33; } close(fd); gen = yajl_gen_alloc(NULL); yajl_gen_string(gen, (const unsigned char *)rbuffer, rbufferLen); yajl_gen_get_buf(gen, (const unsigned char **)&payload, &payloadLen); while (true) { res = emp_send_and_wait_response(EMP_SEND_CMD, 0, payload, payloadLen, &respPayload, &respPayloadLen); if (res != SWI_STATUS_OK && res != SWI_STATUS_IPC_BROKEN) { SWI_LOG("EMP_TEST", ERROR, "EMP sender thread #%" PRIuPTR " failed: unexpected status code %d\n", id, res); exit(1); } if (payloadLen != respPayloadLen || strncmp(payload, respPayload, payloadLen) != 0) { SWI_LOG("EMP_TEST", ERROR, "EMP sender thread #%" PRIuPTR " failed: payload mismatched\n" "payload = %.*s, payloadLen = %u, respPayload = %.*s, respPayloadLen = %u\n" , id, payloadLen, payload, payloadLen, respPayloadLen, respPayload, respPayloadLen); exit(1); } } yajl_gen_clear(gen); yajl_gen_free(gen); free(rbuffer); return NULL; }