|
|
@@ -28,6 +28,12 @@
|
|
|
*
|
|
|
*
|
|
|
*****************************************************************************/
|
|
|
+#define IF_RECORD(label, querytype, verb_str) if (strstr (chld_out.line[i], label) && (strncmp(query_type, querytype, query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) { \
|
|
|
+ if (verbose) printf(verb_str); \
|
|
|
+ temp_buffer = rindex (chld_out.line[i], ' '); \
|
|
|
+ addresses[n_addresses++] = check_new_address(temp_buffer); \
|
|
|
+ strncpy(query_found, querytype, sizeof(query_found)); \
|
|
|
+ memset(query_found, '\0', sizeof(query_found));
|
|
|
|
|
|
const char *progname = "check_dns";
|
|
|
const char *copyright = "2000-2014";
|
|
|
@@ -170,24 +176,17 @@ main (int argc, char **argv)
|
|
|
if (strstr (chld_out.line[i], "Name:"))
|
|
|
parse_address = TRUE;
|
|
|
/* begin handling types of records */
|
|
|
- if (strstr (chld_out.line[i], "AAAA address") && (strncmp(query_type, "-querytype=AAAA", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
|
|
|
- if (verbose) printf("Found AAAA record\n");
|
|
|
- temp_buffer = rindex (chld_out.line[i], ' ');
|
|
|
- addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
- strncpy(query_found, "-querytype=AAAA", sizeof(query_found));
|
|
|
- }
|
|
|
- else if (strstr (chld_out.line[i], "exchanger =") && (strncmp(query_type, "-querytype=MX", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
|
|
|
- if (verbose) printf("Found MX record\n");
|
|
|
- temp_buffer = index (chld_out.line[i], '=');
|
|
|
- addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
- strncpy(query_found, "-querytype=MX", sizeof(query_found));
|
|
|
- }
|
|
|
- else if (strstr (chld_out.line[i], "service =") && (strncmp(query_type, "-querytype=SRV", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
|
|
|
- if (verbose) printf("Found SRV record\n");
|
|
|
- temp_buffer = index (chld_out.line[i], '=');
|
|
|
- addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
- strncpy(query_found, "-querytype=SRV", sizeof(query_found));
|
|
|
- }
|
|
|
+ IF_RECORD("AAAA address", "-querytype=AAAA", "Found AAAA record\n") }
|
|
|
+ else IF_RECORD("exchanger =", "-querytype=MX", "Found MX record\n") }
|
|
|
+ else IF_RECORD("service =", "-querytype=SRV", "Found SRV record\n") }
|
|
|
+ else IF_RECORD("nameserver =", "-querytype=NS", "Found NS record\n") }
|
|
|
+ else IF_RECORD("dname =", "-querytype=DNAME", "Found DNAME record\n") }
|
|
|
+ else IF_RECORD("protocol =", "-querytype=WKS", "Found WKS record\n") }
|
|
|
+ /* TODO: needs to be changed to handle txt output and max size of txt recrods */
|
|
|
+ else IF_RECORD("text =", "-querytype=TXT", "Found TXT record\n") }
|
|
|
+ /* only matching for origin records, if requested other fields could be included at a later date */
|
|
|
+ else IF_RECORD("origin =", "-querytype=SOA", "Found SOA record\n") }
|
|
|
+ /* cnames cannot use macro as we must check for accepting them separately */
|
|
|
else if (accept_cname && strstr (chld_out.line[i], "canonical name =") && (strncmp(query_type, "-querytype=CNAME", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
|
|
|
if (verbose) printf("Found CNAME record\n");
|
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
|
@@ -201,45 +200,8 @@ main (int argc, char **argv)
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=A", sizeof(query_found));
|
|
|
}
|
|
|
- else if (strstr (chld_out.line[i], "nameserver =") && (strncmp(query_type, "-querytype=NS", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
|
|
|
- if (verbose) printf("Found NS record\n");
|
|
|
- temp_buffer = index (chld_out.line[i], '=');
|
|
|
- addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
- strncpy(query_found, "-querytype=NS", sizeof(query_found));
|
|
|
- }
|
|
|
- else if (strstr (chld_out.line[i], "dname =") && (strncmp(query_type, "-querytype=DNAME", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
|
|
|
- if (verbose) printf("Found DNAME record\n");
|
|
|
- temp_buffer = index (chld_out.line[i], '=');
|
|
|
- addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
- strncpy(query_found, "-querytype=DNAME", sizeof(query_found));
|
|
|
- }
|
|
|
/* must be after other records with "name" as an identifier, as ptr does not spefify */
|
|
|
- else if (strstr (chld_out.line[i], "name =") && (strncmp(query_type, "-querytype=PTR", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
|
|
|
- if (verbose) printf("Found PTR record\n");
|
|
|
- temp_buffer = index (chld_out.line[i], '=');
|
|
|
- addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
- strncpy(query_found, "-querytype=PTR", sizeof(query_found));
|
|
|
- }
|
|
|
- else if (strstr (chld_out.line[i], "protocol =") && (strncmp(query_type, "-querytype=WKS", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
|
|
|
- if (verbose) printf("Found WKS record\n");
|
|
|
- temp_buffer = index (chld_out.line[i], '=');
|
|
|
- addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
- strncpy(query_found, "-querytype=WKS", sizeof(query_found));
|
|
|
- }
|
|
|
- /* TODO: needs to be changed to handle txt output and max size of txt recrods */
|
|
|
- else if (strstr (chld_out.line[i], "text =") && (strncmp(query_type, "-querytype=TXT", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
|
|
|
- if (verbose) printf("Found TXT record\n");
|
|
|
- temp_buffer = index (chld_out.line[i], '=');
|
|
|
- addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
- strncpy(query_found, "-querytype=TXT", sizeof(query_found));
|
|
|
- }
|
|
|
- /* only matching for origin records, if requested other fields could be included at a later date */
|
|
|
- else if (strstr (chld_out.line[i], "origin =") && (strncmp(query_type, "-querytype=SOA", query_size) == 0 || strncmp(query_type, "-querytype=ANY", query_size) == 0)) {
|
|
|
- if (verbose) printf("Found SOA record\n");
|
|
|
- temp_buffer = index(chld_out.line[i], '=');
|
|
|
- addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
- strncpy(query_found, "-querytype=SOA", sizeof(query_found));
|
|
|
- }
|
|
|
+ else IF_RECORD("name =", "-querytype=PTR", "Found PTR record\n") }
|
|
|
/* needed for non-query ptr\reverse lookup checks */
|
|
|
else if (strstr(chld_out.line[i], ".in-addr.arpa") && !query_set) {
|
|
|
if ((temp_buffer = strstr(chld_out.line[i], "name = ")))
|
|
|
@@ -518,13 +480,15 @@ process_arguments (int argc, char **argv)
|
|
|
strcpy(query_type, "-querytype=");
|
|
|
strcat(query_type, optarg);
|
|
|
query_set = TRUE;
|
|
|
+ /* logic is set such that we must accept cnames if they are querying for them */
|
|
|
+ if (strcmp(query_type, "-querytype=CNAME") != 0)
|
|
|
+ break;
|
|
|
+ case 'n': /* accept cname responses as a result */
|
|
|
+ accept_cname = TRUE;
|
|
|
break;
|
|
|
case 'A': /* expect authority */
|
|
|
expect_authority = TRUE;
|
|
|
break;
|
|
|
- case 'n': /* accept cname responses as a result */
|
|
|
- accept_cname = TRUE;
|
|
|
- break;
|
|
|
case 'w':
|
|
|
warning = optarg;
|
|
|
break;
|