Exemplo n.º 1
0
char *tr_msg_encode(TR_MSG *msg) 
{
  json_t *jmsg=NULL;
  json_t *jmsg_type=NULL;
  char *encoded=NULL;
  TID_RESP *tidresp=NULL;
  TID_REQ *tidreq=NULL;
  TRP_UPD *trpupd=NULL;
  TRP_REQ *trpreq=NULL;

  /* TBD -- add error handling */
  jmsg = json_object();

  switch (msg->msg_type) 
    {
    case TID_REQUEST:
      jmsg_type = json_string("tid_request");
      json_object_set_new(jmsg, "msg_type", jmsg_type);
      tidreq=tr_msg_get_req(msg);
      json_object_set_new(jmsg, "msg_body", tr_msg_encode_tidreq(tidreq));
      break;

    case TID_RESPONSE:
      jmsg_type = json_string("tid_response");
      json_object_set_new(jmsg, "msg_type", jmsg_type);
      tidresp=tr_msg_get_resp(msg);
      json_object_set_new(jmsg, "msg_body", tr_msg_encode_tidresp(tidresp));
      break;

    case TRP_UPDATE:
      jmsg_type = json_string("trp_update");
      json_object_set_new(jmsg, "msg_type", jmsg_type);
      trpupd=tr_msg_get_trp_upd(msg);
      json_object_set_new(jmsg, "msg_body", tr_msg_encode_trp_upd(trpupd));
      break;

    case TRP_REQUEST:
      jmsg_type = json_string("trp_request");
      json_object_set_new(jmsg, "msg_type", jmsg_type);
      trpreq=tr_msg_get_trp_req(msg);
      json_object_set_new(jmsg, "msg_body", tr_msg_encode_trp_req(trpreq));
      break;

    default:
      json_decref(jmsg);
      return NULL;
    }

  encoded=json_dumps(jmsg, 0);
  json_decref(jmsg);
  return encoded;
}
Exemplo n.º 2
0
void tr_msg_free_decoded(TR_MSG *msg)
{
  if (msg) {
    switch (msg->msg_type) {
    case TID_REQUEST:
      tid_req_free(tr_msg_get_req(msg));
      break;
    case TID_RESPONSE:
      tid_resp_free(tr_msg_get_resp(msg));
      break;
    case TRP_UPDATE:
      trp_upd_free(tr_msg_get_trp_upd(msg));
      break;
    case TRP_REQUEST:
      trp_req_free(tr_msg_get_trp_req(msg));
    default:
      break;
    }
    free (msg);
  }
}
Exemplo n.º 3
0
int tidc_fwd_request(TIDC_INSTANCE *tidc,
                     TID_REQ *tid_req,
		     TIDC_RESP_FUNC *resp_handler,
                     void *cookie)
{
  char *req_buf = NULL;
  char *resp_buf = NULL;
  size_t resp_buflen = 0;
  TR_MSG *msg = NULL;
  TR_MSG *resp_msg = NULL;
  int err;
  int rc = 0;

  /* Create and populate a TID msg structure */
  if (!(msg = talloc_zero(tid_req, TR_MSG)))
    goto error;

  msg->msg_type = TID_REQUEST;
  tr_msg_set_req(msg, tid_req);

  /* store the response function and cookie */
  // tid_req->resp_func = resp_handler;
  // tid_req->cookie = cookie;


  /* Encode the request into a json string */
  if (!(req_buf = tr_msg_encode(msg))) {
    tr_err("tidc_fwd_request: Error encoding TID request.\n");
    goto error;
  }

  tr_debug( "tidc_fwd_request: Sending TID request:\n");
  tr_debug( "%s\n", req_buf);

  /* Send the request over the connection */
  if (err = gsscon_write_encrypted_token (tid_req->conn, tid_req->gssctx, req_buf,
					  strlen(req_buf))) {
    tr_err( "tidc_fwd_request: Error sending request over connection.\n");
    goto error;
  }

  /* TBD -- queue request on instance, read resps in separate thread */

  /* Read the response from the connection */
  /* TBD -- timeout? */
  if (err = gsscon_read_encrypted_token(tid_req->conn, tid_req->gssctx, &resp_buf, &resp_buflen)) {
    if (resp_buf)
      free(resp_buf);
    goto error;
  }

  tr_debug( "tidc_fwd_request: Response Received (%u bytes).\n", (unsigned) resp_buflen);
  tr_debug( "%s\n", resp_buf);

  if (NULL == (resp_msg = tr_msg_decode(resp_buf, resp_buflen))) {
    tr_err( "tidc_fwd_request: Error decoding response.\n");
    goto error;
  }

  /* TBD -- Check if this is actually a valid response */
  if (TID_RESPONSE != tr_msg_get_msg_type(resp_msg)) {
    tr_err( "tidc_fwd_request: Error, no response in the response!\n");
    goto error;
  }

  if (resp_handler) {
    /* Call the caller's response function. It must copy any data it needs before returning. */
    tr_debug("tidc_fwd_request: calling response callback function.");
    (*resp_handler)(tidc, tid_req, tr_msg_get_resp(resp_msg), cookie);
  }

  goto cleanup;

 error:
  rc = -1;
 cleanup:
  if (msg)
    talloc_free(msg);
  if (req_buf)
    free(req_buf);
  if (resp_buf)
    free(resp_buf);
  if (resp_msg)
    tr_msg_free_decoded(resp_msg);
  return rc;
}