src/jdk.dns.client/unix/native/libresolver/DnsResolverConfiguration.c
branchaefimov-dns-client-branch
changeset 58870 35c438a6d45c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.dns.client/unix/native/libresolver/DnsResolverConfiguration.c	Thu Oct 31 16:16:21 2019 +0000
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#ifdef __solaris__
+#include <sys/systeminfo.h>
+#endif
+
+#include <string.h>
+
+#include "jni.h"
+
+#ifndef MAXDNAME
+#define MAXDNAME                1025
+#endif
+
+
+/*
+ * Class:     jdk_dns_conf_ResolverConfiguration
+ * Method:    localDomain0
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_jdk_dns_conf_DnsResolverConfiguration_localDomain0(JNIEnv *env, jclass cls)
+{
+    /*
+     * On Solaris the LOCALDOMAIN environment variable has absolute
+     * priority.
+     */
+#ifdef __solaris__
+    {
+        char *cp = getenv("LOCALDOMAIN");
+        if (cp != NULL) {
+            jstring s = (*env)->NewStringUTF(env, cp);
+            return s;
+        }
+    }
+#endif
+    return (jstring)NULL;
+}
+
+/*
+ * Class:     jdk_dns_conf_DnsResolverConfiguration
+ * Method:    loadConfig0
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_jdk_dns_conf_DnsResolverConfiguration_fallbackDomain0(JNIEnv *env, jclass cls)
+{
+    char buf[MAXDNAME];
+
+    /*
+     * On Solaris if domain or search directives aren't specified
+     * in /etc/resolv.conf then sysinfo or gethostname is used to
+     * determine the domain name.
+     *
+     * On Linux if domain or search directives aren't specified
+     * then gethostname is used.
+     */
+
+#ifdef __solaris__
+    {
+        int ret = sysinfo(SI_SRPC_DOMAIN, buf, sizeof(buf));
+
+        if ((ret > 0) && (ret<sizeof(buf))) {
+            char *cp;
+            jstring s;
+
+            if (buf[0] == '+') {
+                buf[0] = '.';
+            }
+            cp = strchr(buf, '.');
+            if (cp == NULL) {
+                s = (*env)->NewStringUTF(env, buf);
+            } else {
+                s = (*env)->NewStringUTF(env, cp+1);
+            }
+            return s;
+        }
+    }
+#endif
+
+    if (gethostname(buf, sizeof(buf)) == 0) {
+        char *cp;
+
+        /* gethostname doesn't null terminate if insufficient space */
+        buf[sizeof(buf)-1] = '\0';
+
+        cp = strchr(buf, '.');
+        if (cp != NULL) {
+            jstring s = (*env)->NewStringUTF(env, cp+1);
+            return s;
+        }
+    }
+
+    return (jstring)NULL;
+}