src/jdk.dns.client/windows/native/libresolver/DnsResolverConfiguration.c
author aefimov
Thu, 14 Nov 2019 23:13:47 +0000
branchaefimov-dns-client-branch
changeset 59100 b92aac38b046
permissions -rw-r--r--
aefimov-dns-client-branch: fix windows builds
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59100
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
     1
/*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
     4
 *
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    10
 *
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    15
 * accompanied this code).
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    16
 *
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    20
 *
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    23
 * questions.
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    24
 */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    25
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    26
#include <stdlib.h>
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    27
#include <windows.h>
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    28
#include <stdio.h>
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    29
#include <stddef.h>
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    30
#include <iprtrmib.h>
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    31
#include <time.h>
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    32
#include <assert.h>
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    33
#include <iphlpapi.h>
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    34
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    35
#include "jni_util.h"
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    36
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    37
#define MAX_STR_LEN         256
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    38
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    39
#define STS_NO_CONFIG       0x0             /* no configuration found */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    40
#define STS_SL_FOUND        0x1             /* search list found */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    41
#define STS_NS_FOUND        0x2             /* name servers found */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    42
#define STS_ERROR           -1              /* error return  lodConfig failed memory allccation failure*/
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    43
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    44
#define IS_SL_FOUND(sts)    (sts & STS_SL_FOUND)
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    45
#define IS_NS_FOUND(sts)    (sts & STS_NS_FOUND)
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    46
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    47
/* JNI ids */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    48
static jfieldID searchlistID;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    49
static jfieldID nameserversID;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    50
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    51
/*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    52
 * Utility routine to append s2 to s1 with a space delimiter.
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    53
 *  strappend(s1="abc", "def")  => "abc def"
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    54
 *  strappend(s1="", "def")     => "def
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    55
 */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    56
void strappend(char *s1, char *s2) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    57
    size_t len;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    58
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    59
    if (s2[0] == '\0')                      /* nothing to append */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    60
        return;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    61
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    62
    len = strlen(s1)+1;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    63
    if (s1[0] != 0)                         /* needs space character */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    64
        len++;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    65
    if (len + strlen(s2) > MAX_STR_LEN)     /* insufficient space */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    66
        return;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    67
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    68
    if (s1[0] != 0) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    69
        strcat(s1, " ");
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    70
    }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    71
    strcat(s1, s2);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    72
}
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    73
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    74
/*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    75
 * Windows 2000/XP
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    76
 *
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    77
 * Use registry approach based on settings described in Appendix C
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    78
 * of "Microsoft Windows 2000 TCP/IP Implementation Details".
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    79
 *
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    80
 * DNS suffix list is obtained from SearchList registry setting. If
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    81
 * this is not specified we compile suffix list based on the
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    82
 * per-connection domain suffix.
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    83
 *
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    84
 * DNS name servers and domain settings are on a per-connection
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    85
 * basic. We therefore enumerate the network adapters to get the
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    86
 * names of each adapter and then query the corresponding registry
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    87
 * settings to obtain NameServer/DhcpNameServer and Domain/DhcpDomain.
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    88
 */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    89
static int loadConfig(char *sl, char *ns) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    90
    IP_ADAPTER_INFO *adapterP;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    91
    ULONG size;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    92
    DWORD ret;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    93
    DWORD dwLen;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    94
    ULONG ulType;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    95
    char result[MAX_STR_LEN];
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    96
    HANDLE hKey;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    97
    int gotSearchList = 0;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    98
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
    99
    /*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   100
     * First see if there is a global suffix list specified.
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   101
     */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   102
    ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   103
                       "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters",
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   104
                       0,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   105
                       KEY_READ,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   106
                       (PHKEY)&hKey);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   107
    if (ret == ERROR_SUCCESS) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   108
        dwLen = sizeof(result);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   109
        ret = RegQueryValueEx(hKey, "SearchList", NULL, &ulType,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   110
                             (LPBYTE)&result, &dwLen);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   111
        if (ret == ERROR_SUCCESS) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   112
            assert(ulType == REG_SZ);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   113
            if (strlen(result) > 0) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   114
                strappend(sl, result);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   115
                gotSearchList = 1;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   116
            }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   117
        }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   118
        RegCloseKey(hKey);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   119
    }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   120
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   121
    /*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   122
     * Ask the IP Helper library to enumerate the adapters
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   123
     */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   124
    size = sizeof(IP_ADAPTER_INFO);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   125
    adapterP = (IP_ADAPTER_INFO *)malloc(size);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   126
    if (adapterP == NULL) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   127
        return STS_ERROR;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   128
    }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   129
    ret = GetAdaptersInfo(adapterP, &size);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   130
    if (ret == ERROR_BUFFER_OVERFLOW) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   131
        IP_ADAPTER_INFO *newAdapterP = (IP_ADAPTER_INFO *)realloc(adapterP, size);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   132
        if (newAdapterP == NULL) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   133
            free(adapterP);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   134
            return STS_ERROR;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   135
        }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   136
        adapterP = newAdapterP;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   137
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   138
        ret = GetAdaptersInfo(adapterP, &size);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   139
    }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   140
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   141
    /*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   142
     * Iterate through the list of adapters as registry settings are
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   143
     * keyed on the adapter name (GUID).
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   144
     */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   145
    if (ret == ERROR_SUCCESS) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   146
        IP_ADAPTER_INFO *curr = adapterP;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   147
        while (curr != NULL) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   148
            char key[MAX_STR_LEN];
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   149
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   150
            sprintf(key,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   151
                "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s",
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   152
                curr->AdapterName);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   153
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   154
            ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   155
                               key,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   156
                               0,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   157
                               KEY_READ,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   158
                               (PHKEY)&hKey);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   159
            if (ret == ERROR_SUCCESS) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   160
                DWORD enableDhcp = 0;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   161
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   162
                /*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   163
                 * Is DHCP enabled on this interface
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   164
                 */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   165
                dwLen = sizeof(enableDhcp);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   166
                ret = RegQueryValueEx(hKey, "EnableDhcp", NULL, &ulType,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   167
                                     (LPBYTE)&enableDhcp, &dwLen);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   168
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   169
                /*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   170
                 * If we don't have the suffix list when get the Domain
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   171
                 * or DhcpDomain. If DHCP is enabled then Domain overides
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   172
                 * DhcpDomain
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   173
                 */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   174
                if (!gotSearchList) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   175
                    result[0] = '\0';
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   176
                    dwLen = sizeof(result);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   177
                    ret = RegQueryValueEx(hKey, "Domain", NULL, &ulType,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   178
                                         (LPBYTE)&result, &dwLen);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   179
                    if (((ret != ERROR_SUCCESS) || (strlen(result) == 0)) &&
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   180
                        enableDhcp) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   181
                        dwLen = sizeof(result);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   182
                        ret = RegQueryValueEx(hKey, "DhcpDomain", NULL, &ulType,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   183
                                              (LPBYTE)&result, &dwLen);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   184
                    }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   185
                    if (ret == ERROR_SUCCESS) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   186
                        assert(ulType == REG_SZ);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   187
                        strappend(sl, result);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   188
                    }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   189
                }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   190
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   191
                /*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   192
                 * Get DNS servers based on NameServer or DhcpNameServer
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   193
                 * registry setting. If NameServer is set then it overrides
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   194
                 * DhcpNameServer (even if DHCP is enabled).
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   195
                 */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   196
                result[0] = '\0';
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   197
                dwLen = sizeof(result);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   198
                ret = RegQueryValueEx(hKey, "NameServer", NULL, &ulType,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   199
                                     (LPBYTE)&result, &dwLen);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   200
                if (((ret != ERROR_SUCCESS) || (strlen(result) == 0)) &&
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   201
                    enableDhcp) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   202
                    dwLen = sizeof(result);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   203
                    ret = RegQueryValueEx(hKey, "DhcpNameServer", NULL, &ulType,
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   204
                                          (LPBYTE)&result, &dwLen);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   205
                }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   206
                if (ret == ERROR_SUCCESS) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   207
                    assert(ulType == REG_SZ);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   208
                    strappend(ns, result);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   209
                }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   210
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   211
                /*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   212
                 * Finished with this registry key
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   213
                 */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   214
                RegCloseKey(hKey);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   215
            }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   216
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   217
            /*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   218
             * Onto the next adapeter
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   219
             */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   220
            curr = curr->Next;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   221
        }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   222
    }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   223
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   224
    /*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   225
     * Free the adpater structure
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   226
     */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   227
    if (adapterP) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   228
        free(adapterP);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   229
    }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   230
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   231
    return STS_SL_FOUND & STS_NS_FOUND;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   232
}
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   233
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   234
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   235
/*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   236
 * Initialize JNI field IDs.
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   237
 */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   238
JNIEXPORT void JNICALL
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   239
Java_jdk_dns_conf_DnsResolverConfiguration_init0(JNIEnv *env, jclass cls)
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   240
{
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   241
    searchlistID = (*env)->GetStaticFieldID(env, cls, "os_searchlist",
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   242
                                      "Ljava/lang/String;");
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   243
    CHECK_NULL(searchlistID);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   244
    nameserversID = (*env)->GetStaticFieldID(env, cls, "os_nameservers",
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   245
                                      "Ljava/lang/String;");
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   246
}
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   247
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   248
/*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   249
 * Class:     jdk_dns_conf_DnsResolverConfguration
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   250
 * Method:    loadConfig0
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   251
 * Signature: ()V
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   252
 */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   253
JNIEXPORT void JNICALL
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   254
Java_jdk_dns_conf_DnsResolverConfiguration_loadDNSconfig0(JNIEnv *env, jclass cls)
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   255
{
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   256
    char searchlist[MAX_STR_LEN];
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   257
    char nameservers[MAX_STR_LEN];
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   258
    jstring obj;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   259
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   260
    searchlist[0] = '\0';
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   261
    nameservers[0] = '\0';
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   262
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   263
    if (loadConfig(searchlist, nameservers) != STS_ERROR) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   264
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   265
        /*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   266
         * Populate static fields in jdk.dns.conf.ResolverConfiguration
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   267
         */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   268
        obj = (*env)->NewStringUTF(env, searchlist);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   269
        CHECK_NULL(obj);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   270
        (*env)->SetStaticObjectField(env, cls, searchlistID, obj);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   271
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   272
        obj = (*env)->NewStringUTF(env, nameservers);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   273
        CHECK_NULL(obj);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   274
        (*env)->SetStaticObjectField(env, cls, nameserversID, obj);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   275
    } else {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   276
        JNU_ThrowOutOfMemoryError(env, "native memory allocation failed");
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   277
    }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   278
}
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   279
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   280
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   281
/*
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   282
 * Class:     jdk_dns_conf_DnsResolverConfiguration
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   283
 * Method:    notifyAddrChange0
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   284
 * Signature: ()I
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   285
 */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   286
JNIEXPORT jint JNICALL
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   287
Java_jdk_dns_conf_DnsResolverConfiguration_notifyAddrChange0(JNIEnv *env, jclass cls)
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   288
{
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   289
    OVERLAPPED ol;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   290
    HANDLE h;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   291
    DWORD rc, xfer;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   292
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   293
    ol.hEvent = (HANDLE)0;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   294
    rc = NotifyAddrChange(&h, &ol);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   295
    if (rc == ERROR_IO_PENDING) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   296
        rc = GetOverlappedResult(h, &ol, &xfer, TRUE);
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   297
        if (rc != 0) {
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   298
            return 0;   /* address changed */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   299
        }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   300
    }
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   301
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   302
    /* error */
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   303
    return -1;
b92aac38b046 aefimov-dns-client-branch: fix windows builds
aefimov
parents:
diff changeset
   304
}