コード例 #1
0
ファイル: chef_certgen.c プロジェクト: chef/chef_certgen
static int x509_parse_issuer_cert(ErlNifEnv* env, ERL_NIF_TERM issuer_cert_tuple, char **issuer_cert_pem)
{
  char *issuer_cert_atom_string = NULL;
  char *issuer_cert_pem_string = NULL;
  int num_issuer_terms;
  const ERL_NIF_TERM *issuer_terms;

  *issuer_cert_pem = NULL;

  if(NULL == issuer_cert_pem || !enif_get_tuple(env, issuer_cert_tuple, &num_issuer_terms, &issuer_terms)) return 0;
  if(!atom_to_string(env, issuer_terms[0], &issuer_cert_atom_string) || strncmp(issuer_cert_atom_string, ISSUER_CERT_STR, issuer_cert_strlen)) {
    if(NULL != issuer_cert_atom_string) free(issuer_cert_atom_string);
    return 0;
  }
  free(issuer_cert_atom_string);
  if(!binary_to_string(env, issuer_terms[1], &issuer_cert_pem_string)) return 0;
  
  *issuer_cert_pem = issuer_cert_pem_string;
  return 1;
}
コード例 #2
0
ファイル: kvp_frame.cpp プロジェクト: fugitive68/gnucash
gchar*
kvp_value_to_string(const KvpValue *val)
{
    gchar *tmp1;
    gchar *tmp2;
    const gchar *ctmp;

    g_return_val_if_fail(val, NULL);

    switch (kvp_value_get_type(val))
    {
    case KVP_TYPE_GINT64:
        return g_strdup_printf("KVP_VALUE_GINT64(%" G_GINT64_FORMAT ")",
                               kvp_value_get_gint64(val));
        break;

    case KVP_TYPE_DOUBLE:
        return g_strdup_printf("KVP_VALUE_DOUBLE(%g)",
                               kvp_value_get_double(val));
        break;

    case KVP_TYPE_NUMERIC:
        tmp1 = gnc_numeric_to_string(kvp_value_get_numeric(val));
        tmp2 = g_strdup_printf("KVP_VALUE_NUMERIC(%s)", tmp1 ? tmp1 : "");
        g_free(tmp1);
        return tmp2;
        break;

    case KVP_TYPE_STRING:
        tmp1 = kvp_value_get_string (val);
        return g_strdup_printf("KVP_VALUE_STRING(%s)", tmp1 ? tmp1 : "");
        break;

    case KVP_TYPE_GUID:
        gchar guidstr[GUID_ENCODING_LENGTH+1];
        guid_to_string_buff(kvp_value_get_guid(val),guidstr);
        tmp2 = g_strdup_printf("KVP_VALUE_GUID(%s)", guidstr);
        return tmp2;
        break;

    case KVP_TYPE_TIMESPEC:
        tmp1 = g_new0 (char, 40);
        gnc_timespec_to_iso8601_buff (kvp_value_get_timespec (val), tmp1);
        tmp2 = g_strdup_printf("KVP_VALUE_TIMESPEC(%s)", tmp1);
        g_free(tmp1);
        return tmp2;
        break;

    case KVP_TYPE_BINARY:
    {
        guint64 len;
        void *data;
        data = kvp_value_get_binary(val, &len);
        tmp1 = binary_to_string(data, len);
        return g_strdup_printf("KVP_VALUE_BINARY(%s)", tmp1 ? tmp1 : "");
    }
    break;

    case KVP_TYPE_GLIST:
        tmp1 = kvp_value_glist_to_string(kvp_value_get_glist(val));
        tmp2 = g_strdup_printf("KVP_VALUE_GLIST(%s)", tmp1 ? tmp1 : "");
        g_free(tmp1);
        return tmp2;
        break;

    case KVP_TYPE_FRAME:
        tmp1 = kvp_frame_to_string(kvp_value_get_frame(val));
        tmp2 = g_strdup_printf("KVP_VALUE_FRAME(%s)", tmp1 ? tmp1 : "");
        g_free(tmp1);
        return tmp2;
        break;

    case KVP_TYPE_GDATE:
        return g_strdup_printf("KVP_VALUE_GDATE(%04d-%02d-%02d)",
                               g_date_get_year(&val->value.gdate),
                               g_date_get_month(&val->value.gdate),
                               g_date_get_day(&val->value.gdate));
    default:
	break;
    }
    g_assert(FALSE); /* must not be reached */
    return g_strdup("");
}
コード例 #3
0
ファイル: chef_certgen.c プロジェクト: chef/chef_certgen
static int x509_parse_keypair(ErlNifEnv* env, const char* keypair_name, ERL_NIF_TERM key_tuple, char *keys[2]){
  /* key_tuple :=  {keypair_name, {keypair , [{public_key, <<...>>}, {private_key, <<..>>}]}} */
  unsigned atom_len = -1;
  int num_named_key_terms = -1;
  int num_keypair_terms = -1;
  int num_public_key_terms = -1;
  int num_private_key_terms = -1;
  const ERL_NIF_TERM *named_key_terms = NULL;
  const ERL_NIF_TERM *keypair_terms = NULL;
  const ERL_NIF_TERM *public_key_terms = NULL;
  const ERL_NIF_TERM *private_key_terms = NULL;
  char *keyname = NULL;
  char *keypair = NULL;
  char *private_key_str, *public_key_str;
  ERL_NIF_TERM head,tail;

  if ( NULL == keys || 
       NULL == keypair_name){
    return 0;
  }

  /* get the name of the key, which is given as an atom */
  if(!enif_get_tuple(env, key_tuple, &num_named_key_terms, &named_key_terms) || 
     !atom_to_string(env, named_key_terms[0], &keyname)){
    if(NULL != keyname) free(keyname);
    return 0;
  }

  if(strncmp(keyname, keypair_name, atom_len)){
    free(keyname);
    return 0;
  }

  /* get the tagged tuple representing the keypair */
  if(!enif_get_tuple(env, named_key_terms[1], &num_keypair_terms, &keypair_terms)) return 0;
  /* get the atom 'keypair' and validate */
  if(num_keypair_terms < 2) return 0;

  if(!atom_to_string(env, keypair_terms[0], &keypair) || strncmp(keypair, KEYPAIR_STR, atom_len)){
    if(keypair) free(keypair);
    return 0;
  }

  /* keypair itself is a list of tuples, one member is the public key, the other is the private key */
  enif_get_list_cell(env, keypair_terms[1], &head, &tail);
  enif_get_tuple(env, head, &num_public_key_terms, &public_key_terms);

  /* get the public key binary */
  if(!atom_to_string(env, public_key_terms[0], &keyname) ||
     strncmp(keyname, PUBLIC_KEY_STR, atom_len)){
    if(NULL != keyname) free(keyname);
    return 0;
  }
  free(keyname);
  keyname = NULL;

  if(!binary_to_string(env, public_key_terms[1], &public_key_str)) return 0;

  enif_get_list_cell(env, tail, &head, &tail);
  enif_get_tuple(env, head, &num_private_key_terms, &private_key_terms);

  /* get the private key binary */
  if(!atom_to_string(env, private_key_terms[0], &keyname) ||
     strncmp(keyname, PRIVATE_KEY_STR, atom_len)){
    if(NULL != keyname) free(keyname);
    return 0;
  }
  free(keyname);

  if(!binary_to_string(env, private_key_terms[1], &private_key_str)) return 0;

  keys[0] = public_key_str;
  keys[1] = private_key_str;
  return 1;
}
コード例 #4
0
static void
add_kvp_value_node(xmlNodePtr node, gchar *tag, kvp_value* val)
{
    xmlNodePtr val_node;
    gchar *tmp_str1;
    kvp_value_t kvp_type;

    kvp_type = kvp_value_get_type(val);

    if (kvp_type == KVP_TYPE_STRING)
        val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, BAD_CAST kvp_value_get_string(val));
    else if (kvp_type == KVP_TYPE_TIMESPEC)
        val_node = NULL;
    else if (kvp_type == KVP_TYPE_GDATE)
    {
        GDate d = kvp_value_get_gdate(val);
        val_node = gdate_to_dom_tree(tag, &d);
        xmlAddChild (node, val_node);
    }
    else
        val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, NULL);

    switch (kvp_value_get_type(val))
    {
    case KVP_TYPE_GINT64:
        add_text_to_node(val_node, "integer",
                         g_strdup_printf("%" G_GINT64_FORMAT,
                                         kvp_value_get_gint64(val)));
        break;
    case KVP_TYPE_DOUBLE:
        add_text_to_node(val_node, "double",
                         double_to_string(kvp_value_get_double(val)));
        break;
    case KVP_TYPE_NUMERIC:
        add_text_to_node(val_node, "numeric",
                         gnc_numeric_to_string(kvp_value_get_numeric(val)));
        break;
    case KVP_TYPE_STRING:
        xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "string");
        break;
    case KVP_TYPE_GUID:
        /* THREAD-UNSAFE */
        add_text_to_node(val_node, "guid",
                         g_strdup(guid_to_string(kvp_value_get_guid(val))));
        break;
    case KVP_TYPE_TIMESPEC:
    {
        Timespec ts = kvp_value_get_timespec (val);

        val_node = timespec_to_dom_tree (tag, &ts);
        xmlSetProp (val_node, BAD_CAST "type", BAD_CAST "timespec");
        xmlAddChild (node, val_node);
    }
    break;
    case KVP_TYPE_GDATE:
        xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "gdate");
        break;
    case KVP_TYPE_BINARY:
    {
        guint64 size;
        void *binary_data = kvp_value_get_binary(val, &size);
        xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "binary");
        g_return_if_fail(binary_data);
        tmp_str1 = binary_to_string(binary_data, size);
        xmlNodeSetContent(val_node, BAD_CAST tmp_str1);
        g_free(tmp_str1);
    }
    break;
    case KVP_TYPE_GLIST:
    {
        GList *cursor;

        xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "list");
        for (cursor = kvp_value_get_glist(val); cursor; cursor = cursor->next)
        {
            kvp_value *val = (kvp_value*)cursor->data;
            add_kvp_value_node(val_node, "slot:value", val);
        }
    }

    break;
    case KVP_TYPE_FRAME:
    {
        kvp_frame *frame;

        xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "frame");

        frame = kvp_value_get_frame (val);
        if (!frame || !kvp_frame_get_hash (frame))
            break;

        g_hash_table_foreach_sorted(kvp_frame_get_hash(frame),
                                    add_kvp_slot, val_node, (GCompareFunc)strcmp);
    }
    break;

    }
}