int xml_script_reader_parse(script_t *script) { assert(_p_xml_reader); /* init list of playlets */ int idx = 0; text_t *cur_text = NULL; ptrlist_init(&(script->texts)); int ret; int element_type = XML_READER_TYPE_NONE; unsigned char *element_name = '\0'; ret = xmlTextReaderRead(_p_xml_reader); while (ret == 1) { element_type = xmlTextReaderNodeType(_p_xml_reader); if (XML_READER_TYPE_ELEMENT == element_type) { element_name = xmlTextReaderLocalName(_p_xml_reader); if(!strcmp(XML_POINTER_ELE, (const char *) element_name)) { /* starting new text */ cur_text = text_init(); /* setting pointer index value. */ cur_text->pointer_idx = idx++; /* setting cpu address value. */ readPointerAddressAttr(&(cur_text->cpu_address)); } xmlFree(element_name); } else if (XML_READER_TYPE_END_ELEMENT == element_type) { element_name = xmlTextReaderLocalName(_p_xml_reader); if(!strcmp(XML_POINTER_ELE, (const char *) element_name)) { /* end of text*/ if(NULL != cur_text) ptrlist_add(&(script->texts), cur_text); cur_text = NULL; } xmlFree(element_name); } else if (XML_READER_TYPE_CDATA == element_type && NULL != cur_text) { readPointerCData(&(cur_text->u8srt)); } ret = xmlTextReaderRead(_p_xml_reader); } return 0; }
static int axfr_query_init(struct query_data *qdata) { assert(qdata); /* Check AXFR query validity. */ int state = axfr_query_check(qdata); if (state == KNOT_NS_PROC_FAIL) { if (qdata->rcode == KNOT_RCODE_FORMERR) { return KNOT_EMALF; } else { return KNOT_EDENIED; } } /* Create transfer processing context. */ mm_ctx_t *mm = qdata->mm; zone_contents_t *zone = qdata->zone->contents; struct axfr_proc *axfr = mm_alloc(mm, sizeof(struct axfr_proc)); if (axfr == NULL) { return KNOT_ENOMEM; } memset(axfr, 0, sizeof(struct axfr_proc)); init_list(&axfr->proc.nodes); /* Put data to process. */ gettimeofday(&axfr->proc.tstamp, NULL); ptrlist_add(&axfr->proc.nodes, zone->nodes, mm); /* Put NSEC3 data if exists. */ if (!zone_tree_is_empty(zone->nsec3_nodes)) { ptrlist_add(&axfr->proc.nodes, zone->nsec3_nodes, mm); } /* Set up cleanup callback. */ qdata->ext = axfr; qdata->ext_cleanup = &axfr_query_cleanup; /* No zone changes during multipacket answer (unlocked in axfr_answer_cleanup) */ rcu_read_lock(); return KNOT_EOK; }
__private_extern__ boolean_t ptrlist_insert(ptrlist_t * list, void * element, int where) { if (where < 0) return (FALSE); if (where >= list->count) return (ptrlist_add(list, element)); if (ptrlist_grow(list) == FALSE) return (FALSE); /* open up a space for 1 element */ bcopy(list->array + where, list->array + where + 1, (list->count - where) * sizeof(*list->array)); list->array[where] = element; list->count++; return (TRUE); }
STATIC void parse_nd_options(ptrlist_t * options_p, const char * buf, int len) { int left = len; const struct nd_opt_hdr * opt; int opt_len = 0; const char * scan; ptrlist_init(options_p); for (scan = buf; left >= sizeof(*opt); ) { opt = (struct nd_opt_hdr *)scan; opt_len = opt->nd_opt_len * ND_OPT_ALIGN; if (opt_len > left) { /* truncated packet */ ptrlist_free(options_p); break; } ptrlist_add(options_p, (void *)opt); scan += opt_len; left -= opt_len; } return; }
/* * Functions: dhcpol_* * * Purpose: * Routines to parse/access existing options buffers. */ boolean_t dhcpol_add(dhcpol_t * list, void * element) { return (ptrlist_add((ptrlist_t *)list, element)); }