How to set DNS lookup type for getaddrinfo()?


 
Thread Tools Search this Thread
Top Forums Programming How to set DNS lookup type for getaddrinfo()?
# 1  
Old 02-14-2010
How to set DNS lookup type for getaddrinfo()?

Hi there,

I'm trying to do an MX type lookup using getaddrinfo(), but I can't work out how to change the lookup type to MX from the standard A - can anybody tell me how to do this?

Thanks very much

John G
# 2  
Old 02-14-2010
You could try the res_query functions for interfacing to the systems resolver.
# 3  
Old 02-14-2010
You cannot use getaddrinfo() to look up MX records. By design, it only queries A (or AAAA if configured) records.
# 4  
Old 02-18-2010
Thanks both very much!

I found a helpful O'Rielly chapter about res_query et al here and followed it quite well, up until the last bit where we uncompress a domain name. When I uncompress it, I appear to get garbage.

The program below is a test I'm using to look for an MX record of a domain specified on the command-line. Basically I'm looking for anything I can use as the hostname of a mail server so I can open a port and start an SMTP session.

It doesn't output the name directly (as the names I get are unprintable!) but it outputs the hex value of each character in the uncompressed name.

I'm compiling with
Code:
gcc -std=gnu99 -Wall -Werror get-host.c -o get-host -lbind9

and here's a sample of my output:

Code:
Got answer of length: 219
Got 5 answers
name:
0x2e, 0x0, 0xffffffb5, 0xffffff83, 0xffffffb7, 0xfffffff8, 0xffffff98, 0xffffffe6, 0xffffffbf, 0x17, 0x0, 0x0, 0x0, 0xffffffda, 0xffffff9e, 0xffffffe4, 0x0, 0xffffffe0, 0x47, 0xc, 0xffffffb7, 0x57, 0xffffffdb, 0xffffff93, 0x1c, 0x17, 0x0, 0x0, 0x0, 0x0, 
name:
0x2e, 0x0, 0xffffffb5, 0xffffff83, 0xffffffb7, 0xfffffff8, 0xffffff98, 0xffffffe6, 0xffffffbf, 0x17, 0x0, 0x0, 0x0, 0xffffffda, 0xffffff9e, 0xffffffe4, 0x0, 0xffffffe0, 0x47, 0xc, 0xffffffb7, 0x57, 0xffffffdb, 0xffffff93, 0x1c, 0x17, 0x0, 0x0, 0x0, 0x0, 
name:
0x2e, 0x0, 0xffffffb5, 0xffffff83, 0xffffffb7, 0xfffffff8, 0xffffff98, 0xffffffe6, 0xffffffbf, 0x17, 0x0, 0x0, 0x0, 0xffffffda, 0xffffff9e, 0xffffffe4, 0x0, 0xffffffe0, 0x47, 0xc, 0xffffffb7, 0x57, 0xffffffdb, 0xffffff93, 0x1c, 0x17, 0x0, 0x0, 0x0, 0x0, 
name:
0x2e, 0x0, 0xffffffb5, 0xffffff83, 0xffffffb7, 0xfffffff8, 0xffffff98, 0xffffffe6, 0xffffffbf, 0x17, 0x0, 0x0, 0x0, 0xffffffda, 0xffffff9e, 0xffffffe4, 0x0, 0xffffffe0, 0x47, 0xc, 0xffffffb7, 0x57, 0xffffffdb, 0xffffff93, 0x1c, 0x17, 0x0, 0x0, 0x0, 0x0, 
name:
0x2e, 0x0, 0xffffffb5, 0xffffff83, 0xffffffb7, 0xfffffff8, 0xffffff98, 0xffffffe6, 0xffffffbf, 0x17, 0x0, 0x0, 0x0, 0xffffffda, 0xffffff9e, 0xffffffe4, 0x0, 0xffffffe0, 0x47, 0xc, 0xffffffb7, 0x57, 0xffffffdb, 0xffffff93, 0x1c, 0x17, 0x0, 0x0, 0x0, 0x0,

I tested each stage up until the decompression, and I was getting what I expect.

I'd be grateful if anyone has any idea what I'm doing wrong...?

Code:
#include <stdio.h>
#include <stdlib.h>

// for resolver routines
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>

// for ns routines
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/nameser.h>
#include <resolv.h>



int main ( int argc, char **argv )
{
	if (argc != 2)
		printf("usage: %s [addr]\n", argv[0]), exit(0);

	if (res_init() != 0)
	{
		puts("error in init\n");
		exit(1);
	}

	const char *dname = argv[1];
	int class = C_IN;
	int type = T_MX;

	int anslen = 5000;
	unsigned char answer[anslen];

	
	/* make query */
	int len = res_search(dname, class, type, answer, anslen);

	if (len == -1)
	{
		printf("Error making query\n");
		exit(1);
	}
	else
	{
		printf("Got answer of length: %d\n", len);
	}

	
	/* parse response */
	ns_msg msg;
	
	if (ns_initparse(answer, len, &msg) != 0)
		printf("Error parsing response\n"), exit(1);

	uint16_t msg_count = ns_msg_count(msg, ns_s_an);
	printf("Got %d answers\n", msg_count);

	if (msg_count == 0)
		exit(0);
	

	ns_rr rr;
	for ( int i = 0 ; i < msg_count ; i++ )
	{
		if (ns_parserr(&msg, ns_s_an, i, &rr))
			printf("Error parsing record\n"), exit(1);

		char buf[MAXDNAME];
		int size = ns_name_uncompress(ns_msg_base(msg), ns_msg_end(msg), ns_rr_rdata(rr), buf, MAXDNAME);

		if (size < 0)
			puts("Error uncompressing response name"), exit(1);

		puts("name:");
		for (int j = 0 ; j < 30 ; j++)
			printf("0x%x(%c), ", buf[j], buf[j]);
		printf("\n");
	}

	
	exit(0);
}

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. What is on Your Mind?

DNS Lookup Tool Using DIG

Hi. Having a bit of quick fun putting some networking tools online. Here is a DNS Lookup tool. It's basically the DIG command line tool wrapped in forum formatting. If you want more features, please post here. I'm doing to make a few more network tools like this and move on to other... (1 Reply)
Discussion started by: Neo
1 Replies

2. Red Hat

DNS reverse lookup issue

Hi guys. Ok so let me lay out my configs. I can do a NSlookup from client to server BUT NOT a reverse lookup. DNS server: Optimus.jaydomain.com IP : 192.168.1.50 DNS Client: Megatron.jaydomain.com IP : 192.168.1.60 On Sever: # cat /etc/named.conf // // named.conf // // Provided... (4 Replies)
Discussion started by: Junaid Subhani
4 Replies

3. IP Networking

HOWTO: Linux multihomed dns client - reverse lookup

The following thread is closed: 133552-howto-linux-multihomed-dns-client (Sorry I am not allowed to post URLs) Therefore I write this append in an own thread. The HOWTO in the referenced thread helped me a lot and I only want to append how to make reverse lookup working for a local zone: ... (0 Replies)
Discussion started by: scheruga
0 Replies

4. IP Networking

lookup ip address, subnet mask, gateway, and dns at same time

Is there a command that can lookup ip address, subnet mask, gateway, and dns all at the same. I know ifconfig can lookup ip address and subnet mask. I know route -n can lookup gateway. Not sure about a dns command. So I hope there is a way to lookup ip address, subnet mask, gateway, and dns all at... (2 Replies)
Discussion started by: cokedude
2 Replies

5. Solaris

DNS Lookup failure:

I am facing typical problem with apache as proxy. my solaris box was running with apache1.3, due to security issue i have updated to apache 2.2. I don't have any DNS set up onmy network. I was able to connect to internet apache 1.3 working as proxy server. http and https are working fine. when... (3 Replies)
Discussion started by: sns_sns
3 Replies

6. Programming

getaddrinfo error:service name not available for the specified socket type

I use Solaris 10,and I use getaddrinfo in my code,like follows: struct addrinfo *ailist,hint; if(argc!=2) err_quit("usage: ruptime hostname"); hint.ai_flags=0; hint.ai_family=0; hint.ai_socktype=SOCK_STREAM; hint.ai_protocol=0; hint.ai_addrlen=0; hint.ai_canonname=NULL;... (1 Reply)
Discussion started by: konvalo
1 Replies

7. AIX

prevent sendmail do DNS lookup

Hello! How do I prevent AIX sendmail from doing a DNS lookup prior sending the mail? (we still need to have the DNS resolving on AIX level). We are running AIX 6.1 and 5.3. //sap4ever (1 Reply)
Discussion started by: sap4ever
1 Replies

8. Solaris

Which lookup tool query both hosts and DNS server?

As i understand, host/nslookup/dig only query DNS server to resolve name to ip. ping can query both, but it seems if ping is blocked, ping won't return IP. traceroute can query both, but i am not able to test if traceroute is blocked, What is the result? Neither ping/traceroute is... (3 Replies)
Discussion started by: honglus
3 Replies

9. UNIX for Advanced & Expert Users

[DNS] Reverse Lookup for 2 IP Addresses

Originally I had the server at home and on Comcast so I used dyndns.org for DNS. Once the server got a bit more popular, I leased a server at a colo facility. They set up the server name in their DNS so I didn't really have any reason to manage my own DNS. DynDNS was managing the domains and I... (7 Replies)
Discussion started by: BOFH
7 Replies

10. UNIX for Dummies Questions & Answers

DNS set-up

Were able to set-up and configure Web,File and DHCP Services except for the DNS set-up. Isn't it that to set up dns, we have to use BIND? In Web Services, we were able to view the default page using the servers IP address, our client wants to view it using or typing the address for example... (2 Replies)
Discussion started by: carljo
2 Replies
Login or Register to Ask a Question