|
@@ -94,6 +94,7 @@ main (int argc, char **argv)
|
|
|
int n_addresses = 0;
|
|
int n_addresses = 0;
|
|
|
char *msg = NULL;
|
|
char *msg = NULL;
|
|
|
char query_found[16] = "";
|
|
char query_found[16] = "";
|
|
|
|
|
+ int query_size = 16;
|
|
|
char *temp_buffer = NULL;
|
|
char *temp_buffer = NULL;
|
|
|
int non_authoritative = TRUE;
|
|
int non_authoritative = TRUE;
|
|
|
int result = STATE_UNKNOWN;
|
|
int result = STATE_UNKNOWN;
|
|
@@ -150,74 +151,75 @@ main (int argc, char **argv)
|
|
|
non_authoritative = FALSE;
|
|
non_authoritative = FALSE;
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
- /* the server is responding, we just got the host name... */
|
|
|
|
|
|
|
+ /* the server is responding, we just got the host name...*/
|
|
|
if (strstr (chld_out.line[i], "Name:"))
|
|
if (strstr (chld_out.line[i], "Name:"))
|
|
|
parse_address = TRUE;
|
|
parse_address = TRUE;
|
|
|
/* begin handling types of records */
|
|
/* begin handling types of records */
|
|
|
- if (strstr (chld_out.line[i], "AAAA address")) {
|
|
|
|
|
|
|
+ if (strstr (chld_out.line[i], "AAAA address") && (strncmp(query_type, "-querytype=AAAA", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
|
|
|
if (verbose) printf("Found AAAA record\n");
|
|
if (verbose) printf("Found AAAA record\n");
|
|
|
temp_buffer = rindex (chld_out.line[i], ' ');
|
|
temp_buffer = rindex (chld_out.line[i], ' ');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=AAAA", sizeof(query_found));
|
|
strncpy(query_found, "-querytype=AAAA", sizeof(query_found));
|
|
|
}
|
|
}
|
|
|
- else if (strstr (chld_out.line[i], "exchanger =")) {
|
|
|
|
|
|
|
+ else if (strstr (chld_out.line[i], "exchanger =") && (strncmp(query_type, "-querytype=MX", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
|
|
|
if (verbose) printf("Found MX record\n");
|
|
if (verbose) printf("Found MX record\n");
|
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=MX", sizeof(query_found));
|
|
strncpy(query_found, "-querytype=MX", sizeof(query_found));
|
|
|
}
|
|
}
|
|
|
- else if (strstr (chld_out.line[i], "service =")) {
|
|
|
|
|
|
|
+ else if (strstr (chld_out.line[i], "service =") && (strncmp(query_type, "-querytype=SRV", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
|
|
|
if (verbose) printf("Found SRV record\n");
|
|
if (verbose) printf("Found SRV record\n");
|
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=SRV", sizeof(query_found));
|
|
strncpy(query_found, "-querytype=SRV", sizeof(query_found));
|
|
|
}
|
|
}
|
|
|
- else if (accept_cname && strstr (chld_out.line[i], "canonical name =")) {
|
|
|
|
|
|
|
+ else if (accept_cname && strstr (chld_out.line[i], "canonical name =") && (strncmp(query_type, "-querytype=CNAME", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
|
|
|
if (verbose) printf("Found CNAME record\n");
|
|
if (verbose) printf("Found CNAME record\n");
|
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=CNAME", sizeof(query_found));
|
|
strncpy(query_found, "-querytype=CNAME", sizeof(query_found));
|
|
|
}
|
|
}
|
|
|
|
|
+ /* does not need strncmp as we want A at all times unless another record match */
|
|
|
else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || strstr (chld_out.line[i], "Addresses:"))) {
|
|
else if (parse_address == TRUE && (strstr (chld_out.line[i], "Address:") || strstr (chld_out.line[i], "Addresses:"))) {
|
|
|
if (verbose) printf("Found A record\n");
|
|
if (verbose) printf("Found A record\n");
|
|
|
temp_buffer = index (chld_out.line[i], ':');
|
|
temp_buffer = index (chld_out.line[i], ':');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=A", sizeof(query_found));
|
|
strncpy(query_found, "-querytype=A", sizeof(query_found));
|
|
|
}
|
|
}
|
|
|
- else if (strstr (chld_out.line[i], "nameserver =")) {
|
|
|
|
|
|
|
+ else if (strstr (chld_out.line[i], "nameserver =") && (strncmp(query_type, "-querytype=NS", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
|
|
|
if (verbose) printf("Found NS record\n");
|
|
if (verbose) printf("Found NS record\n");
|
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=NS", sizeof(query_found));
|
|
strncpy(query_found, "-querytype=NS", sizeof(query_found));
|
|
|
}
|
|
}
|
|
|
- else if (strstr (chld_out.line[i], "dname =")) {
|
|
|
|
|
|
|
+ else if (strstr (chld_out.line[i], "dname =") && (strncmp(query_type, "-querytype=DNAME", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
|
|
|
if (verbose) printf("Found DNAME record\n");
|
|
if (verbose) printf("Found DNAME record\n");
|
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=DNAME", sizeof(query_found));
|
|
strncpy(query_found, "-querytype=DNAME", sizeof(query_found));
|
|
|
}
|
|
}
|
|
|
/* must be after other records with "name" as an identifier, as ptr does not spefify */
|
|
/* must be after other records with "name" as an identifier, as ptr does not spefify */
|
|
|
- else if (strstr (chld_out.line[i], "name =")) {
|
|
|
|
|
|
|
+ else if (strstr (chld_out.line[i], "name =") && (strncmp(query_type, "-querytype=PTR", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
|
|
|
if (verbose) printf("Found PTR record\n");
|
|
if (verbose) printf("Found PTR record\n");
|
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=PTR", sizeof(query_found));
|
|
strncpy(query_found, "-querytype=PTR", sizeof(query_found));
|
|
|
}
|
|
}
|
|
|
- else if (strstr (chld_out.line[i], "protocol =")) {
|
|
|
|
|
|
|
+ else if (strstr (chld_out.line[i], "protocol =") && (strncmp(query_type, "-querytype=WKS", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
|
|
|
if (verbose) printf("Found WKS record\n");
|
|
if (verbose) printf("Found WKS record\n");
|
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=WKS", sizeof(query_found));
|
|
strncpy(query_found, "-querytype=WKS", sizeof(query_found));
|
|
|
}
|
|
}
|
|
|
/* TODO: needs to be changed to handle txt output and max size of txt recrods */
|
|
/* TODO: needs to be changed to handle txt output and max size of txt recrods */
|
|
|
- else if (strstr (chld_out.line[i], "text =")) {
|
|
|
|
|
|
|
+ else if (strstr (chld_out.line[i], "text =") && (strncmp(query_type, "-querytype=TXT", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
|
|
|
if (verbose) printf("Found TXT record\n");
|
|
if (verbose) printf("Found TXT record\n");
|
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
temp_buffer = index (chld_out.line[i], '=');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
|
strncpy(query_found, "-querytype=TXT", sizeof(query_found));
|
|
strncpy(query_found, "-querytype=TXT", sizeof(query_found));
|
|
|
}
|
|
}
|
|
|
/* only matching for origin records, if requested other fields could be included at a later date */
|
|
/* only matching for origin records, if requested other fields could be included at a later date */
|
|
|
- else if (strstr (chld_out.line[i], "origin =")) {
|
|
|
|
|
|
|
+ else if (strstr (chld_out.line[i], "origin =") && (strncmp(query_type, "-querytype=SOA", query_size) == 0 || strncmp(query_type, "-querytype=ALL", query_size) == 0)) {
|
|
|
if (verbose) printf("Found SOA record\n");
|
|
if (verbose) printf("Found SOA record\n");
|
|
|
temp_buffer = index(chld_out.line[i], '=');
|
|
temp_buffer = index(chld_out.line[i], '=');
|
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|
|
addresses[n_addresses++] = check_new_address(temp_buffer);
|