|
|
232633 |
From a652ff67c89888a61ce3da7cc55c45fb1f63cf7f Mon Sep 17 00:00:00 2001
|
|
|
232633 |
From: Mark Reynolds <mreynolds@redhat.com>
|
|
|
232633 |
Date: Thu, 30 May 2019 16:52:58 -0400
|
|
|
232633 |
Subject: [PATCH] Ticket 49361 - Use IPv6 friendly network functions
|
|
|
232633 |
|
|
|
232633 |
Description: We use these functions that are not reliable with IPv6:
|
|
|
232633 |
|
|
|
232633 |
- gethostbyname()
|
|
|
232633 |
- inet_ntoa()
|
|
|
232633 |
- inet_aton()
|
|
|
232633 |
- inet_addr()
|
|
|
232633 |
|
|
|
232633 |
This patch replaces these calls using one of the following
|
|
|
232633 |
preferred functions:
|
|
|
232633 |
|
|
|
232633 |
- inet_ntop()
|
|
|
232633 |
- inet_pton()
|
|
|
232633 |
|
|
|
232633 |
Also fixed a few failures in the replication CI test
|
|
|
232633 |
regression_test.py as replication uses code touched by this
|
|
|
232633 |
patch.
|
|
|
232633 |
|
|
|
232633 |
ASAN approved
|
|
|
232633 |
|
|
|
232633 |
https://pagure.io/389-ds-base/issue/49361
|
|
|
232633 |
|
|
|
232633 |
Reviewed by: firstyear(Thanks!)
|
|
|
232633 |
---
|
|
|
232633 |
Makefile.am | 2 -
|
|
|
232633 |
configure.ac | 2 +-
|
|
|
232633 |
.../suites/replication/regression_test.py | 53 ++++---
|
|
|
232633 |
include/base/util.h | 3 -
|
|
|
232633 |
ldap/include/portable.h | 50 ------
|
|
|
232633 |
ldap/servers/slapd/connection.c | 70 +++++----
|
|
|
232633 |
ldap/servers/slapd/localhost.c | 61 ++++----
|
|
|
232633 |
ldap/servers/slapd/tools/ldclt/repcheck.c | 30 +++-
|
|
|
232633 |
ldap/servers/slapd/tools/ldclt/repslave.c | 25 ++-
|
|
|
232633 |
lib/base/dns.cpp | 142 ------------------
|
|
|
232633 |
lib/base/net.cpp | 66 --------
|
|
|
232633 |
11 files changed, 134 insertions(+), 370 deletions(-)
|
|
|
232633 |
delete mode 100644 lib/base/dns.cpp
|
|
|
232633 |
delete mode 100644 lib/base/net.cpp
|
|
|
232633 |
|
|
|
232633 |
diff --git a/Makefile.am b/Makefile.am
|
|
|
232633 |
index de9e0c460..c23686ea3 100644
|
|
|
232633 |
--- a/Makefile.am
|
|
|
232633 |
+++ b/Makefile.am
|
|
|
232633 |
@@ -1260,12 +1260,10 @@ libns_dshttpd_la_SOURCES = lib/libaccess/access_plhash.cpp \
|
|
|
232633 |
lib/libadmin/template.c \
|
|
|
232633 |
lib/libadmin/util.c \
|
|
|
232633 |
lib/base/crit.cpp \
|
|
|
232633 |
- lib/base/dns.cpp \
|
|
|
232633 |
lib/base/dnsdmain.cpp \
|
|
|
232633 |
lib/base/ereport.cpp \
|
|
|
232633 |
lib/base/file.cpp \
|
|
|
232633 |
lib/base/fsmutex.cpp \
|
|
|
232633 |
- lib/base/net.cpp \
|
|
|
232633 |
lib/base/nscperror.c \
|
|
|
232633 |
lib/base/plist.cpp \
|
|
|
232633 |
lib/base/pool.cpp \
|
|
|
232633 |
diff --git a/configure.ac b/configure.ac
|
|
|
232633 |
index d329e84a9..0cc36fabe 100644
|
|
|
232633 |
--- a/configure.ac
|
|
|
232633 |
+++ b/configure.ac
|
|
|
232633 |
@@ -76,7 +76,7 @@ AC_FUNC_STAT
|
|
|
232633 |
AC_FUNC_STRERROR_R
|
|
|
232633 |
AC_FUNC_STRFTIME
|
|
|
232633 |
AC_FUNC_VPRINTF
|
|
|
232633 |
-AC_CHECK_FUNCS([endpwent ftruncate getcwd gethostbyname inet_ntoa localtime_r memmove memset mkdir munmap putenv rmdir setrlimit socket strcasecmp strchr strcspn strdup strerror strncasecmp strpbrk strrchr strstr strtol tzset])
|
|
|
232633 |
+AC_CHECK_FUNCS([endpwent ftruncate getcwd getaddrinfo inet_pton inet_ntop localtime_r memmove memset mkdir munmap putenv rmdir setrlimit socket strcasecmp strchr strcspn strdup strerror strncasecmp strpbrk strrchr strstr strtol tzset])
|
|
|
232633 |
|
|
|
232633 |
# These functions are *required* without option.
|
|
|
232633 |
AC_CHECK_FUNCS([clock_gettime], [], AC_MSG_ERROR([unable to locate required symbol clock_gettime]))
|
|
|
232633 |
diff --git a/dirsrvtests/tests/suites/replication/regression_test.py b/dirsrvtests/tests/suites/replication/regression_test.py
|
|
|
232633 |
index cf34a1a6a..830ef63ab 100644
|
|
|
232633 |
--- a/dirsrvtests/tests/suites/replication/regression_test.py
|
|
|
232633 |
+++ b/dirsrvtests/tests/suites/replication/regression_test.py
|
|
|
232633 |
@@ -13,11 +13,9 @@ from lib389.idm.user import TEST_USER_PROPERTIES, UserAccounts
|
|
|
232633 |
from lib389.utils import *
|
|
|
232633 |
from lib389.topologies import topology_m2 as topo_m2, TopologyMain, topology_m3 as topo_m3, create_topology, _remove_ssca_db
|
|
|
232633 |
from lib389._constants import *
|
|
|
232633 |
-from . import get_repl_entries
|
|
|
232633 |
from lib389.idm.organizationalunit import OrganizationalUnits
|
|
|
232633 |
from lib389.agreement import Agreements
|
|
|
232633 |
from lib389.idm.user import UserAccount
|
|
|
232633 |
-from lib389 import Entry
|
|
|
232633 |
from lib389.idm.group import Groups, Group
|
|
|
232633 |
from lib389.replica import Replicas, ReplicationManager
|
|
|
232633 |
from lib389.changelog import Changelog5
|
|
|
232633 |
@@ -40,6 +38,7 @@ else:
|
|
|
232633 |
logging.getLogger(__name__).setLevel(logging.INFO)
|
|
|
232633 |
log = logging.getLogger(__name__)
|
|
|
232633 |
|
|
|
232633 |
+
|
|
|
232633 |
def find_start_location(file, no):
|
|
|
232633 |
log_pattern = re.compile("slapd_daemon - slapd started.")
|
|
|
232633 |
count = 0
|
|
|
232633 |
@@ -59,7 +58,7 @@ def find_start_location(file, no):
|
|
|
232633 |
def pattern_errorlog(file, log_pattern, start_location=0):
|
|
|
232633 |
|
|
|
232633 |
count = 0
|
|
|
232633 |
- log.debug("_pattern_errorlog: start from the beginning" )
|
|
|
232633 |
+ log.debug("_pattern_errorlog: start from the beginning")
|
|
|
232633 |
file.seek(start_location)
|
|
|
232633 |
|
|
|
232633 |
# Use a while true iteration because 'for line in file: hit a
|
|
|
232633 |
@@ -76,6 +75,7 @@ def pattern_errorlog(file, log_pattern, start_location=0):
|
|
|
232633 |
log.debug("_pattern_errorlog: complete (count=%d)" % count)
|
|
|
232633 |
return count
|
|
|
232633 |
|
|
|
232633 |
+
|
|
|
232633 |
def _move_ruv(ldif_file):
|
|
|
232633 |
""" Move RUV entry in an ldif file to the top"""
|
|
|
232633 |
|
|
|
232633 |
@@ -108,16 +108,13 @@ def topo_with_sigkill(request):
|
|
|
232633 |
subprocess.Popen(cmd, stdout=subprocess.PIPE)
|
|
|
232633 |
|
|
|
232633 |
def fin():
|
|
|
232633 |
+ # Kill the hanging process at the end of test to prevent failures in the following tests
|
|
|
232633 |
if DEBUGGING:
|
|
|
232633 |
- # Kill the hanging process at the end of test to prevent failures in the following tests
|
|
|
232633 |
[_kill_ns_slapd(inst) for inst in topology]
|
|
|
232633 |
- #[inst.stop() for inst in topology]
|
|
|
232633 |
else:
|
|
|
232633 |
- # Kill the hanging process at the end of test to prevent failures in the following tests
|
|
|
232633 |
[_kill_ns_slapd(inst) for inst in topology]
|
|
|
232633 |
assert _remove_ssca_db(topology)
|
|
|
232633 |
[inst.delete() for inst in topology if inst.exists()]
|
|
|
232633 |
-
|
|
|
232633 |
request.addfinalizer(fin)
|
|
|
232633 |
|
|
|
232633 |
return topology
|
|
|
232633 |
@@ -167,6 +164,7 @@ def test_double_delete(topo_m2, create_entry):
|
|
|
232633 |
repl.test_replication(m1, m2)
|
|
|
232633 |
repl.test_replication(m2, m1)
|
|
|
232633 |
|
|
|
232633 |
+
|
|
|
232633 |
@pytest.mark.bz1506831
|
|
|
232633 |
def test_repl_modrdn(topo_m2):
|
|
|
232633 |
"""Test that replicated MODRDN does not break replication
|
|
|
232633 |
@@ -228,10 +226,10 @@ def test_repl_modrdn(topo_m2):
|
|
|
232633 |
topo_m2.pause_all_replicas()
|
|
|
232633 |
|
|
|
232633 |
log.info("Apply modrdn to M1 - move test user from OU A -> C")
|
|
|
232633 |
- master1.rename_s(tuser_A.dn,'uid=testuser1',newsuperior=OU_C.dn,delold=1)
|
|
|
232633 |
+ master1.rename_s(tuser_A.dn, 'uid=testuser1', newsuperior=OU_C.dn, delold=1)
|
|
|
232633 |
|
|
|
232633 |
log.info("Apply modrdn on M2 - move test user from OU B -> C")
|
|
|
232633 |
- master2.rename_s(tuser_B.dn,'uid=testuser1',newsuperior=OU_C.dn,delold=1)
|
|
|
232633 |
+ master2.rename_s(tuser_B.dn, 'uid=testuser1', newsuperior=OU_C.dn, delold=1)
|
|
|
232633 |
|
|
|
232633 |
log.info("Start Replication")
|
|
|
232633 |
topo_m2.resume_all_replicas()
|
|
|
232633 |
@@ -252,7 +250,6 @@ def test_repl_modrdn(topo_m2):
|
|
|
232633 |
repl.test_replication(master2, master1)
|
|
|
232633 |
|
|
|
232633 |
|
|
|
232633 |
-
|
|
|
232633 |
def test_password_repl_error(topo_m2, create_entry):
|
|
|
232633 |
"""Check that error about userpassword replication is properly logged
|
|
|
232633 |
|
|
|
232633 |
@@ -329,7 +326,7 @@ def test_invalid_agmt(topo_m2):
|
|
|
232633 |
'cn': 'whatever',
|
|
|
232633 |
'nsDS5ReplicaRoot': DEFAULT_SUFFIX,
|
|
|
232633 |
'nsDS5ReplicaBindDN': 'cn=replication manager,cn=config',
|
|
|
232633 |
- 'nsDS5ReplicaBindMethod': 'simple' ,
|
|
|
232633 |
+ 'nsDS5ReplicaBindMethod': 'simple',
|
|
|
232633 |
'nsDS5ReplicaTransportInfo': 'LDAP',
|
|
|
232633 |
'nsds5replicaTimeout': '5',
|
|
|
232633 |
'description': "test agreement",
|
|
|
232633 |
@@ -344,6 +341,7 @@ def test_invalid_agmt(topo_m2):
|
|
|
232633 |
repl.test_replication(m1, m2)
|
|
|
232633 |
repl.test_replication(m2, m1)
|
|
|
232633 |
|
|
|
232633 |
+
|
|
|
232633 |
def test_fetch_bindDnGroup(topo_m2):
|
|
|
232633 |
"""Check the bindDNGroup is fetched on first replication session
|
|
|
232633 |
|
|
|
232633 |
@@ -380,13 +378,13 @@ def test_fetch_bindDnGroup(topo_m2):
|
|
|
232633 |
M2 = topo_m2.ms['master2']
|
|
|
232633 |
|
|
|
232633 |
# Enable replication log level. Not really necessary
|
|
|
232633 |
- M1.modify_s('cn=config',[(ldap.MOD_REPLACE, 'nsslapd-errorlog-level', b'8192')])
|
|
|
232633 |
- M2.modify_s('cn=config',[(ldap.MOD_REPLACE, 'nsslapd-errorlog-level', b'8192')])
|
|
|
232633 |
+ M1.modify_s('cn=config', [(ldap.MOD_REPLACE, 'nsslapd-errorlog-level', b'8192')])
|
|
|
232633 |
+ M2.modify_s('cn=config', [(ldap.MOD_REPLACE, 'nsslapd-errorlog-level', b'8192')])
|
|
|
232633 |
|
|
|
232633 |
# Create a group and a user
|
|
|
232633 |
PEOPLE = "ou=People,%s" % SUFFIX
|
|
|
232633 |
PASSWD = 'password'
|
|
|
232633 |
- REPL_MGR_BOUND_DN='repl_mgr_bound_dn'
|
|
|
232633 |
+ REPL_MGR_BOUND_DN = 'repl_mgr_bound_dn'
|
|
|
232633 |
|
|
|
232633 |
uid = REPL_MGR_BOUND_DN.encode()
|
|
|
232633 |
users = UserAccounts(M1, PEOPLE, rdn=None)
|
|
|
232633 |
@@ -396,14 +394,12 @@ def test_fetch_bindDnGroup(topo_m2):
|
|
|
232633 |
|
|
|
232633 |
groups_M1 = Groups(M1, DEFAULT_SUFFIX)
|
|
|
232633 |
group_properties = {
|
|
|
232633 |
- 'cn' : 'group1',
|
|
|
232633 |
- 'description' : 'testgroup'}
|
|
|
232633 |
+ 'cn': 'group1',
|
|
|
232633 |
+ 'description': 'testgroup'}
|
|
|
232633 |
group_M1 = groups_M1.create(properties=group_properties)
|
|
|
232633 |
group_M2 = Group(M2, group_M1.dn)
|
|
|
232633 |
assert(not group_M1.is_member(create_user.dn))
|
|
|
232633 |
|
|
|
232633 |
-
|
|
|
232633 |
-
|
|
|
232633 |
# Check that M1 and M2 are in sync
|
|
|
232633 |
repl = ReplicationManager(DEFAULT_SUFFIX)
|
|
|
232633 |
repl.wait_for_replication(M1, M2, timeout=20)
|
|
|
232633 |
@@ -414,13 +410,11 @@ def test_fetch_bindDnGroup(topo_m2):
|
|
|
232633 |
replica.apply_mods([(ldap.MOD_REPLACE, 'nsDS5ReplicaBindDnGroupCheckInterval', '60'),
|
|
|
232633 |
(ldap.MOD_REPLACE, 'nsDS5ReplicaBindDnGroup', group_M1.dn)])
|
|
|
232633 |
|
|
|
232633 |
-
|
|
|
232633 |
replicas = Replicas(M2)
|
|
|
232633 |
replica = replicas.list()[0]
|
|
|
232633 |
replica.apply_mods([(ldap.MOD_REPLACE, 'nsDS5ReplicaBindDnGroupCheckInterval', '60'),
|
|
|
232633 |
(ldap.MOD_REPLACE, 'nsDS5ReplicaBindDnGroup', group_M1.dn)])
|
|
|
232633 |
|
|
|
232633 |
-
|
|
|
232633 |
# Then pause the replication agreement to prevent them trying to acquire
|
|
|
232633 |
# while the user is not member of the group
|
|
|
232633 |
topo_m2.pause_all_replicas()
|
|
|
232633 |
@@ -432,7 +426,6 @@ def test_fetch_bindDnGroup(topo_m2):
|
|
|
232633 |
agmt.replace('nsDS5ReplicaBindDN', create_user.dn.encode())
|
|
|
232633 |
agmt.replace('nsds5ReplicaCredentials', PASSWD.encode())
|
|
|
232633 |
|
|
|
232633 |
-
|
|
|
232633 |
# Key step
|
|
|
232633 |
# The restart will fetch the group/members define in the replica
|
|
|
232633 |
#
|
|
|
232633 |
@@ -451,8 +444,8 @@ def test_fetch_bindDnGroup(topo_m2):
|
|
|
232633 |
topo_m2.resume_all_replicas()
|
|
|
232633 |
|
|
|
232633 |
# trigger updates to be sure to have a replication session, giving some time
|
|
|
232633 |
- M1.modify_s(create_user.dn,[(ldap.MOD_ADD, 'description', b'value_1_1')])
|
|
|
232633 |
- M2.modify_s(create_user.dn,[(ldap.MOD_ADD, 'description', b'value_2_2')])
|
|
|
232633 |
+ M1.modify_s(create_user.dn, [(ldap.MOD_ADD, 'description', b'value_1_1')])
|
|
|
232633 |
+ M2.modify_s(create_user.dn, [(ldap.MOD_ADD, 'description', b'value_2_2')])
|
|
|
232633 |
time.sleep(10)
|
|
|
232633 |
|
|
|
232633 |
# Check replication is working
|
|
|
232633 |
@@ -494,12 +487,13 @@ def test_fetch_bindDnGroup(topo_m2):
|
|
|
232633 |
count = pattern_errorlog(errorlog_M1, regex, start_location=restart_location_M1)
|
|
|
232633 |
assert(count <= 1)
|
|
|
232633 |
count = pattern_errorlog(errorlog_M2, regex, start_location=restart_location_M2)
|
|
|
232633 |
- assert(count <=1)
|
|
|
232633 |
+ assert(count <= 1)
|
|
|
232633 |
|
|
|
232633 |
if DEBUGGING:
|
|
|
232633 |
# Add debugging steps(if any)...
|
|
|
232633 |
pass
|
|
|
232633 |
|
|
|
232633 |
+
|
|
|
232633 |
def test_cleanallruv_repl(topo_m3):
|
|
|
232633 |
"""Test that cleanallruv could not break replication if anchor csn in ruv originated in deleted replica
|
|
|
232633 |
:id: 46faba9a-897e-45b8-98dc-aec7fa8cec9a
|
|
|
232633 |
@@ -546,7 +540,7 @@ def test_cleanallruv_repl(topo_m3):
|
|
|
232633 |
user_props = TEST_USER_PROPERTIES.copy()
|
|
|
232633 |
|
|
|
232633 |
user_props.update({'uid': "testuser10"})
|
|
|
232633 |
- user10 = users_m1.create(properties=user_props)
|
|
|
232633 |
+ user10 = users_m1.create(properties=user_props)
|
|
|
232633 |
|
|
|
232633 |
user_props.update({'uid': "testuser20"})
|
|
|
232633 |
user20 = users_m2.create(properties=user_props)
|
|
|
232633 |
@@ -587,7 +581,7 @@ def test_cleanallruv_repl(topo_m3):
|
|
|
232633 |
# ClearRuv is launched but with Force
|
|
|
232633 |
M3.stop()
|
|
|
232633 |
M1.tasks.cleanAllRUV(suffix=SUFFIX, replicaid='3',
|
|
|
232633 |
- force=True,args={TASK_WAIT: False})
|
|
|
232633 |
+ force=True, args={TASK_WAIT: False})
|
|
|
232633 |
|
|
|
232633 |
# here M1 should clear 31
|
|
|
232633 |
M2.start()
|
|
|
232633 |
@@ -595,11 +589,16 @@ def test_cleanallruv_repl(topo_m3):
|
|
|
232633 |
M1.agreement.resume(m1_m2[0].dn)
|
|
|
232633 |
time.sleep(10)
|
|
|
232633 |
|
|
|
232633 |
- #Check the users after CleanRUV
|
|
|
232633 |
+ # Check the users after CleanRUV
|
|
|
232633 |
expected_m1_users = [user31.dn, user11.dn, user21.dn, user32.dn, user33.dn, user12.dn]
|
|
|
232633 |
+ expected_m1_users = [x.lower() for x in expected_m1_users]
|
|
|
232633 |
expected_m2_users = [user31.dn, user11.dn, user21.dn, user12.dn]
|
|
|
232633 |
+ expected_m2_users = [x.lower() for x in expected_m2_users]
|
|
|
232633 |
+
|
|
|
232633 |
current_m1_users = [user.dn for user in users_m1.list()]
|
|
|
232633 |
+ current_m1_users = [x.lower() for x in current_m1_users]
|
|
|
232633 |
current_m2_users = [user.dn for user in users_m2.list()]
|
|
|
232633 |
+ current_m2_users = [x.lower() for x in current_m2_users]
|
|
|
232633 |
|
|
|
232633 |
assert set(expected_m1_users).issubset(current_m1_users)
|
|
|
232633 |
assert set(expected_m2_users).issubset(current_m2_users)
|
|
|
232633 |
diff --git a/include/base/util.h b/include/base/util.h
|
|
|
232633 |
index 94506d5e0..8ad5ddfbb 100644
|
|
|
232633 |
--- a/include/base/util.h
|
|
|
232633 |
+++ b/include/base/util.h
|
|
|
232633 |
@@ -36,8 +36,6 @@
|
|
|
232633 |
|
|
|
232633 |
NSPR_BEGIN_EXTERN_C
|
|
|
232633 |
|
|
|
232633 |
-NSAPI_PUBLIC char *INTutil_hostname(void);
|
|
|
232633 |
-
|
|
|
232633 |
NSAPI_PUBLIC int INTutil_itoa(int i, char *a);
|
|
|
232633 |
|
|
|
232633 |
NSAPI_PUBLIC
|
|
|
232633 |
@@ -75,7 +73,6 @@ NSAPI_PUBLIC int INTutil_strncasecmp(CASECMPARG_T char *one, CASECMPARG_T char *
|
|
|
232633 |
|
|
|
232633 |
NSPR_END_EXTERN_C
|
|
|
232633 |
|
|
|
232633 |
-#define util_hostname INTutil_hostname
|
|
|
232633 |
#define util_itoa INTutil_itoa
|
|
|
232633 |
#define util_vsprintf INTutil_vsprintf
|
|
|
232633 |
#define util_sprintf INTutil_sprintf
|
|
|
232633 |
diff --git a/ldap/include/portable.h b/ldap/include/portable.h
|
|
|
232633 |
index 63cc4d461..fddc9c80e 100644
|
|
|
232633 |
--- a/ldap/include/portable.h
|
|
|
232633 |
+++ b/ldap/include/portable.h
|
|
|
232633 |
@@ -241,30 +241,9 @@ int strncasecmp(const char *, const char *, size_t);
|
|
|
232633 |
#endif /* SNI || LINUX1_2 */
|
|
|
232633 |
|
|
|
232633 |
#if defined(_WINDOWS) || defined(macintosh)
|
|
|
232633 |
-#define GETHOSTBYNAME(n, r, b, l, e) gethostbyname(n)
|
|
|
232633 |
#define CTIME(c, b, l) ctime(c)
|
|
|
232633 |
#define STRTOK(s1, s2, l) strtok(s1, s2)
|
|
|
232633 |
#else /* UNIX */
|
|
|
232633 |
-#if defined(sgi) || defined(HPUX9) || defined(LINUX1_2) || defined(SCOOS) || \
|
|
|
232633 |
- defined(UNIXWARE) || defined(SUNOS4) || defined(SNI) || defined(BSDI) || \
|
|
|
232633 |
- defined(NCR) || defined(OSF1) || defined(NEC) || \
|
|
|
232633 |
- (defined(HPUX10) && !defined(_REENTRANT)) || defined(HPUX11) || \
|
|
|
232633 |
- defined(UnixWare) || defined(LINUX) || defined(__FreeBSD__)
|
|
|
232633 |
-#define GETHOSTBYNAME(n, r, b, l, e) gethostbyname(n)
|
|
|
232633 |
-#elif defined(AIX)
|
|
|
232633 |
-#define GETHOSTBYNAME_BUF_T struct hostent_data
|
|
|
232633 |
-#define GETHOSTBYNAME(n, r, b, l, e) \
|
|
|
232633 |
- (memset(&b, 0, l), gethostbyname_r(n, r, &b) ? NULL : r)
|
|
|
232633 |
-#elif defined(HPUX10)
|
|
|
232633 |
-#define GETHOSTBYNAME_BUF_T struct hostent_data
|
|
|
232633 |
-#define GETHOSTBYNAME(n, r, b, l, e) nsldapi_compat_gethostbyname_r(n, r, (char *)&b, l, e)
|
|
|
232633 |
-#else
|
|
|
232633 |
-#include <stdio.h> /* BUFSIZ */
|
|
|
232633 |
-typedef char GETHOSTBYNAME_buf_t[BUFSIZ /* XXX might be too small */];
|
|
|
232633 |
-#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
|
|
|
232633 |
-#define GETHOSTBYNAME(n, r, b, l, e) gethostbyname_r(n, r, b, l, e)
|
|
|
232633 |
-#endif
|
|
|
232633 |
-
|
|
|
232633 |
/*
|
|
|
232633 |
* XXXmcs: GETHOSTBYADDR() is only defined for IRIX/SGI and Solaris for now.
|
|
|
232633 |
*/
|
|
|
232633 |
@@ -319,35 +298,6 @@ extern char *strdup();
|
|
|
232633 |
#include <arpa/inet.h> /* for inet_addr() */
|
|
|
232633 |
#endif /* SOLARIS */
|
|
|
232633 |
|
|
|
232633 |
-#ifdef SUNOS4
|
|
|
232633 |
-#include <pcfs/pc_dir.h> /* for toupper() */
|
|
|
232633 |
-int fprintf(FILE *, char *, ...);
|
|
|
232633 |
-int fseek(FILE *, long, int);
|
|
|
232633 |
-int fread(char *, int, int, FILE *);
|
|
|
232633 |
-int fclose(FILE *);
|
|
|
232633 |
-int fflush(FILE *);
|
|
|
232633 |
-int rewind(FILE *);
|
|
|
232633 |
-void *memmove(void *, const void *, size_t);
|
|
|
232633 |
-int strcasecmp(char *, char *);
|
|
|
232633 |
-int strncasecmp(char *, char *, int);
|
|
|
232633 |
-time_t time(time_t *);
|
|
|
232633 |
-void perror(char *);
|
|
|
232633 |
-int fputc(char, FILE *);
|
|
|
232633 |
-int fputs(char *, FILE *);
|
|
|
232633 |
-int LDAP_CALL re_exec(char *);
|
|
|
232633 |
-int socket(int, int, int);
|
|
|
232633 |
-void bzero(char *, int);
|
|
|
232633 |
-unsigned long inet_addr(char *);
|
|
|
232633 |
-char *inet_ntoa(struct in_addr);
|
|
|
232633 |
-int getdtablesize();
|
|
|
232633 |
-int connect(int, struct sockaddr *, int);
|
|
|
232633 |
-#endif /* SUNOS4 */
|
|
|
232633 |
-
|
|
|
232633 |
-/* #if defined(SUNOS4) || defined(SNI) */
|
|
|
232633 |
-#if defined(SUNOS4)
|
|
|
232633 |
-int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
|
|
|
232633 |
-#endif /* SUNOS4 || SNI */
|
|
|
232633 |
-
|
|
|
232633 |
/*
|
|
|
232633 |
* SAFEMEMCPY is an overlap-safe copy from s to d of n bytes
|
|
|
232633 |
*/
|
|
|
232633 |
diff --git a/ldap/servers/slapd/connection.c b/ldap/servers/slapd/connection.c
|
|
|
232633 |
index 1dc53434c..4a611e7f4 100644
|
|
|
232633 |
--- a/ldap/servers/slapd/connection.c
|
|
|
232633 |
+++ b/ldap/servers/slapd/connection.c
|
|
|
232633 |
@@ -244,6 +244,28 @@ connection_cleanup(Connection *conn)
|
|
|
232633 |
conn->c_ns_close_jobs = 0;
|
|
|
232633 |
}
|
|
|
232633 |
|
|
|
232633 |
+static char *
|
|
|
232633 |
+get_ip_str(struct sockaddr *addr, char *str)
|
|
|
232633 |
+{
|
|
|
232633 |
+ switch(addr->sa_family) {
|
|
|
232633 |
+ case AF_INET:
|
|
|
232633 |
+ if (sizeof(str) < INET_ADDRSTRLEN) {
|
|
|
232633 |
+ break;
|
|
|
232633 |
+ }
|
|
|
232633 |
+ inet_ntop(AF_INET, &(((struct sockaddr_in *)addr)->sin_addr), str, INET_ADDRSTRLEN);
|
|
|
232633 |
+ break;
|
|
|
232633 |
+
|
|
|
232633 |
+ case AF_INET6:
|
|
|
232633 |
+ if (sizeof(str) < INET6_ADDRSTRLEN) {
|
|
|
232633 |
+ break;
|
|
|
232633 |
+ }
|
|
|
232633 |
+ inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)addr)->sin6_addr), str, INET6_ADDRSTRLEN);
|
|
|
232633 |
+ break;
|
|
|
232633 |
+ }
|
|
|
232633 |
+
|
|
|
232633 |
+ return str;
|
|
|
232633 |
+}
|
|
|
232633 |
+
|
|
|
232633 |
/*
|
|
|
232633 |
* Callers of connection_reset() must hold the conn->c_mutex lock.
|
|
|
232633 |
*/
|
|
|
232633 |
@@ -252,7 +274,8 @@ connection_reset(Connection *conn, int ns, PRNetAddr *from, int fromLen __attrib
|
|
|
232633 |
{
|
|
|
232633 |
char *pTmp = is_SSL ? "SSL " : "";
|
|
|
232633 |
char *str_ip = NULL, *str_destip;
|
|
|
232633 |
- char buf_ip[256], buf_destip[256];
|
|
|
232633 |
+ char buf_ip[INET6_ADDRSTRLEN + 1] = {0};
|
|
|
232633 |
+ char buf_destip[INET6_ADDRSTRLEN + 1] = {0};
|
|
|
232633 |
char *str_unknown = "unknown";
|
|
|
232633 |
int in_referral_mode = config_check_referral_mode();
|
|
|
232633 |
|
|
|
232633 |
@@ -288,10 +311,10 @@ connection_reset(Connection *conn, int ns, PRNetAddr *from, int fromLen __attrib
|
|
|
232633 |
(from->ipv6.ip.pr_s6_addr32[1] != 0) ||
|
|
|
232633 |
(from->ipv6.ip.pr_s6_addr32[2] != 0) ||
|
|
|
232633 |
(from->ipv6.ip.pr_s6_addr32[3] != 0)) ||
|
|
|
232633 |
- ((conn->c_prfd != NULL) && (PR_GetPeerName(conn->c_prfd, from) == 0))) {
|
|
|
232633 |
+ ((conn->c_prfd != NULL) && (PR_GetPeerName(conn->c_prfd, from) == 0)))
|
|
|
232633 |
+ {
|
|
|
232633 |
conn->cin_addr = (PRNetAddr *)slapi_ch_malloc(sizeof(PRNetAddr));
|
|
|
232633 |
memcpy(conn->cin_addr, from, sizeof(PRNetAddr));
|
|
|
232633 |
-
|
|
|
232633 |
if (PR_IsNetAddrType(conn->cin_addr, PR_IpAddrV4Mapped)) {
|
|
|
232633 |
PRNetAddr v4addr = {{0}};
|
|
|
232633 |
v4addr.inet.family = PR_AF_INET;
|
|
|
232633 |
@@ -305,7 +328,7 @@ connection_reset(Connection *conn, int ns, PRNetAddr *from, int fromLen __attrib
|
|
|
232633 |
} else {
|
|
|
232633 |
/* try syscall since "from" was not given and PR_GetPeerName failed */
|
|
|
232633 |
/* a corner case */
|
|
|
232633 |
- struct sockaddr_in addr = {0}; /* assuming IPv4 */
|
|
|
232633 |
+ struct sockaddr addr = {0};
|
|
|
232633 |
#if (defined(hpux))
|
|
|
232633 |
int addrlen;
|
|
|
232633 |
#else
|
|
|
232633 |
@@ -315,23 +338,15 @@ connection_reset(Connection *conn, int ns, PRNetAddr *from, int fromLen __attrib
|
|
|
232633 |
addrlen = sizeof(addr);
|
|
|
232633 |
|
|
|
232633 |
if ((conn->c_prfd == NULL) &&
|
|
|
232633 |
- (getpeername(conn->c_sd, (struct sockaddr *)&addr, &addrlen) == 0)) {
|
|
|
232633 |
+ (getpeername(conn->c_sd, (struct sockaddr *)&addr, &addrlen) == 0))
|
|
|
232633 |
+ {
|
|
|
232633 |
conn->cin_addr = (PRNetAddr *)slapi_ch_malloc(sizeof(PRNetAddr));
|
|
|
232633 |
memset(conn->cin_addr, 0, sizeof(PRNetAddr));
|
|
|
232633 |
PR_NetAddrFamily(conn->cin_addr) = AF_INET6;
|
|
|
232633 |
/* note: IPv4-mapped IPv6 addr does not work on Windows */
|
|
|
232633 |
- PR_ConvertIPv4AddrToIPv6(addr.sin_addr.s_addr, &(conn->cin_addr->ipv6.ip));
|
|
|
232633 |
- PRLDAP_SET_PORT(conn->cin_addr, addr.sin_port);
|
|
|
232633 |
-
|
|
|
232633 |
- /* copy string equivalent of address into a buffer to use for
|
|
|
232633 |
- * logging since each call to inet_ntoa() returns a pointer to a
|
|
|
232633 |
- * single thread-specific buffer (which prevents us from calling
|
|
|
232633 |
- * inet_ntoa() twice in one call to slapi_log_access()).
|
|
|
232633 |
- */
|
|
|
232633 |
- str_ip = inet_ntoa(addr.sin_addr);
|
|
|
232633 |
- strncpy(buf_ip, str_ip, sizeof(buf_ip) - 1);
|
|
|
232633 |
- buf_ip[sizeof(buf_ip) - 1] = '\0';
|
|
|
232633 |
- str_ip = buf_ip;
|
|
|
232633 |
+ PR_ConvertIPv4AddrToIPv6(((struct sockaddr_in *)&addr)->sin_addr.s_addr, &(conn->cin_addr->ipv6.ip));
|
|
|
232633 |
+ PRLDAP_SET_PORT(conn->cin_addr, ((struct sockaddr_in *)&addr)->sin_port);
|
|
|
232633 |
+ str_ip = get_ip_str(&addr, buf_ip);
|
|
|
232633 |
} else {
|
|
|
232633 |
str_ip = str_unknown;
|
|
|
232633 |
}
|
|
|
232633 |
@@ -367,38 +382,27 @@ connection_reset(Connection *conn, int ns, PRNetAddr *from, int fromLen __attrib
|
|
|
232633 |
} else {
|
|
|
232633 |
/* try syscall since c_prfd == NULL */
|
|
|
232633 |
/* a corner case */
|
|
|
232633 |
- struct sockaddr_in destaddr = {0}; /* assuming IPv4 */
|
|
|
232633 |
+ struct sockaddr destaddr = {0}; /* assuming IPv4 */
|
|
|
232633 |
#if (defined(hpux))
|
|
|
232633 |
int destaddrlen;
|
|
|
232633 |
#else
|
|
|
232633 |
socklen_t destaddrlen;
|
|
|
232633 |
#endif
|
|
|
232633 |
-
|
|
|
232633 |
destaddrlen = sizeof(destaddr);
|
|
|
232633 |
|
|
|
232633 |
- if ((getsockname(conn->c_sd, (struct sockaddr *)&destaddr, &destaddrlen) == 0)) {
|
|
|
232633 |
+ if ((getsockname(conn->c_sd, &destaddr, &destaddrlen) == 0)) {
|
|
|
232633 |
conn->cin_destaddr = (PRNetAddr *)slapi_ch_malloc(sizeof(PRNetAddr));
|
|
|
232633 |
memset(conn->cin_destaddr, 0, sizeof(PRNetAddr));
|
|
|
232633 |
PR_NetAddrFamily(conn->cin_destaddr) = AF_INET6;
|
|
|
232633 |
- PRLDAP_SET_PORT(conn->cin_destaddr, destaddr.sin_port);
|
|
|
232633 |
+ PRLDAP_SET_PORT(conn->cin_destaddr, ((struct sockaddr_in *)&destaddr)->sin_port);
|
|
|
232633 |
/* note: IPv4-mapped IPv6 addr does not work on Windows */
|
|
|
232633 |
- PR_ConvertIPv4AddrToIPv6(destaddr.sin_addr.s_addr, &(conn->cin_destaddr->ipv6.ip));
|
|
|
232633 |
-
|
|
|
232633 |
- /* copy string equivalent of address into a buffer to use for
|
|
|
232633 |
- * logging since each call to inet_ntoa() returns a pointer to a
|
|
|
232633 |
- * single thread-specific buffer (which prevents us from calling
|
|
|
232633 |
- * inet_ntoa() twice in one call to slapi_log_access()).
|
|
|
232633 |
- */
|
|
|
232633 |
- str_destip = inet_ntoa(destaddr.sin_addr);
|
|
|
232633 |
- strncpy(buf_destip, str_destip, sizeof(buf_destip) - 1);
|
|
|
232633 |
- buf_destip[sizeof(buf_destip) - 1] = '\0';
|
|
|
232633 |
- str_destip = buf_destip;
|
|
|
232633 |
+ PR_ConvertIPv4AddrToIPv6(((struct sockaddr_in *)&destaddr)->sin_addr.s_addr, &(conn->cin_destaddr->ipv6.ip));
|
|
|
232633 |
+ str_destip = get_ip_str(&destaddr, buf_destip);
|
|
|
232633 |
} else {
|
|
|
232633 |
str_destip = str_unknown;
|
|
|
232633 |
}
|
|
|
232633 |
}
|
|
|
232633 |
|
|
|
232633 |
-
|
|
|
232633 |
if (!in_referral_mode) {
|
|
|
232633 |
/* create a sasl connection */
|
|
|
232633 |
ids_sasl_server_new(conn);
|
|
|
232633 |
diff --git a/ldap/servers/slapd/localhost.c b/ldap/servers/slapd/localhost.c
|
|
|
232633 |
index f2aff28f4..993143cbd 100644
|
|
|
232633 |
--- a/ldap/servers/slapd/localhost.c
|
|
|
232633 |
+++ b/ldap/servers/slapd/localhost.c
|
|
|
232633 |
@@ -17,6 +17,7 @@
|
|
|
232633 |
#include <string.h>
|
|
|
232633 |
#include <sys/param.h>
|
|
|
232633 |
#include <sys/socket.h>
|
|
|
232633 |
+#include <netdb.h>
|
|
|
232633 |
#include <netinet/in.h>
|
|
|
232633 |
#include <arpa/inet.h>
|
|
|
232633 |
#include <netdb.h>
|
|
|
232633 |
@@ -45,22 +46,14 @@
|
|
|
232633 |
static char *
|
|
|
232633 |
find_localhost_DNS(void)
|
|
|
232633 |
{
|
|
|
232633 |
- /* This implementation could (and should) be entirely replaced by:
|
|
|
232633 |
- dns_ip2host ("127.0.0.1", 1); defined in ldapserver/lib/base/dns.c
|
|
|
232633 |
- */
|
|
|
232633 |
char hostname[MAXHOSTNAMELEN + 1];
|
|
|
232633 |
- struct hostent *hp;
|
|
|
232633 |
-#ifdef GETHOSTBYNAME_BUF_T
|
|
|
232633 |
- struct hostent hent;
|
|
|
232633 |
- GETHOSTBYNAME_BUF_T hbuf;
|
|
|
232633 |
- int err;
|
|
|
232633 |
-#endif
|
|
|
232633 |
- char **alias;
|
|
|
232633 |
FILE *f;
|
|
|
232633 |
char *cp;
|
|
|
232633 |
char *domain;
|
|
|
232633 |
char line[MAXHOSTNAMELEN + 8];
|
|
|
232633 |
-
|
|
|
232633 |
+ int gai_result;
|
|
|
232633 |
+ struct addrinfo hints = {0};
|
|
|
232633 |
+ struct addrinfo *info = NULL, *p = NULL;
|
|
|
232633 |
if (gethostname(hostname, MAXHOSTNAMELEN)) {
|
|
|
232633 |
int oserr = errno;
|
|
|
232633 |
|
|
|
232633 |
@@ -69,32 +62,34 @@ find_localhost_DNS(void)
|
|
|
232633 |
oserr, slapd_system_strerror(oserr));
|
|
|
232633 |
return NULL;
|
|
|
232633 |
}
|
|
|
232633 |
- hp = GETHOSTBYNAME(hostname, &hent, hbuf, sizeof(hbuf), &err;;
|
|
|
232633 |
- if (hp == NULL) {
|
|
|
232633 |
- int oserr = errno;
|
|
|
232633 |
|
|
|
232633 |
- slapi_log_err(SLAPI_LOG_ERR,
|
|
|
232633 |
- "find_localhost_DNS - gethostbyname(\"%s\") failed, error %d (%s)\n",
|
|
|
232633 |
- hostname, oserr, slapd_system_strerror(oserr));
|
|
|
232633 |
- return NULL;
|
|
|
232633 |
- }
|
|
|
232633 |
- if (hp->h_name == NULL) {
|
|
|
232633 |
+ hints.ai_family = AF_UNSPEC;
|
|
|
232633 |
+ hints.ai_socktype = SOCK_STREAM;
|
|
|
232633 |
+ hints.ai_flags = AI_CANONNAME;
|
|
|
232633 |
+ if ((gai_result = getaddrinfo(hostname, NULL, &hints, &info)) != 0) {
|
|
|
232633 |
slapi_log_err(SLAPI_LOG_ERR, "find_localhost_DNS",
|
|
|
232633 |
- "gethostbyname(\"%s\")->h_name == NULL\n", hostname);
|
|
|
232633 |
+ "getaddrinfo: %s\n", gai_strerror(gai_result));
|
|
|
232633 |
return NULL;
|
|
|
232633 |
}
|
|
|
232633 |
- if (strchr(hp->h_name, '.') != NULL) {
|
|
|
232633 |
- slapi_log_err(SLAPI_LOG_CONFIG, "find_localhost_DNS", "h_name == %s\n", hp->h_name);
|
|
|
232633 |
- return slapi_ch_strdup(hp->h_name);
|
|
|
232633 |
- } else if (hp->h_aliases != NULL) {
|
|
|
232633 |
- for (alias = hp->h_aliases; *alias != NULL; ++alias) {
|
|
|
232633 |
- if (strchr(*alias, '.') != NULL &&
|
|
|
232633 |
- strncmp(*alias, hp->h_name, strlen(hp->h_name))) {
|
|
|
232633 |
- slapi_log_err(SLAPI_LOG_CONFIG, "find_localhost_DNS", "h_alias == %s\n", *alias);
|
|
|
232633 |
- return slapi_ch_strdup(*alias);
|
|
|
232633 |
- }
|
|
|
232633 |
+
|
|
|
232633 |
+ if (strchr(info->ai_canonname, '.') != NULL) {
|
|
|
232633 |
+ char *return_name = slapi_ch_strdup(info->ai_canonname);
|
|
|
232633 |
+ freeaddrinfo(info);
|
|
|
232633 |
+ slapi_log_err(SLAPI_LOG_CONFIG, "find_localhost_DNS", "initial ai_canonname == %s\n", return_name);
|
|
|
232633 |
+ return return_name;
|
|
|
232633 |
+ }
|
|
|
232633 |
+ for(p = info; p != NULL; p = p->ai_next) {
|
|
|
232633 |
+ if (strchr(p->ai_canonname, '.') != NULL &&
|
|
|
232633 |
+ strncmp(p->ai_canonname, info->ai_canonname, strlen(info->ai_canonname)))
|
|
|
232633 |
+ {
|
|
|
232633 |
+ char *return_name = slapi_ch_strdup(p->ai_canonname);
|
|
|
232633 |
+ freeaddrinfo(info);
|
|
|
232633 |
+ slapi_log_err(SLAPI_LOG_CONFIG, "find_localhost_DNS", "next ai_canonname == %s\n", return_name);
|
|
|
232633 |
+ return return_name;
|
|
|
232633 |
}
|
|
|
232633 |
}
|
|
|
232633 |
+
|
|
|
232633 |
+
|
|
|
232633 |
/* The following is copied from dns_guess_domain(),
|
|
|
232633 |
in ldapserver/lib/base/dnsdmain.c */
|
|
|
232633 |
domain = NULL;
|
|
|
232633 |
@@ -134,9 +129,10 @@ find_localhost_DNS(void)
|
|
|
232633 |
}
|
|
|
232633 |
#endif
|
|
|
232633 |
if (domain == NULL) {
|
|
|
232633 |
+ freeaddrinfo(info);
|
|
|
232633 |
return NULL;
|
|
|
232633 |
}
|
|
|
232633 |
- PL_strncpyz(hostname, hp->h_name, sizeof(hostname));
|
|
|
232633 |
+ PL_strncpyz(hostname, info->ai_canonname, sizeof(hostname));
|
|
|
232633 |
if (domain[0] == '.')
|
|
|
232633 |
++domain;
|
|
|
232633 |
if (domain[0]) {
|
|
|
232633 |
@@ -144,6 +140,7 @@ find_localhost_DNS(void)
|
|
|
232633 |
PL_strcatn(hostname, sizeof(hostname), domain);
|
|
|
232633 |
}
|
|
|
232633 |
slapi_log_err(SLAPI_LOG_CONFIG, "find_localhost_DNS", "hostname == %s\n", hostname);
|
|
|
232633 |
+ freeaddrinfo(info);
|
|
|
232633 |
return slapi_ch_strdup(hostname);
|
|
|
232633 |
}
|
|
|
232633 |
|
|
|
232633 |
diff --git a/ldap/servers/slapd/tools/ldclt/repcheck.c b/ldap/servers/slapd/tools/ldclt/repcheck.c
|
|
|
232633 |
index 4340055e5..05ea65a8b 100644
|
|
|
232633 |
--- a/ldap/servers/slapd/tools/ldclt/repcheck.c
|
|
|
232633 |
+++ b/ldap/servers/slapd/tools/ldclt/repcheck.c
|
|
|
232633 |
@@ -19,6 +19,10 @@
|
|
|
232633 |
#include "remote.h"
|
|
|
232633 |
#include "lber.h"
|
|
|
232633 |
#include "ldap.h"
|
|
|
232633 |
+#include <sys/types.h>
|
|
|
232633 |
+#include <sys/socket.h>
|
|
|
232633 |
+#include <netdb.h>
|
|
|
232633 |
+
|
|
|
232633 |
|
|
|
232633 |
enum
|
|
|
232633 |
{
|
|
|
232633 |
@@ -90,13 +94,15 @@ send_op(char *s, int sfd)
|
|
|
232633 |
|
|
|
232633 |
main(int argc, char **argv)
|
|
|
232633 |
{
|
|
|
232633 |
- int i, port = 16000;
|
|
|
232633 |
- int sockfd;
|
|
|
232633 |
+ struct sockaddr_in srvsaddr;
|
|
|
232633 |
static char logline[512];
|
|
|
232633 |
char **tmp;
|
|
|
232633 |
- struct hostent *serveraddr;
|
|
|
232633 |
- struct sockaddr_in srvsaddr;
|
|
|
232633 |
char *p;
|
|
|
232633 |
+ struct addrinfo hints = {0};
|
|
|
232633 |
+ struct addrinfo *info = NULL;
|
|
|
232633 |
+ int gai_result = 0;
|
|
|
232633 |
+ int i, port = 16000;
|
|
|
232633 |
+ int sockfd;
|
|
|
232633 |
|
|
|
232633 |
while ((i = getopt(argc, argv, "p:")) != EOF) {
|
|
|
232633 |
switch (i) {
|
|
|
232633 |
@@ -105,15 +111,25 @@ main(int argc, char **argv)
|
|
|
232633 |
break;
|
|
|
232633 |
}
|
|
|
232633 |
}
|
|
|
232633 |
- serveraddr = gethostbyname(argv[optind]);
|
|
|
232633 |
- srvsaddr.sin_addr.s_addr = htonl(*((u_long *)(serveraddr->h_addr_list[0])));
|
|
|
232633 |
+
|
|
|
232633 |
+ hints.ai_family = AF_UNSPEC;
|
|
|
232633 |
+ hints.ai_socktype = SOCK_STREAM;
|
|
|
232633 |
+ hints.ai_flags = AI_CANONNAME;
|
|
|
232633 |
+ if ((gai_result = getaddrinfo(argv[optind], NULL, &hints, &info)) != 0) {
|
|
|
232633 |
+ slapi_log_err(SLAPI_LOG_ERR, "ldclt",
|
|
|
232633 |
+ "getaddrinfo: %s\n", gai_strerror(gai_result));
|
|
|
232633 |
+ return NULL;
|
|
|
232633 |
+ }
|
|
|
232633 |
+
|
|
|
232633 |
+ srvsaddr.sin_addr.s_addr = htonl(*((u_long *)(info->ai_addr)));
|
|
|
232633 |
srvsaddr.sin_family = AF_INET;
|
|
|
232633 |
srvsaddr.sin_port = htons(port);
|
|
|
232633 |
+ freeaddrinfo(info);
|
|
|
232633 |
maxop = npend = 0;
|
|
|
232633 |
pendops = (Optype *)malloc(sizeof(Optype) * 20);
|
|
|
232633 |
sigset(SIGPIPE, SIG_IGN);
|
|
|
232633 |
while (fgets(logline, sizeof(logline), stdin)) {
|
|
|
232633 |
- if (p = strchr(logline, '\n')) {
|
|
|
232633 |
+ if ((p = strchr(logline, '\n'))) {
|
|
|
232633 |
*p = 0;
|
|
|
232633 |
}
|
|
|
232633 |
if (!connected) {
|
|
|
232633 |
diff --git a/ldap/servers/slapd/tools/ldclt/repslave.c b/ldap/servers/slapd/tools/ldclt/repslave.c
|
|
|
232633 |
index a04a73f5c..8df2a0ace 100644
|
|
|
232633 |
--- a/ldap/servers/slapd/tools/ldclt/repslave.c
|
|
|
232633 |
+++ b/ldap/servers/slapd/tools/ldclt/repslave.c
|
|
|
232633 |
@@ -62,6 +62,9 @@ dd/mm/yy | Author | Comments
|
|
|
232633 |
#include "remote.h"
|
|
|
232633 |
#include "lber.h"
|
|
|
232633 |
#include "ldap.h"
|
|
|
232633 |
+#include <sys/types.h>
|
|
|
232633 |
+#include <sys/socket.h>
|
|
|
232633 |
+#include <netdb.h>
|
|
|
232633 |
|
|
|
232633 |
/*
|
|
|
232633 |
* Enumeration for internal list
|
|
|
232633 |
@@ -221,7 +224,8 @@ main(int argc, char **argv)
|
|
|
232633 |
int sockfd, log = 0;
|
|
|
232633 |
static char logline[512];
|
|
|
232633 |
char **tmp, *hn, *hp, *hf;
|
|
|
232633 |
- struct hostent *serveraddr;
|
|
|
232633 |
+ struct addrinfo hints = {0};
|
|
|
232633 |
+ struct addrinfo *info = NULL;
|
|
|
232633 |
|
|
|
232633 |
while ((i = getopt(argc, argv, "tdP:s:")) != EOF) {
|
|
|
232633 |
switch (i) {
|
|
|
232633 |
@@ -251,12 +255,17 @@ main(int argc, char **argv)
|
|
|
232633 |
/*
|
|
|
232633 |
* Get master address, just the first.
|
|
|
232633 |
*/
|
|
|
232633 |
- if ((serveraddr = gethostbyname(hn)) == NULL) {
|
|
|
232633 |
+
|
|
|
232633 |
+ hints.ai_family = AF_UNSPEC;
|
|
|
232633 |
+ hints.ai_socktype = SOCK_STREAM;
|
|
|
232633 |
+ hints.ai_flags = AI_CANONNAME;
|
|
|
232633 |
+ if (getaddrinfo(hn, NULL, &hints, &info) != 0) {
|
|
|
232633 |
printf("Unknown host %s\n", hn);
|
|
|
232633 |
break;
|
|
|
232633 |
}
|
|
|
232633 |
+
|
|
|
232633 |
srvlist = (Towho *)realloc(srvlist, (nsrv + 1) * sizeof(Towho));
|
|
|
232633 |
- srvlist[nsrv].addr.sin_addr.s_addr = htonl(*((u_long *)(serveraddr->h_addr_list[0])));
|
|
|
232633 |
+ srvlist[nsrv].addr.sin_addr.s_addr = htonl(*((u_long *)(info->ai_addr)));
|
|
|
232633 |
srvlist[nsrv].addr.sin_family = AF_INET;
|
|
|
232633 |
srvlist[nsrv].addr.sin_port = htonl((hp == hf ? port : atoi(hp)));
|
|
|
232633 |
if ((srvlist[nsrv].filter = regcmp(hf, NULL)) == NULL)
|
|
|
232633 |
@@ -264,6 +273,7 @@ main(int argc, char **argv)
|
|
|
232633 |
srvlist[nsrv].fd = open_cnx((struct sockaddr *)&srvlist[nsrv].addr);
|
|
|
232633 |
srvlist[nsrv].hname = strdup(hn);
|
|
|
232633 |
nsrv++;
|
|
|
232633 |
+ freeaddrinfo(info);
|
|
|
232633 |
break;
|
|
|
232633 |
}
|
|
|
232633 |
}
|
|
|
232633 |
@@ -273,18 +283,19 @@ main(int argc, char **argv)
|
|
|
232633 |
printf("\t-t\tprints input on stdout.\n\t-d\tdebug mode.\n");
|
|
|
232633 |
exit(1);
|
|
|
232633 |
}
|
|
|
232633 |
- srvlist = (Towho *)malloc(sizeof(Towho));
|
|
|
232633 |
- if ((serveraddr = gethostbyname(argv[optind])) == NULL) {
|
|
|
232633 |
- printf("Unknown host %s\n", argv[optind]);
|
|
|
232633 |
+ if (getaddrinfo(argv[optind], NULL, &hints, &info) != 0) {
|
|
|
232633 |
+ printf("Unknown host %s\n", hn);
|
|
|
232633 |
exit(1);
|
|
|
232633 |
}
|
|
|
232633 |
- srvlist[nsrv].addr.sin_addr.s_addr = htonl(*((u_long *)(serveraddr->h_addr_list[0])));
|
|
|
232633 |
+ srvlist = (Towho *)malloc(sizeof(Towho));
|
|
|
232633 |
+ srvlist[nsrv].addr.sin_addr.s_addr = htonl(*((u_long *)(info->ai_addr)));
|
|
|
232633 |
srvlist[nsrv].addr.sin_family = AF_INET;
|
|
|
232633 |
srvlist[nsrv].addr.sin_port = htons(port);
|
|
|
232633 |
srvlist[nsrv].filter = NULL;
|
|
|
232633 |
srvlist[nsrv].fd = open_cnx((struct sockaddr *)&srvlist[nsrv].addr);
|
|
|
232633 |
srvlist[nsrv].hname = strdup(argv[optind]);
|
|
|
232633 |
nsrv++;
|
|
|
232633 |
+ freeaddrinfo(info);
|
|
|
232633 |
}
|
|
|
232633 |
maxop = npend = 0;
|
|
|
232633 |
pendops = (Optype *)malloc(sizeof(Optype) * 20);
|
|
|
232633 |
diff --git a/lib/base/dns.cpp b/lib/base/dns.cpp
|
|
|
232633 |
deleted file mode 100644
|
|
|
232633 |
index e704094db..000000000
|
|
|
232633 |
--- a/lib/base/dns.cpp
|
|
|
232633 |
+++ /dev/null
|
|
|
232633 |
@@ -1,142 +0,0 @@
|
|
|
232633 |
-/** BEGIN COPYRIGHT BLOCK
|
|
|
232633 |
- * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
|
|
|
232633 |
- * Copyright (C) 2005 Red Hat, Inc.
|
|
|
232633 |
- * All rights reserved.
|
|
|
232633 |
- *
|
|
|
232633 |
- * License: GPL (version 3 or any later version).
|
|
|
232633 |
- * See LICENSE for details.
|
|
|
232633 |
- * END COPYRIGHT BLOCK **/
|
|
|
232633 |
-
|
|
|
232633 |
-#ifdef HAVE_CONFIG_H
|
|
|
232633 |
-# include <config.h>
|
|
|
232633 |
-#endif
|
|
|
232633 |
-
|
|
|
232633 |
-/*
|
|
|
232633 |
- * dns.c: DNS resolution routines
|
|
|
232633 |
- *
|
|
|
232633 |
- * Rob McCool
|
|
|
232633 |
- */
|
|
|
232633 |
-#define DNS_GUESSING
|
|
|
232633 |
-
|
|
|
232633 |
-#include "netsite.h"
|
|
|
232633 |
-#include "systems.h"
|
|
|
232633 |
-
|
|
|
232633 |
-/* Under NT, these are taken care of by net.h including winsock.h */
|
|
|
232633 |
-#include <arpa/inet.h> /* inet_ntoa */
|
|
|
232633 |
-#include <netdb.h> /* struct hostent */
|
|
|
232633 |
-#ifdef NEED_GHN_PROTO
|
|
|
232633 |
-extern "C" int gethostname (char *name, size_t namelen);
|
|
|
232633 |
-#endif
|
|
|
232633 |
-#include <stdio.h>
|
|
|
232633 |
-#include <nspr.h>
|
|
|
232633 |
-
|
|
|
232633 |
-/* ---------------------------- dns_find_fqdn ----------------------------- */
|
|
|
232633 |
-
|
|
|
232633 |
-
|
|
|
232633 |
-/* defined in dnsdmain.c */
|
|
|
232633 |
-extern "C" NSAPI_PUBLIC char *dns_guess_domain(char * hname);
|
|
|
232633 |
-
|
|
|
232633 |
-char *net_find_fqdn(PRHostEnt *p)
|
|
|
232633 |
-{
|
|
|
232633 |
- int x;
|
|
|
232633 |
-
|
|
|
232633 |
- if((!p->h_name) || (!p->h_aliases))
|
|
|
232633 |
- return NULL;
|
|
|
232633 |
-
|
|
|
232633 |
- if(!strchr(p->h_name, '.')) {
|
|
|
232633 |
- for(x = 0; p->h_aliases[x]; ++x) {
|
|
|
232633 |
- if((strchr(p->h_aliases[x], '.')) &&
|
|
|
232633 |
- (!strncmp(p->h_aliases[x], p->h_name, strlen(p->h_name))))
|
|
|
232633 |
- {
|
|
|
232633 |
- return STRDUP(p->h_aliases[x]);
|
|
|
232633 |
- }
|
|
|
232633 |
- }
|
|
|
232633 |
-#ifdef DNS_GUESSING
|
|
|
232633 |
- return dns_guess_domain(p->h_name);
|
|
|
232633 |
-#else
|
|
|
232633 |
- return NULL;
|
|
|
232633 |
-#endif /* DNS_GUESSING */
|
|
|
232633 |
- }
|
|
|
232633 |
- else
|
|
|
232633 |
- return STRDUP(p->h_name);
|
|
|
232633 |
-}
|
|
|
232633 |
-
|
|
|
232633 |
-
|
|
|
232633 |
-/* ----------------------------- dns_ip2host ------------------------------ */
|
|
|
232633 |
-
|
|
|
232633 |
-
|
|
|
232633 |
-char *dns_ip2host(char *ip, int verify)
|
|
|
232633 |
-{
|
|
|
232633 |
- /* struct in_addr iaddr; */
|
|
|
232633 |
- PRNetAddr iaddr;
|
|
|
232633 |
- char *hn;
|
|
|
232633 |
- static unsigned long laddr = 0;
|
|
|
232633 |
- static char myhostname[256];
|
|
|
232633 |
- PRHostEnt hent;
|
|
|
232633 |
- char buf[PR_NETDB_BUF_SIZE];
|
|
|
232633 |
- PRStatus err;
|
|
|
232633 |
-
|
|
|
232633 |
-
|
|
|
232633 |
- err = PR_InitializeNetAddr(PR_IpAddrNull, 0, &iaddr);
|
|
|
232633 |
-
|
|
|
232633 |
- /* richm: ipv6 cleanup - use inet_aton or other more appropriate function
|
|
|
232633 |
- instead of inet_addr */
|
|
|
232633 |
- if((iaddr.inet.ip = inet_addr(ip)) == (in_addr_t)-1)
|
|
|
232633 |
- goto bong;
|
|
|
232633 |
-
|
|
|
232633 |
- /*
|
|
|
232633 |
- * See if it happens to be the localhost IP address, and try
|
|
|
232633 |
- * the local host name if so.
|
|
|
232633 |
- */
|
|
|
232633 |
- if (laddr == 0) {
|
|
|
232633 |
- laddr = inet_addr("127.0.0.1");
|
|
|
232633 |
- myhostname[0] = 0;
|
|
|
232633 |
- PR_GetSystemInfo(PR_SI_HOSTNAME, myhostname, sizeof(myhostname));
|
|
|
232633 |
- }
|
|
|
232633 |
-
|
|
|
232633 |
- /* Have to match the localhost IP address and have a hostname */
|
|
|
232633 |
- if ((iaddr.inet.ip == laddr) && (myhostname[0] != 0)) {
|
|
|
232633 |
- /*
|
|
|
232633 |
- * Now try for a fully-qualified domain name, starting with
|
|
|
232633 |
- * the local hostname.
|
|
|
232633 |
- */
|
|
|
232633 |
- err = PR_GetHostByName(myhostname,
|
|
|
232633 |
- buf,
|
|
|
232633 |
- PR_NETDB_BUF_SIZE,
|
|
|
232633 |
- &hent);
|
|
|
232633 |
-
|
|
|
232633 |
- /* Don't verify if we get a fully-qualified name this way */
|
|
|
232633 |
- verify = 0;
|
|
|
232633 |
- }
|
|
|
232633 |
- else {
|
|
|
232633 |
- err = PR_GetHostByAddr(&iaddr,
|
|
|
232633 |
- buf,
|
|
|
232633 |
- PR_NETDB_BUF_SIZE,
|
|
|
232633 |
- &hent);
|
|
|
232633 |
- }
|
|
|
232633 |
-
|
|
|
232633 |
- if ((err == PR_FAILURE) || !(hn = net_find_fqdn(&hent))) goto bong;
|
|
|
232633 |
-
|
|
|
232633 |
-
|
|
|
232633 |
- if(verify) {
|
|
|
232633 |
- char **haddr = 0;
|
|
|
232633 |
- err = PR_GetHostByName(hn,
|
|
|
232633 |
- buf,
|
|
|
232633 |
- PR_NETDB_BUF_SIZE,
|
|
|
232633 |
- &hent);
|
|
|
232633 |
-
|
|
|
232633 |
- if(err == PR_SUCCESS) {
|
|
|
232633 |
- for(haddr = hent.h_addr_list; *haddr; haddr++) {
|
|
|
232633 |
- if(((struct in_addr *)(*haddr))->s_addr == iaddr.inet.ip)
|
|
|
232633 |
- break;
|
|
|
232633 |
- }
|
|
|
232633 |
- }
|
|
|
232633 |
-
|
|
|
232633 |
- if((err == PR_FAILURE) || (!(*haddr)))
|
|
|
232633 |
- goto bong;
|
|
|
232633 |
- }
|
|
|
232633 |
-
|
|
|
232633 |
- return hn;
|
|
|
232633 |
- bong:
|
|
|
232633 |
- return NULL;
|
|
|
232633 |
-}
|
|
|
232633 |
diff --git a/lib/base/net.cpp b/lib/base/net.cpp
|
|
|
232633 |
deleted file mode 100644
|
|
|
232633 |
index 7227d9584..000000000
|
|
|
232633 |
--- a/lib/base/net.cpp
|
|
|
232633 |
+++ /dev/null
|
|
|
232633 |
@@ -1,66 +0,0 @@
|
|
|
232633 |
-/** BEGIN COPYRIGHT BLOCK
|
|
|
232633 |
- * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
|
|
|
232633 |
- * Copyright (C) 2005 Red Hat, Inc.
|
|
|
232633 |
- * All rights reserved.
|
|
|
232633 |
- *
|
|
|
232633 |
- * License: GPL (version 3 or any later version).
|
|
|
232633 |
- * See LICENSE for details.
|
|
|
232633 |
- * END COPYRIGHT BLOCK **/
|
|
|
232633 |
-
|
|
|
232633 |
-#ifdef HAVE_CONFIG_H
|
|
|
232633 |
-# include <config.h>
|
|
|
232633 |
-#endif
|
|
|
232633 |
-
|
|
|
232633 |
-/*
|
|
|
232633 |
- * net.c: sockets abstraction and DNS related things
|
|
|
232633 |
- *
|
|
|
232633 |
- * Note: sockets created with net_socket are placed in non-blocking mode,
|
|
|
232633 |
- * however this API simulates that the calls are blocking.
|
|
|
232633 |
- *
|
|
|
232633 |
- * Rob McCool
|
|
|
232633 |
- */
|
|
|
232633 |
-
|
|
|
232633 |
-
|
|
|
232633 |
-#include "netsite.h"
|
|
|
232633 |
-#include <nspr.h>
|
|
|
232633 |
-
|
|
|
232633 |
-#include "util.h"
|
|
|
232633 |
-#include <string.h>
|
|
|
232633 |
-#include <arpa/inet.h> /* inet_ntoa */
|
|
|
232633 |
-#include <netdb.h> /* hostent stuff */
|
|
|
232633 |
-#ifdef NEED_GHN_PROTO
|
|
|
232633 |
-extern "C" int gethostname (char *name, size_t namelen);
|
|
|
232633 |
-#endif
|
|
|
232633 |
-#ifdef LINUX
|
|
|
232633 |
-#include <sys/ioctl.h> /* ioctl */
|
|
|
232633 |
-#endif
|
|
|
232633 |
-
|
|
|
232633 |
-#include "libadmin/libadmin.h"
|
|
|
232633 |
-
|
|
|
232633 |
-/* ---------------------------- util_hostname ----------------------------- */
|
|
|
232633 |
-
|
|
|
232633 |
-
|
|
|
232633 |
-#include <sys/param.h>
|
|
|
232633 |
-
|
|
|
232633 |
-/* Defined in dns.cpp */
|
|
|
232633 |
-char *net_find_fqdn(PRHostEnt *p);
|
|
|
232633 |
-
|
|
|
232633 |
-NSAPI_PUBLIC char *util_hostname(void)
|
|
|
232633 |
-{
|
|
|
232633 |
- char str[MAXHOSTNAMELEN];
|
|
|
232633 |
- PRHostEnt hent;
|
|
|
232633 |
- char buf[PR_NETDB_BUF_SIZE];
|
|
|
232633 |
- PRStatus err;
|
|
|
232633 |
-
|
|
|
232633 |
- gethostname(str, MAXHOSTNAMELEN);
|
|
|
232633 |
- err = PR_GetHostByName(
|
|
|
232633 |
- str,
|
|
|
232633 |
- buf,
|
|
|
232633 |
- PR_NETDB_BUF_SIZE,
|
|
|
232633 |
- &hent);
|
|
|
232633 |
-
|
|
|
232633 |
- if (err == PR_FAILURE)
|
|
|
232633 |
- return NULL;
|
|
|
232633 |
- return net_find_fqdn(&hent);
|
|
|
232633 |
-}
|
|
|
232633 |
-
|
|
|
232633 |
--
|
|
|
232633 |
2.21.0
|
|
|
232633 |
|