Changeset 59219 in vbox
- Timestamp:
- Dec 24, 2015 10:45:49 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 104847
- Location:
- trunk/src/VBox/Devices/Network
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DrvNAT.cpp
r57850 r59219 1205 1205 N_("Unknown configuration in dns mapping")); 1206 1206 char szHostNameOrPattern[255]; 1207 bool f Match = false; /* false used for equal matching, and true if wildcard pattern is used. */1207 bool fPattern = false; 1208 1208 RT_ZERO(szHostNameOrPattern); 1209 1209 GET_STRING(rc, pThis, pNode, "HostName", szHostNameOrPattern[0], sizeof(szHostNameOrPattern)); … … 1219 1219 continue; 1220 1220 } 1221 f Match= true;1221 fPattern = true; 1222 1222 } 1223 1223 struct in_addr HostIP; … … 1228 1228 continue; 1229 1229 } 1230 slirp_add_host_resolver_mapping(pThis->pNATState, fMatch ? NULL : szHostNameOrPattern, fMatch ? szHostNameOrPattern : NULL, HostIP.s_addr);1230 slirp_add_host_resolver_mapping(pThis->pNATState, szHostNameOrPattern, fPattern, HostIP.s_addr); 1231 1231 } 1232 1232 LogFlowFunc(("LEAVE: %Rrc\n", rc)); -
trunk/src/VBox/Devices/Network/slirp/hostres.c
r59203 r59219 133 133 134 134 #ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER 135 static void alterHostentWithDataFromDNSMap(PNATState pData, struct hostent * pHostent);135 static void alterHostentWithDataFromDNSMap(PNATState pData, struct hostent *h); 136 136 #endif 137 137 … … 477 477 } 478 478 479 if (h->h_length != sizeof(RTNETADDRIPV4)) 480 { 481 /* Log: what kind of address did we get?! */ 482 goto out; 483 } 484 485 if ( h->h_addr_list == NULL 486 || h->h_addr_list[0] == NULL) 487 { 488 /* Log: shouldn't happen */ 489 goto out; 490 } 491 479 492 #ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER 480 if (!LIST_EMPTY(&pData->DNSMapHead)) 481 alterHostentWithDataFromDNSMap(pData, h); 493 alterHostentWithDataFromDNSMap(pData, h); 482 494 #endif 483 495 … … 1187 1199 1188 1200 #ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER 1189 static bool isDnsMappingEntryMatchOrEqual2Str(const PDNSMAPPINGENTRY pDNSMapingEntry, const char *pcszString) 1190 { 1191 return ( ( pDNSMapingEntry->pszCName 1192 && !strcmp(pDNSMapingEntry->pszCName, pcszString)) 1193 || ( pDNSMapingEntry->pszPattern 1194 && RTStrSimplePatternMultiMatch(pDNSMapingEntry->pszPattern, RTSTR_MAX, pcszString, RTSTR_MAX, NULL))); 1195 } 1196 1197 static void alterHostentWithDataFromDNSMap(PNATState pData, struct hostent *pHostent) 1201 void 1202 slirp_add_host_resolver_mapping(PNATState pData, 1203 const char *pszHostName, bool fPattern, 1204 uint32_t u32HostIP) 1205 { 1206 LogRel(("ENTER: pszHostName:%s%s, u32HostIP:%RTnaipv4\n", 1207 pszHostName ? pszHostName : "(null)", 1208 fPattern ? " (pattern)" : "", 1209 u32HostIP)); 1210 1211 if ( pszHostName != NULL 1212 && u32HostIP != INADDR_ANY 1213 && u32HostIP != INADDR_BROADCAST) 1214 { 1215 PDNSMAPPINGENTRY pDnsMapping = RTMemAllocZ(sizeof(DNSMAPPINGENTRY)); 1216 if (!pDnsMapping) 1217 { 1218 LogFunc(("Can't allocate DNSMAPPINGENTRY\n")); 1219 LogFlowFuncLeave(); 1220 return; 1221 } 1222 1223 pDnsMapping->u32IpAddress = u32HostIP; 1224 pDnsMapping->fPattern = fPattern; 1225 pDnsMapping->pszName = RTStrDup(pszHostName); 1226 1227 if (pDnsMapping->pszName == NULL) 1228 { 1229 LogFunc(("Can't allocate enough room for host name\n")); 1230 RTMemFree(pDnsMapping); 1231 LogFlowFuncLeave(); 1232 return; 1233 } 1234 1235 if (fPattern) /* there's no case-insensitive pattern-match function */ 1236 RTStrToLower(pDnsMapping->pszName); 1237 1238 STAILQ_INSERT_TAIL(fPattern ? &pData->DNSMapPatterns : &pData->DNSMapNames, 1239 pDnsMapping, MapList); 1240 1241 LogRel(("NAT: User-defined mapping %s%s = %RTnaipv4 is registered\n", 1242 pDnsMapping->pszName, 1243 pDnsMapping->fPattern ? " (pattern)" : "", 1244 pDnsMapping->u32IpAddress)); 1245 } 1246 LogFlowFuncLeave(); 1247 } 1248 1249 1250 static void 1251 alterHostentWithDataFromDNSMap(PNATState pData, struct hostent *h) 1198 1252 { 1199 1253 PDNSMAPPINGENTRY pDNSMapingEntry = NULL; 1200 bool fMatch = false; 1201 LIST_FOREACH(pDNSMapingEntry, &pData->DNSMapHead, MapList) 1202 { 1203 char **pszAlias = NULL; 1204 if (isDnsMappingEntryMatchOrEqual2Str(pDNSMapingEntry, pHostent->h_name)) 1205 { 1206 fMatch = true; 1207 break; 1208 } 1209 1210 for (pszAlias = pHostent->h_aliases; *pszAlias && !fMatch; pszAlias++) 1211 { 1212 if (isDnsMappingEntryMatchOrEqual2Str(pDNSMapingEntry, *pszAlias)) 1213 { 1214 1215 PDNSMAPPINGENTRY pDnsMapping = RTMemAllocZ(sizeof(DNSMAPPINGENTRY)); 1216 fMatch = true; 1217 if (!pDnsMapping) 1218 { 1219 LogFunc(("Can't allocate DNSMAPPINGENTRY\n")); 1220 LogFlowFuncLeave(); 1221 return; 1222 } 1223 pDnsMapping->u32IpAddress = pDNSMapingEntry->u32IpAddress; 1224 pDnsMapping->pszCName = RTStrDup(pHostent->h_name); 1225 if (!pDnsMapping->pszCName) 1226 { 1227 LogFunc(("Can't allocate enough room for %s\n", pHostent->h_name)); 1228 RTMemFree(pDnsMapping); 1229 LogFlowFuncLeave(); 1230 return; 1231 } 1232 LIST_INSERT_HEAD(&pData->DNSMapHead, pDnsMapping, MapList); 1233 LogRel(("NAT: User-defined mapping %s: %RTnaipv4 is registered\n", 1234 pDnsMapping->pszCName ? pDnsMapping->pszCName : pDnsMapping->pszPattern, 1235 pDnsMapping->u32IpAddress)); 1236 } 1237 } 1238 if (fMatch) 1239 break; 1240 } 1241 1242 /* h_lenght is lenght of h_addr_list in bytes, so we check that we have enough space for IPv4 address */ 1243 if ( fMatch 1244 && pHostent->h_length >= sizeof(uint32_t) 1245 && pDNSMapingEntry) 1246 { 1247 pHostent->h_length = 1; 1248 *(uint32_t *)pHostent->h_addr_list[0] = pDNSMapingEntry->u32IpAddress; 1249 } 1250 1254 char **pszAlias; 1255 1256 STAILQ_FOREACH(pDNSMapingEntry, &pData->DNSMapNames, MapList) 1257 { 1258 Assert(!pDNSMapingEntry->fPattern); 1259 1260 if (RTStrICmp(pDNSMapingEntry->pszName, h->h_name) == 0) 1261 goto done; 1262 1263 for (pszAlias = h->h_aliases; *pszAlias != NULL; ++pszAlias) 1264 { 1265 if (RTStrICmp(pDNSMapingEntry->pszName, *pszAlias) == 0) 1266 goto done; 1267 } 1268 } 1269 1270 1271 # define MATCH(_pattern, _string) \ 1272 (RTStrSimplePatternMultiMatch((_pattern), RTSTR_MAX, (_string), RTSTR_MAX, NULL)) 1273 1274 STAILQ_FOREACH(pDNSMapingEntry, &pData->DNSMapPatterns, MapList) 1275 { 1276 RTStrToLower(h->h_name); 1277 if (MATCH(pDNSMapingEntry->pszName, h->h_name)) 1278 goto done; 1279 1280 for (pszAlias = h->h_aliases; *pszAlias != NULL; ++pszAlias) 1281 { 1282 RTStrToLower(*pszAlias); 1283 if (MATCH(pDNSMapingEntry->pszName, h->h_name)) 1284 goto done; 1285 } 1286 } 1287 1288 done: 1289 if (pDNSMapingEntry != NULL) 1290 { 1291 *(uint32_t *)h->h_addr_list[0] = pDNSMapingEntry->u32IpAddress; 1292 h->h_addr_list[1] = NULL; 1293 } 1251 1294 } 1252 1295 #endif -
trunk/src/VBox/Devices/Network/slirp/libslirp.h
r57784 r59219 171 171 172 172 #ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER 173 void slirp_add_host_resolver_mapping(PNATState pData, const char *pszHostName, const char *pszHostNamePattern, uint32_t u32HostIP); 173 void slirp_add_host_resolver_mapping(PNATState pData, 174 const char *pszHostName, bool fPattern, 175 uint32_t u32HostIP); 174 176 #endif 175 177 -
trunk/src/VBox/Devices/Network/slirp/slirp.c
r59063 r59219 419 419 #endif 420 420 421 #ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER 422 STAILQ_INIT(&pData->DNSMapNames); 423 STAILQ_INIT(&pData->DNSMapPatterns); 424 #endif 425 421 426 slirp_link_up(pData); 422 427 return VINF_SUCCESS; … … 519 524 ftp_alias_unload(pData); 520 525 nbt_alias_unload(pData); 521 if (pData->fUseHostResolver) 522 { 526 523 527 #ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER 524 while (!LIST_EMPTY(&pData->DNSMapHead)) 525 { 526 PDNSMAPPINGENTRY pDnsEntry = LIST_FIRST(&pData->DNSMapHead); 527 LIST_REMOVE(pDnsEntry, MapList); 528 RTStrFree(pDnsEntry->pszCName); 529 RTMemFree(pDnsEntry); 530 } 531 #endif 532 } 528 { 529 DNSMAPPINGHEAD *heads[2]; 530 int i; 531 532 heads[0] = &pData->DNSMapNames; 533 heads[1] = &pData->DNSMapPatterns; 534 for (i = 0; i < RT_ELEMENTS(heads); ++i) 535 { 536 while (!STAILQ_EMPTY(heads[i])) 537 { 538 PDNSMAPPINGENTRY pDnsEntry = STAILQ_FIRST(heads[i]); 539 STAILQ_REMOVE_HEAD(heads[i], MapList); 540 RTStrFree(pDnsEntry->pszName); 541 RTMemFree(pDnsEntry); 542 } 543 } 544 } 545 #endif 546 533 547 while (!LIST_EMPTY(&instancehead)) 534 548 { … … 1855 1869 LogFlowFuncLeave(); 1856 1870 } 1857 #ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER 1858 void slirp_add_host_resolver_mapping(PNATState pData, const char *pszHostName, const char *pszHostNamePattern, uint32_t u32HostIP) 1859 { 1860 LogFlowFunc(("ENTER: pszHostName:%s, pszHostNamePattern:%s u32HostIP:%RTnaipv4\n", 1861 pszHostName ? pszHostName : "(null)", 1862 pszHostNamePattern ? pszHostNamePattern : "(null)", 1863 u32HostIP)); 1864 if ( ( pszHostName 1865 || pszHostNamePattern) 1866 && u32HostIP != INADDR_ANY 1867 && u32HostIP != INADDR_BROADCAST) 1868 { 1869 PDNSMAPPINGENTRY pDnsMapping = RTMemAllocZ(sizeof(DNSMAPPINGENTRY)); 1870 if (!pDnsMapping) 1871 { 1872 LogFunc(("Can't allocate DNSMAPPINGENTRY\n")); 1873 LogFlowFuncLeave(); 1874 return; 1875 } 1876 pDnsMapping->u32IpAddress = u32HostIP; 1877 if (pszHostName) 1878 pDnsMapping->pszCName = RTStrDup(pszHostName); 1879 else if (pszHostNamePattern) 1880 pDnsMapping->pszPattern = RTStrDup(pszHostNamePattern); 1881 if ( !pDnsMapping->pszCName 1882 && !pDnsMapping->pszPattern) 1883 { 1884 LogFunc(("Can't allocate enough room for %s\n", pszHostName ? pszHostName : pszHostNamePattern)); 1885 RTMemFree(pDnsMapping); 1886 LogFlowFuncLeave(); 1887 return; 1888 } 1889 LIST_INSERT_HEAD(&pData->DNSMapHead, pDnsMapping, MapList); 1890 LogRel(("NAT: User-defined mapping %s: %RTnaipv4 is registered\n", 1891 pDnsMapping->pszCName ? pDnsMapping->pszCName : pDnsMapping->pszPattern, 1892 pDnsMapping->u32IpAddress)); 1893 } 1894 LogFlowFuncLeave(); 1895 } 1896 #endif 1871 1897 1872 1898 1873 /* updates the arp cache -
trunk/src/VBox/Devices/Network/slirp/slirp_state.h
r59218 r59219 58 58 typedef struct DNSMAPPINGENTRY 59 59 { 60 /** host name to map. 61 * @note If pszCName isn't null pszPattern won't be used (see alias_dns.c for 62 * details). 63 */ 64 char *pszCName; 65 /** Pattern (simple) of hostnames to map to the specified IP. */ 66 char *pszPattern; 60 /** Literal or pattern. */ 61 bool fPattern; 62 /** Host name or pattern to map. */ 63 char *pszName; 67 64 /** The IP Address. */ 68 65 uint32_t u32IpAddress; 69 66 /** List entry. */ 70 LIST_ENTRY(DNSMAPPINGENTRY) MapList;67 STAILQ_ENTRY(DNSMAPPINGENTRY) MapList; 71 68 } DNSMAPPINGENTRY, *PDNSMAPPINGENTRY; 72 typedef LIST_HEAD(DNSMAPPINGLISTHEAD, DNSMAPPINGENTRY) DNSMAPPINGLISTHEAD;69 typedef STAILQ_HEAD(DNSMAPPINGHEAD, DNSMAPPINGENTRY) DNSMAPPINGHEAD; 73 70 #endif 74 71 … … 310 307 #endif 311 308 #ifdef VBOX_WITH_DNSMAPPING_IN_HOSTRESOLVER 312 DNSMAPPINGLISTHEAD DNSMapHead; 309 DNSMAPPINGHEAD DNSMapNames; 310 DNSMAPPINGHEAD DNSMapPatterns; 313 311 #endif 314 312 } NATState;
Note:
See TracChangeset
for help on using the changeset viewer.