Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}
Пример #8
0
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;
}