#include <ostream>
#include <string>
-#include <net/if.h>
-
#include <folly/Format.h>
#include <folly/IPAddress.h>
#include <folly/IPAddressV4.h>
#include <folly/MacAddress.h>
#include <folly/detail/IPAddressSource.h>
+#if !_WIN32
+#include <net/if.h>
+#else
+// Because of the massive pain that is libnl, this can't go into the socket
+// portability header as you can't include <linux/if.h> and <net/if.h> in
+// the same translation unit without getting errors -_-...
+#include <iphlpapi.h>
+#include <ntddndis.h>
+
+// Alias the max size of an interface name to what posix expects.
+#define IFNAMSIZ IF_NAMESIZE
+#endif
+
using std::ostream;
using std::string;
if (scopeId != 0) {
auto len = strlen(buffer);
buffer[len] = '%';
+
+ auto errsv = errno;
if (!if_indextoname(scopeId, buffer + len + 1)) {
- throw IPAddressFormatException(to<std::string>(
- "Invalid scope for address with hex ",
- "'",
- detail::Bytes::toHex(bytes(), 16),
- "%",
- scopeId,
- "'",
- " with error ",
- strerror(errno)));
+ // if we can't map the if because eg. it no longer exists,
+ // append the if index instead
+ snprintf(buffer + len + 1, IFNAMSIZ, "%u", scopeId);
}
+ errno = errsv;
}
return string(buffer);
auto masked = mask(numBits);
return (std::memcmp(addr.data(), masked.bytes(), 2) == 0);
}
-} // folly
+} // namespace folly