static oss_post_object_group_result_t *
construct_post_object_group_response(curl_request_param_t *user_data)
{
	const char *response = user_data->recv_buffer->ptr;
	assert(response != NULL);
	XmlNode *xml, *bucket_tag, *key_tag, *etag_tag, *size_tag;
	unsigned int response_len = strlen(response); 
	xml = xml_load_buffer(response, response_len);

	oss_post_object_group_result_t *result = post_object_group_result_initialize();
	bucket_tag = xml_find(xml, "Bucket");
	result->set_bucket_name(result, *bucket_tag->child->attrib);
	key_tag = xml_find(xml, "Key");
	result->set_key(result, *key_tag->child->attrib);
 	etag_tag = xml_find(xml, "ETag");
	result->set_etag(result, *etag_tag->child->attrib);
	size_tag = xml_find(xml,"Size");
	unsigned int size = (unsigned int)atoi(*size_tag->child->attrib);
	result->set_size(result, size);
 
	oss_free_user_data(user_data);
 	xml_free(xml);

	return result;
	
}
static oss_access_control_list_t *
construct_get_bucket_acl_response(
    curl_request_param_t *user_data)
{
    const char *response = user_data->recv_buffer->ptr;
    assert(response != NULL);
    XmlNode *xml, *grant_tag, *owner_tag;
    unsigned int response_len = strlen(response);
    xml = xml_load_buffer(response, response_len);

    owner_tag = xml_find(xml, "Owner");
    oss_owner_t *owner = owner_initialize_with_id(*owner_tag->child->child->attrib,
                         *owner_tag->child->next->child->attrib);

    grant_tag = xml_find(xml, "Grant");

    oss_access_control_list_t *acl = access_control_list_initialize();
    acl->set_grant(acl, *grant_tag->child->attrib);
    acl->set_owner(acl, owner);

    oss_free_user_data(user_data);
    xml_free(xml);

    return acl;

}
Ejemplo n.º 3
0
Archivo: run.c Proyecto: csesteban/ccan
int main(void)
{
	XmlNode *x, *t;
	/* This is how many tests you plan to run */
	plan_tests(12);

	ok1(x = xml_load("./test/test.xml1"));
	ok1(!xml_find(x, "Doesn't Exist"));
	ok1(t = xml_find(x, "one"));
	ok1(xml_find(t, "two"));
	ok1(!xml_attr(t, "foobar"));
	ok1(!xml_attr(t, "Doesn't Exist"));
	ok1(xml_attr(t, "barfoo"));
	xml_free(x);
	/* Simple thing we expect to succeed */
	ok1(!test_load("does not exist")); /* A file that doesn't exist */
	ok1(test_load("./test/test.xml1")); /* A basic xml file. */
	ok1(test_load("./test/test.xml2")); /* Very small well-formed xml file. */
	ok1(test_load("./test/test.xml3")); /* Smallest well-formed xml file. */
	ok1(test_load("./test/test.xml4")); /* A single unclosed tag. */
	/* Same, with an explicit description of the test. */
//	ok(some_test(), "%s with no args should return 1", "some_test")
	/* How to print out messages for debugging. */
//	diag("Address of some_test is %p", &some_test)
	/* Conditional tests must be explicitly skipped. */

	/* This exits depending on whether all tests passed */
	return exit_status();
}
static oss_get_object_group_index_result_t *
construct_get_object_group_index_response(curl_request_param_t *user_data)
{
	const char *response = user_data->recv_buffer->ptr;
	assert(response != NULL);
	int i;
	XmlNode *xml, *bucket_tag, *key_tag, *etag_tag, *length_tag, *file_part_tag, *part_tag, *part_tmp;
	unsigned int response_len = strlen(response); 
	xml = xml_load_buffer(response, response_len);

	oss_get_object_group_index_result_t *result = get_object_group_index_result_initialize();
	bucket_tag = xml_find(xml, "Bucket");
	result->set_bucket_name(result, *bucket_tag->child->attrib);
	key_tag = xml_find(xml, "Key");
	result->set_key(result, *key_tag->child->attrib);
	etag_tag = xml_find(xml, "ETag");
	result->set_etag(result, *etag_tag->child->attrib);
	length_tag = xml_find(xml, "FileLength");
	unsigned int file_length = (unsigned int)atoi(*length_tag->child->attrib);
	result->set_file_length(result, file_length);
	
	file_part_tag = xml_find(xml, "FilePart");
	if(file_part_tag != NULL) {
		part_tag = file_part_tag->child;
	} else {
		part_tag = NULL;
	}
	if(part_tag != NULL) {
		part_tmp = part_tag;
		for(; part_tmp != NULL; part_tmp = part_tmp->next) {
			(result->part_number)++;
		}
		oss_multipart_object_group_t **group = (oss_multipart_object_group_t **)malloc(sizeof(oss_multipart_object_group_t *) * (result->part_number));
		for(i = 0; part_tag != NULL; i++, part_tag = part_tag->next) {
			group[i] = multipart_object_group_initialize();
			group[i]->set_etag(group[i], *part_tag->child->child->attrib);
			group[i]->set_part_name(group[i], *part_tag->child->next->child->attrib);
			int part_number = atoi(*part_tag->child->next->next->child->attrib);
			group[i]->set_part_number(group[i], part_number);
			unsigned int part_size = (unsigned int)(atoi(*part_tag->child->next->next->next->child->attrib));
			group[i]->set_part_size(group[i], part_size);
		}
		result->group = group;
	}
	
	oss_free_user_data(user_data);
 	xml_free(xml);

	return result;
	
}
Ejemplo n.º 5
0
Archivo: ttxml.c Proyecto: atbrox/ccan
/* very basic function that will get you the first node with a given name */
XmlNode * xml_find(XmlNode *xml, const char *name)
{
	XmlNode * ret;
	if(xml->name)if(!strcmp(xml->name, name))return xml;
	if(xml->child)
	{
		ret = xml_find(xml->child, name);
		if(ret)return ret;
	}
	if(xml->next)
	{
		ret = xml_find(xml->next, name);
		if(ret)return ret;
	}
	return NULL;
}
Ejemplo n.º 6
0
unsigned short
oss_get_retcode_from_response(const char *response)
{
	unsigned short ret;
	assert(response != NULL);
	if (strlen(response) == 0) return NETWORK_NOT_AVAILABLE;
	XmlNode *xml, *code_tag;
	char *retinfo;
	unsigned int response_len = strlen(response); 
	xml = xml_load_buffer(response, response_len);
	if (NULL == xml)
	{
		return OSSCLIB_INTERNAL_ERROR;
	}
	code_tag = xml_find(xml, "Code");
	if (code_tag != NULL) {
		retinfo = *code_tag->child->attrib;
		ret = oss_get_retcode_from_retinfo(retinfo);
	}
	else {
		ret = NGINX_NOT_AVAILABLE;
	}
	
	xml_free(xml);
	return ret;
}
static oss_object_listing_t *
construct_list_objects_response(
    curl_request_param_t *user_data)
{
    assert(user_data != NULL);

    const char *response = user_data->recv_buffer->ptr;
    int i;
    XmlNode *xml = NULL;
    XmlNode *name_tag, *prefix_tag, *marker_tag, *max_keys_tag;
    XmlNode *delimiter_tag, *is_truncated_tag, *next_marker_tag;
    XmlNode *contents_tag, *common_prefixes_tag, *contents_tmp;
    XmlNode *common_prefixes_tmp = NULL;

    unsigned int response_len = strlen(response);
    xml = xml_load_buffer(response, response_len);
    oss_object_listing_t *object_listing = object_listing_initialize();

    name_tag = xml_find(xml, "Name");
    object_listing->set_bucket_name(object_listing, *name_tag->child->attrib);

    prefix_tag = xml_find(xml, "Prefix");
    if(prefix_tag->child == NULL) {
        object_listing->set_prefix(object_listing, "");
    } else {
        object_listing->set_prefix(object_listing, *prefix_tag->child->attrib);
    }

    marker_tag = xml_find(xml, "Marker");
    if(marker_tag->child == NULL) {
        object_listing->set_marker(object_listing, "");
    } else {
        object_listing->set_marker(object_listing, *marker_tag->child->attrib);
    }

    next_marker_tag = xml_find(xml, "NextMarker");
    if(next_marker_tag == NULL) {
        object_listing->set_next_marker(object_listing, "");
    } else {
        if(next_marker_tag->child == NULL) {
            object_listing->set_next_marker(object_listing, "");
        } else {
            object_listing->set_next_marker(object_listing,
                                            *next_marker_tag->child->attrib);
        }
    }

    max_keys_tag = xml_find(xml, "MaxKeys");
    if(max_keys_tag->child == NULL)
    {
        object_listing->set_max_keys(object_listing, 0);
    } else {
        //经过分析, 此处atoi是OK的
        int max_keys = atoi(*max_keys_tag->child->attrib);
        object_listing->set_max_keys(object_listing, max_keys);
    }

    delimiter_tag = xml_find(xml, "Delimiter");
    if(delimiter_tag->child == NULL) {
        object_listing->set_delimiter(object_listing, "");
    } else {
        object_listing->set_delimiter(object_listing, *delimiter_tag->child->attrib);
    }

    is_truncated_tag = xml_find(xml, "IsTruncated");
    if(is_truncated_tag->child == NULL) {
        object_listing->set_is_truncated(object_listing, false);
    } else {
        if(strcmp(*is_truncated_tag->child->attrib, "false") == 0) {
            object_listing->set_is_truncated(object_listing, false);
        } else {
            object_listing->set_is_truncated(object_listing, true);
        }
    }

    contents_tag = xml_find(xml, "Contents");
    if(contents_tag != NULL) {
        contents_tmp = contents_tag;
        for(; contents_tmp != NULL; contents_tmp = contents_tmp->next) {
            if(strcmp(contents_tmp->name, "Contents") == 0)
                (object_listing->_counts_summaries)++;
            else break;
        }
        oss_object_summary_t **summaries = (oss_object_summary_t **)malloc(
                                               sizeof(oss_object_summary_t *) * (object_listing->_counts_summaries));

        for(i = 0; i < object_listing->_counts_summaries; i++, contents_tag = contents_tag->next) {
            summaries[i] = object_summary_initialize();
            summaries[i]->set_key(summaries[i],
                                  *contents_tag->child->child->attrib);
            summaries[i]->set_last_modified(summaries[i],
                                            *contents_tag->child->next->child->attrib);
            summaries[i]->set_etag(summaries[i],
                                   *contents_tag->child->next->next->child->attrib);
            summaries[i]->set_type(summaries[i],
                                   *contents_tag->child->next->next->next->child->attrib);
            long size = atol(*contents_tag->child->next->next->next->next->child->attrib);
            summaries[i]->set_size(summaries[i], size);
            summaries[i]->set_storage_class(summaries[i],
                                            *contents_tag->child->next->next->next->next->next->child->attrib);
            summaries[i]->owner = owner_initialize_with_id(
                                      *contents_tag->child->next->next->next->next->next->next->child->child->attrib,
                                      *contents_tag->child->next->next->next->next->next->next->child->next->child->attrib);
        }
        object_listing->summaries = summaries;
    }

    common_prefixes_tag = xml_find(xml, "CommonPrefixes");
    if(common_prefixes_tag != NULL) {
        common_prefixes_tmp = common_prefixes_tag;
        for(; common_prefixes_tmp != NULL;
                common_prefixes_tmp = common_prefixes_tmp->next) {
            (object_listing->_counts_common_prefixes)++;
        }
        char **common_prefixes = (char **)malloc(
                                     sizeof(char *) * (object_listing->_counts_common_prefixes));
        for(i = 0; common_prefixes_tag != NULL;
                i++, common_prefixes_tag = common_prefixes_tag->next) {
            const char *tmp = *common_prefixes_tag->child->child->attrib;
            unsigned int common_prefixes_len = strlen(tmp);
            common_prefixes[i] = (char *)malloc(
                                     sizeof(char) * (common_prefixes_len + 1));
            strncpy(common_prefixes[i], tmp, common_prefixes_len);
            common_prefixes[i][common_prefixes_len] = '\0';
        }
        object_listing->common_prefixes = common_prefixes;
    }

    oss_free_user_data(user_data);
    xml_free(xml);

    return object_listing;

}
Ejemplo n.º 8
0
/*! Copy one configuration object to antother
 *
 * Works for objects that are items ina yang list with a keyname, eg as:
 *   list sender{ 
 *      key name;	
 *	leaf name{...
 *
 * @param[in]  h    CLICON handle
 * @param[in]  cvv  Vector of variables from CLIgen command-line
 * @param[in]  argv Vector: <db>, <xpath>, <field>, <fromvar>, <tovar>
 * Explanation of argv fields:
 *  db:     Database name, eg candidate|tmp|startup
 *  xpath:  XPATH expression with exactly two %s pointing to field and from name
 *  field:  Name of list key, eg name
 *  fromvar:Name of variable containing name of object to copy from (given by xpath)
 *  tovar:  Name of variable containing name of object to copy to.
 * @code
 * cli spec:
 *  copy snd <n1:string> to <n2:string>, cli_copy_config("candidate", "/sender[%s='%s']", "from", "n1", "n2");
 * cli command:
 *  copy snd from to to
 * @endcode
 */
int
cli_copy_config(clicon_handle h, 
		cvec         *cvv, 
		cvec         *argv)
{
    int          retval = -1;
    char        *db;
    cxobj       *x1 = NULL; 
    cxobj       *x2 = NULL; 
    cxobj       *x;
    char        *xpath;
    int          i;
    int          j;
    cbuf        *cb = NULL;
    char        *keyname;
    char        *fromvar;
    cg_var      *fromcv;
    char        *fromname = NULL;
    char        *tovar;
    cg_var      *tocv;
    char        *toname;
    cxobj       *xerr;

    if (cvec_len(argv) != 5){
	clicon_err(OE_PLUGIN, 0, "Requires four elements: <db> <xpath> <keyname> <from> <to>");
	goto done;
    }
    /* First argv argument: Database */
    db = cv_string_get(cvec_i(argv, 0));
    /* Second argv argument: xpath */
    xpath = cv_string_get(cvec_i(argv, 1));
    /* Third argv argument: name of keyname */
    keyname = cv_string_get(cvec_i(argv, 2));
    /* Fourth argv argument: from variable */
    fromvar = cv_string_get(cvec_i(argv, 3));
    /* Fifth argv argument: to variable */
    tovar = cv_string_get(cvec_i(argv, 4));
    
    /* Get from variable -> cv -> from name */
    if ((fromcv = cvec_find(cvv, fromvar)) == NULL){
	clicon_err(OE_PLUGIN, 0, "fromvar '%s' not found in cligen var list", fromvar);	
	goto done;
    }
    /* Get from name from cv */
    fromname = cv_string_get(fromcv);
    /* Create xpath */
    if ((cb = cbuf_new()) == NULL){
	clicon_err(OE_PLUGIN, errno, "cbuf_new");	
	goto done;
    }
    /* Sanity check that xpath contains exactly two %s, ie [%s='%s'] */
    j = 0;
    for (i=0; i<strlen(xpath); i++){
	if (xpath[i] == '%')
	    j++;
    }
    if (j != 2){
	clicon_err(OE_PLUGIN, 0, "xpath '%s' does not have two '%%'", xpath);	
	goto done;
    }
    cprintf(cb, xpath, keyname, fromname);	
    /* Get from object configuration and store in x1 */
    if (clicon_rpc_get_config(h, db, cbuf_get(cb), &x1) < 0)
	goto done;
    if ((xerr = xpath_first(x1, "/rpc-error")) != NULL){
	clicon_rpc_generate_error("Get configuration", xerr);
	goto done;
    }

    /* Get to variable -> cv -> to name */
    if ((tocv = cvec_find(cvv, tovar)) == NULL){
	clicon_err(OE_PLUGIN, 0, "tovar '%s' not found in cligen var list", tovar);
	goto done;
    }
    toname = cv_string_get(tocv);
    /* Create copy xml tree x2 */
    if ((x2 = xml_new("new", NULL, NULL)) == NULL)
	goto done;
    if (xml_copy(x1, x2) < 0)
	goto done;
    xml_name_set(x2, "config");
    cprintf(cb, "/%s", keyname);	
    if ((x = xpath_first(x2, "%s", cbuf_get(cb))) == NULL){
	clicon_err(OE_PLUGIN, 0, "Field %s not found in copy tree", keyname);
	goto done;
    }
    x = xml_find(x, "body");
    xml_value_set(x, toname);
    /* resuse cb */
    cbuf_reset(cb);
    /* create xml copy tree and merge it with database configuration */
    clicon_xml2cbuf(cb, x2, 0, 0);
    if (clicon_rpc_edit_config(h, db, OP_MERGE, cbuf_get(cb)) < 0)
	goto done;
    retval = 0;
 done:
    if (cb)
	cbuf_free(cb);
    if (x1 != NULL)
	xml_free(x1);
    if (x2 != NULL)
	xml_free(x2);
    return retval;
}