@@ -1151,7 +1151,8 @@ public static object getnameinfo(CodeContext/*!*/ context, [NotNone] PythonTuple
11511151
11521152 string host = Converter . ConvertToString ( socketAddr [ 0 ] ) ;
11531153 if ( host == null ) throw PythonOps . TypeError ( "argument 1 must be string" ) ;
1154- int port = 0 ;
1154+
1155+ int port ;
11551156 try {
11561157 port = ( int ) socketAddr [ 1 ] ! ;
11571158 } catch ( InvalidCastException ) {
@@ -1167,60 +1168,45 @@ public static object getnameinfo(CodeContext/*!*/ context, [NotNone] PythonTuple
11671168 }
11681169 }
11691170
1170- string resultHost ;
1171- string resultPort ;
1172-
11731171 // Host
1174- IList < IPAddress > addrs ;
1175- try {
1176- addrs = HostToAddresses ( context , host , AddressFamily . InterNetwork , getHostEntry : false ) ;
1177- } catch ( IndexOutOfRangeException ) {
1172+ if ( ! IPAddress . TryParse ( host , out IPAddress ? addr ) ) {
11781173 throw MakeGaiException ( context , EAI_NODATA ) ;
11791174 }
11801175
1181- if ( addrs . Count > 1 ) {
1182- // ignore non-IPV4 addresses
1183- List < IPAddress > newAddrs = new List < IPAddress > ( addrs . Count ) ;
1184- foreach ( IPAddress addr in addrs ) {
1185- if ( addr . AddressFamily == AddressFamily . InterNetwork ) {
1186- newAddrs . Add ( addr ) ;
1176+ string resultHost ;
1177+ if ( ( flags & NI_NUMERICHOST ) != 0 ) {
1178+ resultHost = addr . ToString ( ) ;
1179+ } else {
1180+ string hostName ;
1181+ if ( addr . Equals ( IPAddress . Any ) || addr . Equals ( IPAddress . IPv6Any ) ) {
1182+ hostName = Dns . GetHostName ( ) ;
1183+ } else {
1184+ try {
1185+ hostName = Dns . GetHostEntry ( addr ) . HostName ;
1186+ } catch ( SocketException ex ) {
1187+ throw MakeGaiException ( context , ex ) ;
11871188 }
11881189 }
1189- if ( newAddrs . Count > 1 ) {
1190- throw PythonExceptions . CreateThrowable ( error , "sockaddr resolved to multiple addresses" ) ;
1191- }
1192- addrs = newAddrs ;
1193- }
11941190
1195- if ( addrs . Count < 1 ) {
1196- throw MakeGaiException ( context , EAI_NODATA ) ;
1197- }
1198-
1199- IPHostEntry hostEntry ;
1200- try {
1201- hostEntry = Dns . GetHostEntry ( addrs [ 0 ] ) ;
1202- } catch ( SocketException ex ) {
1203- throw MakeGaiException ( context , ex ) ;
1204- }
1205- if ( ( flags & ( int ) NI_NUMERICHOST ) != 0 ) {
1206- resultHost = addrs [ 0 ] . ToString ( ) ;
1207- } else if ( ( flags & ( int ) NI_NOFQDN ) != 0 ) {
1208- resultHost = RemoveLocalDomain ( hostEntry . HostName ) ;
1209- } else {
1210- resultHost = hostEntry . HostName ;
1191+ if ( ( flags & NI_NOFQDN ) != 0 ) {
1192+ resultHost = RemoveLocalDomain ( hostName ) ;
1193+ } else {
1194+ resultHost = hostName ;
1195+ }
12111196 }
12121197
12131198 // Port
1214- if ( ( flags & ( int ) NI_NUMERICSERV ) == 0 ) {
1199+ string resultPort ;
1200+ if ( ( flags & NI_NUMERICSERV ) == 0 ) {
12151201 //call the servbyport to translate port if not just use the port.ToString as the result
12161202 try {
12171203 resultPort = getservbyport ( context , port ) ;
12181204 } catch {
12191205 resultPort = port . ToString ( ) ;
12201206 }
1221- flags = flags | ( int ) NI_NUMERICSERV ;
1222- } else
1207+ } else {
12231208 resultPort = port . ToString ( ) ;
1209+ }
12241210
12251211 return PythonTuple . MakeTuple ( resultHost , resultPort ) ;
12261212 }
@@ -2002,7 +1988,7 @@ private static IPAddress HostToAddress(CodeContext/*!*/ context, string host, Ad
20021988 /// not the same as the specified family. gaierror is also raised if the hostname cannot be
20031989 /// converted to an IP address (e.g. through a name lookup failure).
20041990 /// </summary>
2005- private static IPAddress [ ] HostToAddresses ( CodeContext /*!*/ context , string host , AddressFamily family , bool getHostEntry = true ) {
1991+ private static IPAddress [ ] HostToAddresses ( CodeContext /*!*/ context , string host , AddressFamily family ) {
20061992 host = ConvertSpecialAddresses ( host ) ;
20071993 try {
20081994 bool numeric = true ;
@@ -2022,9 +2008,6 @@ private static IPAddress[] HostToAddresses(CodeContext/*!*/ context, string host
20222008 }
20232009 // Incorrect family will raise EAI_NODATA exception below
20242010 } else {
2025- if ( ! getHostEntry ) {
2026- throw MakeGaiException ( context , EAI_NONAME ) ;
2027- }
20282011 IPHostEntry hostEntry = Dns . GetHostEntry ( host ) ;
20292012 List < IPAddress > addrs = new List < IPAddress > ( ) ;
20302013 foreach ( IPAddress ip in hostEntry . AddressList ) {
0 commit comments