static const char *dns_cache_item_type_to_string(DnsCacheItem *item) { assert(item); switch (item->type) { case DNS_CACHE_POSITIVE: return "POSITIVE"; case DNS_CACHE_NODATA: return "NODATA"; case DNS_CACHE_NXDOMAIN: return "NXDOMAIN"; case DNS_CACHE_RCODE: return dns_rcode_to_string(item->rcode); } return NULL; }
static int reply_query_state(DnsQuery *q) { _cleanup_free_ char *ip = NULL; const char *name; int r; if (q->request_hostname) name = q->request_hostname; else { r = in_addr_to_string(q->request_family, &q->request_address, &ip); if (r < 0) return r; name = ip; } switch (q->state) { case DNS_TRANSACTION_NO_SERVERS: return sd_bus_reply_method_errorf(q->request, BUS_ERROR_NO_NAME_SERVERS, "No appropriate name servers or networks for name found"); case DNS_TRANSACTION_TIMEOUT: return sd_bus_reply_method_errorf(q->request, SD_BUS_ERROR_TIMEOUT, "Query timed out"); case DNS_TRANSACTION_ATTEMPTS_MAX_REACHED: return sd_bus_reply_method_errorf(q->request, SD_BUS_ERROR_TIMEOUT, "All attempts to contact name servers or networks failed"); case DNS_TRANSACTION_INVALID_REPLY: return sd_bus_reply_method_errorf(q->request, BUS_ERROR_INVALID_REPLY, "Received invalid reply"); case DNS_TRANSACTION_RESOURCES: return sd_bus_reply_method_errorf(q->request, BUS_ERROR_NO_RESOURCES, "Not enough resources"); case DNS_TRANSACTION_ABORTED: return sd_bus_reply_method_errorf(q->request, BUS_ERROR_ABORTED, "Query aborted"); case DNS_TRANSACTION_FAILURE: { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; if (q->answer_rcode == DNS_RCODE_NXDOMAIN) sd_bus_error_setf(&error, _BUS_ERROR_DNS "NXDOMAIN", "'%s' not found", name); else { const char *rc, *n; char p[3]; /* the rcode is 4 bits long */ rc = dns_rcode_to_string(q->answer_rcode); if (!rc) { sprintf(p, "%i", q->answer_rcode); rc = p; } n = strappenda(_BUS_ERROR_DNS, rc); sd_bus_error_setf(&error, n, "Could not resolve '%s', server or network returned error %s", name, rc); } return sd_bus_reply_method_error(q->request, &error); } case DNS_TRANSACTION_NULL: case DNS_TRANSACTION_PENDING: case DNS_TRANSACTION_SUCCESS: default: assert_not_reached("Impossible state"); } }