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; }
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; }
/* 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; }
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; }
/*! 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; }