118 lines
2.9 KiB
Plaintext
118 lines
2.9 KiB
Plaintext
|
$OpenBSD: patch-lib_misc_c,v 1.1 2013/03/13 21:42:58 landry Exp $
|
||
|
http://bugs.bitlbee.org/bitlbee/ticket/421
|
||
|
needed until ns_parse family of functions are added to lib/libc/asr
|
||
|
--- lib/misc.c.orig Mon Jan 7 00:41:11 2013
|
||
|
+++ lib/misc.c Wed Mar 6 19:13:27 2013
|
||
|
@@ -44,7 +44,10 @@
|
||
|
#ifdef HAVE_RESOLV_A
|
||
|
#include <arpa/nameser.h>
|
||
|
#include <resolv.h>
|
||
|
+#if defined (__OpenBSD__)
|
||
|
+#include <netinet/in.h>
|
||
|
#endif
|
||
|
+#endif
|
||
|
|
||
|
#include "md5.h"
|
||
|
#include "ssl_client.h"
|
||
|
@@ -522,19 +525,90 @@ struct ns_srv_reply **srv_lookup( char *service, char
|
||
|
char name[1024];
|
||
|
unsigned char querybuf[1024];
|
||
|
const unsigned char *buf;
|
||
|
+ int i, n, len, size;
|
||
|
+#if defined (__OpenBSD__)
|
||
|
+ char uncomp[MAXDNAME];
|
||
|
+ int complen = -1;
|
||
|
+ unsigned int qdcount = 0, ancount = 0;
|
||
|
+
|
||
|
+ const unsigned char *comp = NULL;
|
||
|
+ unsigned char *end = NULL;
|
||
|
+ HEADER *head = NULL;
|
||
|
+
|
||
|
+ int ns_c_in = C_IN, ns_t_srv = T_SRV;
|
||
|
+ int prio = -1, weight = -1, port = -1;
|
||
|
+#else
|
||
|
ns_msg nsh;
|
||
|
ns_rr rr;
|
||
|
- int i, n, len, size;
|
||
|
+#endif
|
||
|
+
|
||
|
|
||
|
g_snprintf( name, sizeof( name ), "_%s._%s.%s", service, protocol, domain );
|
||
|
|
||
|
if( ( size = res_query( name, ns_c_in, ns_t_srv, querybuf, sizeof( querybuf ) ) ) <= 0 )
|
||
|
return NULL;
|
||
|
|
||
|
+ n = 0;
|
||
|
+
|
||
|
+#if defined (__OpenBSD__)
|
||
|
+ head = (HEADER *)querybuf;
|
||
|
+ comp = querybuf + HFIXEDSZ;
|
||
|
+ end = querybuf + size;
|
||
|
+
|
||
|
+ ancount = ntohs(head->ancount);
|
||
|
+
|
||
|
+ /* Skip over the Query part */
|
||
|
+ for (qdcount = ntohs(head->qdcount); qdcount--; comp += size + QFIXEDSZ)
|
||
|
+ if ((size = dn_skipname(comp, end)) < 0)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+
|
||
|
+ /* Get the answers */
|
||
|
+ while (ancount > 0 && comp < end) {
|
||
|
+ /* Skip the owner name, to which this resource record pertains. */
|
||
|
+ complen = dn_expand(querybuf, end, comp, uncomp, sizeof(uncomp));
|
||
|
+ if (complen < 0)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+ comp += complen;
|
||
|
+
|
||
|
+
|
||
|
+ /* Get the useful answers. */
|
||
|
+ /* GETSHORT(type, comp); */
|
||
|
+ comp += INT16SZ;
|
||
|
+ /* GETSHORT(class, comp); */
|
||
|
+ comp += INT16SZ;
|
||
|
+ /* GETLONG(ttl, comp); */
|
||
|
+ comp += INT32SZ;
|
||
|
+ /* GETSHORT(complen, comp); */
|
||
|
+ comp += INT16SZ;
|
||
|
+
|
||
|
+ GETSHORT(prio , comp);
|
||
|
+ GETSHORT(weight , comp);
|
||
|
+ GETSHORT(port , comp);
|
||
|
+ complen = dn_expand(querybuf, end, comp, uncomp, sizeof(uncomp));
|
||
|
+ if (complen < 0)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+ comp += complen;
|
||
|
+
|
||
|
+ reply = g_malloc( sizeof( struct ns_srv_reply ) + strlen(uncomp) + 1 );
|
||
|
+
|
||
|
+ reply->prio = prio;
|
||
|
+ reply->weight = weight;
|
||
|
+ reply->port = port;
|
||
|
+ strlcpy( reply->name, uncomp, strlen(uncomp) + 1 );
|
||
|
+
|
||
|
+ n++;
|
||
|
+ replies = g_renew( struct ns_srv_reply *, replies, n + 1 );
|
||
|
+ replies[n-1] = reply;
|
||
|
+
|
||
|
+ ancount--;
|
||
|
+ }
|
||
|
+#else
|
||
|
if( ns_initparse( querybuf, size, &nsh ) != 0 )
|
||
|
return NULL;
|
||
|
|
||
|
- n = 0;
|
||
|
while( ns_parserr( &nsh, ns_s_an, n, &rr ) == 0 )
|
||
|
{
|
||
|
size = ns_rr_rdlen( rr );
|
||
|
@@ -567,6 +641,7 @@ struct ns_srv_reply **srv_lookup( char *service, char
|
||
|
replies = g_renew( struct ns_srv_reply *, replies, n + 1 );
|
||
|
replies[n-1] = reply;
|
||
|
}
|
||
|
+#endif
|
||
|
if( replies )
|
||
|
replies[n] = NULL;
|
||
|
#endif
|