[PATCH v2] gweb/gresolv.c: make use of res_ninit optional and subject to __RES

Alexander Kanavin <[email protected]>
Newsgroups dev.linux.lists.connman
Message-ID <[email protected]>
From: Khem Raj <[email protected]>

Not all libc implementation have those functions, and the way to determine
if they do is to check __RES which is explained in resolv.h thusly:

/*
 * Revision information.  This is the release date in YYYYMMDD format.
 * It can change every day so the right thing to do with it is use it
 * in preprocessor commands such as "#if (__RES > 19931104)".  Do not
 * compare for equality; rather, use it to determine whether your resolver
 * is new enough to contain a certain feature.
 */

Indeed, it needs to be at least 19991006.

The portion of the patch that implements a fallback is ported from
Alpine Linux:
http://git.alpinelinux.org/cgit/aports/plain/testing/connman/libresolv.patch
---
 gweb/gresolv.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/gweb/gresolv.c b/gweb/gresolv.c
index 8101d718..136b31f6 100644
--- a/gweb/gresolv.c
+++ b/gweb/gresolv.c
@@ -879,7 +879,9 @@ GResolv *g_resolv_new(int index)
 	resolv->index = index;
 	resolv->nameserver_list = NULL;
 
+#if (__RES >= 19991006)
 	res_ninit(&resolv->res);
+#endif
 
 	return resolv;
 }
@@ -920,7 +922,9 @@ void g_resolv_unref(GResolv *resolv)
 
 	flush_nameservers(resolv);
 
+#if (__RES >= 19991006)
 	res_nclose(&resolv->res);
+#endif
 
 	g_free(resolv);
 }
@@ -1013,6 +1017,26 @@ static gint add_query(struct resolv_lookup *lookup, const char *hostname, int ty
 	return 0;
 }
 
+#if (__RES < 19991006)
+static void read_nameservers_directly(GResolv *resolv)
+{
+	FILE *f = fopen("/etc/resolv.conf", "r");
+	if (f) {
+		char line[256], *s;
+		int i;
+		while (fgets(line, sizeof(line), f)) {
+			if (strncmp(line, "nameserver", 10) || !isspace(line[10]))
+				continue;
+			for (s = &line[11]; isspace(s[0]); s++);
+			for (i = 0; s[i] && !isspace(s[i]); i++);
+			s[i] = 0;
+			g_resolv_add_nameserver(resolv, s, 53, 0);
+		}
+		fclose(f);
+	}
+}
+#endif
+
 guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
 				GResolvResultFunc func, gpointer user_data)
 {
@@ -1024,6 +1048,7 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
 	debug(resolv, "hostname %s", hostname);
 
 	if (!resolv->nameserver_list) {
+#if (__RES >= 19991006)
 		int i;
 
 		for (i = 0; i < resolv->res.nscount; i++) {
@@ -1043,6 +1068,9 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
 			if (inet_ntop(family, sa_addr, buf, sizeof(buf)))
 				g_resolv_add_nameserver(resolv, buf, 53, 0);
 		}
+#else
+		read_nameservers_directly(resolv);
+#endif
 
 		if (!resolv->nameserver_list)
 			g_resolv_add_nameserver(resolv, "127.0.0.1", 53, 0);
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.