std::vector<std::string> DNSResolver::get_record(const std::string& url, int record_type, boost::optional<std::string> (*reader)(const char *,size_t), bool& dnssec_available, bool& dnssec_valid) { std::vector<std::string> addresses; dnssec_available = false; dnssec_valid = false; if (!check_address_syntax(url.c_str())) { return addresses; } // destructor takes care of cleanup ub_result_ptr result; // call DNS resolver, blocking. if return value not zero, something went wrong if (!ub_resolve(m_data->m_ub_context, string_copy(url.c_str()), record_type, DNS_CLASS_IN, &result)) { dnssec_available = (result->secure || result->bogus); dnssec_valid = result->secure && !result->bogus; if (result->havedata) { for (size_t i=0; result->data[i] != NULL; i++) { boost::optional<std::string> res = (*reader)(result->data[i], result->len[i]); if (res) { MINFO("Found \"" << *res << "\" in " << get_record_name(record_type) << " record for " << url); addresses.push_back(*res); } } } } return addresses; }
int bootstage_stash(void *base, int size) { struct bootstage_hdr *hdr = (struct bootstage_hdr *)base; struct bootstage_record *rec; char buf[20]; char *ptr = base, *end = ptr + size; uint32_t count; int id; if (hdr + 1 > (struct bootstage_hdr *)end) { debug("%s: Not enough space for bootstage hdr\n", __func__); return -1; } /* Write an arbitrary version number */ hdr->version = BOOTSTAGE_VERSION; /* Count the number of records, and write that value first */ for (rec = record, id = count = 0; id < BOOTSTAGE_ID_COUNT; id++, rec++) { if (rec->time_us != 0) count++; } hdr->count = count; hdr->size = 0; hdr->magic = BOOTSTAGE_MAGIC; ptr += sizeof(*hdr); /* Write the records, silently stopping when we run out of space */ for (rec = record, id = 0; id < BOOTSTAGE_ID_COUNT; id++, rec++) { if (rec->time_us != 0) append_data(&ptr, end, rec, sizeof(*rec)); } /* Write the name strings */ for (rec = record, id = 0; id < BOOTSTAGE_ID_COUNT; id++, rec++) { if (rec->time_us != 0) { const char *name; name = get_record_name(buf, sizeof(buf), rec); append_data(&ptr, end, name, strlen(name) + 1); } } /* Check for buffer overflow */ if (ptr > end) { debug("%s: Not enough space for bootstage stash\n", __func__); return -1; } /* Update total data size */ hdr->size = ptr - (char *)base; printf("Stashed %d records\n", hdr->count); return 0; }
static uint32_t print_time_record(struct bootstage_record *rec, uint32_t prev) { char buf[20]; if (prev == -1U) { printf("%11s", ""); print_grouped_ull(rec->time_us, BOOTSTAGE_DIGITS); } else { print_grouped_ull(rec->time_us, BOOTSTAGE_DIGITS); print_grouped_ull(rec->time_us - prev, BOOTSTAGE_DIGITS); } printf(" %s\n", get_record_name(buf, sizeof(buf), rec)); return rec->time_us; }
/** * Add all bootstage timings to a device tree. * * @param blob Device tree blob * @return 0 on success, != 0 on failure. */ static int add_bootstages_devicetree(struct fdt_header *blob) { struct bootstage_data *data = gd->bootstage; int bootstage; char buf[20]; int recnum; int i; if (!blob) return 0; /* * Create the node for bootstage. * The address of flat device tree is set up by the command bootm. */ bootstage = fdt_add_subnode(blob, 0, "bootstage"); if (bootstage < 0) return -EINVAL; /* * Insert the timings to the device tree in the reverse order so * that they can be printed in the Linux kernel in the right order. */ for (recnum = data->rec_count - 1, i = 0; recnum >= 0; recnum--, i++) { struct bootstage_record *rec = &data->record[recnum]; int node; if (rec->id != BOOTSTAGE_ID_AWAKE && rec->time_us == 0) continue; node = fdt_add_subnode(blob, bootstage, simple_itoa(i)); if (node < 0) break; /* add properties to the node. */ if (fdt_setprop_string(blob, node, "name", get_record_name(buf, sizeof(buf), rec))) return -EINVAL; /* Check if this is a 'mark' or 'accum' record */ if (fdt_setprop_cell(blob, node, rec->start_us ? "accum" : "mark", rec->time_us)) return -EINVAL; } return 0; }