X-Spam-Check-By: sourceware.org Date: Thu, 11 May 2006 16:35:19 -0500 From: Peter Fales To: cygwin AT cygwin DOT com Subject: res_search problem Message-ID: <20060511213519.GA13688@lucent.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.1i Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com I'm trying to port some code which uses res_search() to look up an SRV record. The attached code works on Linux, Solaris, HP-UX, Darwin, and Irix, but doesn't work on Cygwin. I'm not a DNS expert but this test case is derived from code at: http://www.libspf.org/doxygen/html/dns_8c-source.html http://www.waider.ie/hacks/workshop/c/rvp/librvp-0.9.tar.gz Am I missing something fundamental, or is res_search not working? (In ethereal I can see the question being sent and the correct response coming back - but the correct string does not seem to be in the buffer returned from res_search().) Can someone point to an example of using res_search() under Cygwin? (If you want to try this yourself, you'll need to set srvname to the name of a valid SRV record at your site) ################################################################# /* srv_rec.c - test whether we can look up on SRV record */ /* Build with gcc -o srv_rec srv_rec.c -lresolv */ #include #include #include #include #include #if defined(__linux__) || defined(__APPLE_CC__) # include #endif #include #include #include #include #include /* record type: 2 bytes record class: 2 bytes TTL: 4 bytes data length: 2 bytes */ typedef struct _rechdr { unsigned short type; unsigned short class; unsigned int ttl; unsigned short length; } rechdr; /* priority: 2 bytes weight: 2 bytes port: 2 bytes target: remainder */ typedef struct _srv { unsigned short priority; unsigned short weight; unsigned short port; unsigned char *target; } srv_t; /* DNS service record */ typedef struct _srvrec { /* realistically this should be a list of { host, port, priority, weight } structures */ char *host; int port; time_t expiry; /* time at which we'll need to requery */ } srvrec; #ifndef T_SRV #define T_SRV 33 #endif #ifndef HFIXEDSZ #define HFIXEDSZ 12 #endif main() { char *srvname = "_rvp._tcp.lucent.com"; HEADER *hdr; unsigned char answer[1024]; char name[1024]; int len = 0; srvrec *retval = NULL; bzero( answer, 1024 ); bzero( name, 1024 ); _res.options |= RES_DEBUG; if (( len = res_search( srvname, C_IN, T_SRV, answer, sizeof( answer ))) != -1 ) { unsigned char *blob; int i, l; hdr = (HEADER *)answer; if ( ntohs( hdr->ancount ) == 0 ) { printf( __FUNCTION__, "res_search: no records found\n" ); exit(1); } blob = &answer[HFIXEDSZ]; blob += dn_skipname(blob,answer+len) + QFIXEDSZ; for ( i = 0; i < ntohs( hdr->ancount ); i++ ) { rechdr *header; srv_t *server; l = dn_expand( answer, answer + len, blob, name, 1024 ); if ( l < 0 ) { printf( __FUNCTION__, "dn_expand failed (2)\n" ); exit(3); } blob += l; header = (rechdr *)&blob[0]; server = (srv_t *)&blob[10]; /* errr. magic number. */ l = dn_expand( answer, answer + len, blob + 16, name, 1024 ); if ( l < 0 ) { printf( __FUNCTION__, "dn_expand failed (3)\n" ); exit(4); } printf("Host name from SRV record is %s\n",name); printf("Port from SRV record is %d\n", ntohs( server->port )); } } } -- Peter Fales Lucent Technologies Member of Technical Staff 2000 Lucent Lane Room: 1C-436 Naperville, IL 60566-7033 Email: psfales AT lucent DOT com Phone: 630 979 8031 -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/