diff --git a/net/qt5-network/Makefile b/net/qt5-network/Makefile index 3918871f81c0..ffaa7be45d62 100644 --- a/net/qt5-network/Makefile +++ b/net/qt5-network/Makefile @@ -1,47 +1,48 @@ # $FreeBSD$ PORTNAME= network DISTVERSION= ${QT5_VERSION} +PORTREVISION= 1 CATEGORIES= net ipv6 PKGNAMEPREFIX= qt5- MAINTAINER= kde@FreeBSD.org COMMENT= Qt network module RUN_DEPENDS= ${LOCALBASE}/share/certs/ca-root-nss.crt:security/ca_root_nss USES= compiler:c++11-lang qmake:no_env qt-dist:5,base ssl USE_QT= core buildtools_build HAS_CONFIGURE= yes CONFIGURE_ARGS= -no-gui -no-xcb USE_LDCONFIG= ${PREFIX}/${QT_LIBDIR_REL} BUILD_WRKSRC= ${WRKSRC}/src/${PORTNAME} INSTALL_WRKSRC= ${BUILD_WRKSRC} QT_DEFINES= OPENSSL SSL QT_CONFIG= openssl post-patch: @${REINPLACE_CMD} -e 's|/usr/local|${LOCALBASE}|g' \ ${BUILD_WRKSRC}/ssl/qsslsocket_openssl.cpp @${REINPLACE_CMD} -e 's|%%OPENSSLLIB%%|${OPENSSLLIB}|g' \ ${BUILD_WRKSRC}/ssl/qsslsocket_openssl_symbols.cpp post-configure: .for d in src/network src/plugins/bearer/generic ${MKDIR} ${WRKSRC}/${d} cd ${WRKSRC}/${d} && ${SETENV} ${QMAKE_ENV} ${_QMAKE} ${QMAKE_ARGS} ${WRKSRC}/${d} .endfor post-build: @cd ${WRKSRC}/src/plugins/bearer/generic && \ ${SETENV} ${MAKE_ENV} ${MAKE} ${MAKE_FLAGS} ${MAKEFILE} \ ${_MAKE_JOBS} ${MAKE_ARGS} ${ALL_TARGET} post-install: @cd ${WRKSRC}/src/plugins/bearer/generic && \ ${SETENV} ${MAKE_ENV} ${MAKE} ${MAKE_FLAGS} ${MAKEFILE} \ ${MAKE_ARGS} ${INSTALL_TARGET} .include diff --git a/net/qt5-network/files/patch-src_network_kernel_qnetworkinterface__unix.cpp b/net/qt5-network/files/patch-src_network_kernel_qnetworkinterface__unix.cpp index 73b6de7b682d..04d7b3019939 100644 --- a/net/qt5-network/files/patch-src_network_kernel_qnetworkinterface__unix.cpp +++ b/net/qt5-network/files/patch-src_network_kernel_qnetworkinterface__unix.cpp @@ -1,12 +1,95 @@ ---- src/network/kernel/qnetworkinterface_unix.cpp.orig 2018-06-15 07:29:31 UTC +Clean up interface type and MTU detection. + + - Introduce a class SockPuppet that handles closing the socket + automatically, and handles different address families as well. + - Finding MTU requires using AF_LOCAL, cribbed that detail from ifconfig.c + - Zero out structures more diligently, initialize pointers to nullptr. + - In particular, don't use a union of structs passed in to ioctl(). + Make them separate structs (with block scope so the compiler might + place them on top of each other, that would be ok). + +--- src/network/kernel/qnetworkinterface_unix.cpp.orig 2018-12-24 17:00:42 UTC +++ src/network/kernel/qnetworkinterface_unix.cpp -@@ -463,9 +463,6 @@ static QNetworkInterface::InterfaceType probeIfType(in - case IFM_ETHER: - return QNetworkInterface::Ethernet; +@@ -419,12 +419,23 @@ QT_BEGIN_INCLUDE_NAMESPACE + #endif // QT_PLATFORM_UIKIT + QT_END_INCLUDE_NAMESPACE -- case IFM_FDDI: -- return QNetworkInterface::Fddi; +-static int openSocket(int &socket) ++template struct SockPuppet + { +- if (socket == -1) +- socket = qt_safe_socket(AF_INET, SOCK_DGRAM, 0); +- return socket; +-} ++ int socket{-1}; ++ ++ int open() ++ { ++ if (socket == -1) ++ socket = qt_safe_socket(address_family, SOCK_DGRAM, 0); ++ return socket; ++ } ++ ++ ~SockPuppet() ++ { ++ if (socket != -1) ++ qt_safe_close(socket); ++ } ++} ; + + static QNetworkInterface::InterfaceType probeIfType(int socket, int iftype, struct ifmediareq *req) + { +@@ -477,15 +488,8 @@ static QNetworkInterface::InterfaceType + static QList createInterfaces(ifaddrs *rawList) + { + QList interfaces; +- union { +- struct ifmediareq mediareq; +- struct ifreq req; +- }; +- int socket = -1; - - case IFM_IEEE80211: - return QNetworkInterface::Ieee80211; +- // ensure both structs start with the name field, of size IFNAMESIZ +- Q_STATIC_ASSERT(sizeof(mediareq.ifm_name) == sizeof(req.ifr_name)); +- Q_ASSERT(&mediareq.ifm_name == &req.ifr_name); ++ SockPuppet socket; ++ SockPuppet localSocket; + + // on NetBSD we use AF_LINK and sockaddr_dl + // scan the list for that family +@@ -500,13 +504,21 @@ static QList + iface->flags = convertFlags(ptr->ifa_flags); + iface->hardwareAddress = iface->makeHwAddress(sdl->sdl_alen, (uchar*)LLADDR(sdl)); + +- strlcpy(mediareq.ifm_name, ptr->ifa_name, sizeof(mediareq.ifm_name)); +- iface->type = probeIfType(openSocket(socket), sdl->sdl_type, &mediareq); +- iface->mtu = getMtu(socket, &req); ++ { ++ ifmediareq req; ++ memset(&req, 0, sizeof(req)); ++ strncpy(req.ifm_name, ptr->ifa_name, sizeof(req.ifm_name)); ++ iface->type = probeIfType(socket.open(), sdl->sdl_type, &req); ++ } ++ { ++ ifreq req; ++ memset(&req, 0, sizeof(req)); ++ strncpy(req.ifr_name, ptr->ifa_name, sizeof(req.ifr_name)); ++ req.ifr_addr.sa_family = AF_LOCAL; ++ iface->mtu = getMtu(localSocket.open(), &req); ++ } } + +- if (socket != -1) +- qt_safe_close(socket); + return interfaces; + } + +@@ -605,7 +617,7 @@ static QList + { + QList interfaces; + +- ifaddrs *interfaceListing; ++ ifaddrs *interfaceListing = nullptr; + if (getifaddrs(&interfaceListing) == -1) { + // error + return interfaces; diff --git a/net/qt5-network/files/patch-src_network_socket_qnet_unix_p.h b/net/qt5-network/files/patch-src_network_socket_qnet__unix__p.h similarity index 62% rename from net/qt5-network/files/patch-src_network_socket_qnet_unix_p.h rename to net/qt5-network/files/patch-src_network_socket_qnet__unix__p.h index bd2643152c43..8e6ca284ab48 100644 --- a/net/qt5-network/files/patch-src_network_socket_qnet_unix_p.h +++ b/net/qt5-network/files/patch-src_network_socket_qnet__unix__p.h @@ -1,15 +1,17 @@ ---- src/network/socket/qnet_unix_p.h.orig 2018-08-27 06:31:41.917561000 +0200 -+++ src/network/socket/qnet_unix_p.h 2018-08-27 06:33:20.404588000 +0200 +Some extra includes for us. + +--- src/network/socket/qnet_unix_p.h.orig 2018-12-03 11:15:26 UTC ++++ src/network/socket/qnet_unix_p.h @@ -71,6 +71,12 @@ # include #endif +#if defined(Q_OS_FREEBSD) +# include +# include +# include +#endif + QT_BEGIN_NAMESPACE // Almost always the same. If not, specify in qplatformdefs.h. diff --git a/net/qt5-network/files/patch-qsslcontext_openssl.cpp b/net/qt5-network/files/patch-src_network_ssl_qsslcontext__openssl.cpp similarity index 70% rename from net/qt5-network/files/patch-qsslcontext_openssl.cpp rename to net/qt5-network/files/patch-src_network_ssl_qsslcontext__openssl.cpp index c1202516d819..760df9a136af 100644 --- a/net/qt5-network/files/patch-qsslcontext_openssl.cpp +++ b/net/qt5-network/files/patch-src_network_ssl_qsslcontext__openssl.cpp @@ -1,15 +1,15 @@ * -* Fix for libressl atter openssl111 API change +* Fix for libressl after openssl111 API change * * ---- src/network/ssl/qsslcontext_openssl.cpp.orig 2018-10-21 16:58:39 UTC +--- src/network/ssl/qsslcontext_openssl.cpp.orig 2018-12-03 11:15:26 UTC +++ src/network/ssl/qsslcontext_openssl.cpp -@@ -248,7 +248,7 @@ void QSslContext::applyBackendConfig(QSs +@@ -249,7 +249,7 @@ void QSslContext::applyBackendConfig(QSs if (sslContext->sslConfiguration.backendConfiguration().isEmpty()) return; -#if OPENSSL_VERSION_NUMBER >= 0x10002000L +#if OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(LIBRESSL_VERSION_NUMBER) if (QSslSocket::sslLibraryVersionNumber() >= 0x10002000L) { QSharedPointer cctx(q_SSL_CONF_CTX_new(), &q_SSL_CONF_CTX_free); if (cctx) { diff --git a/net/qt5-network/files/patch-src_plugins_bearer_generic_qgenericengine.cpp b/net/qt5-network/files/patch-src_plugins_bearer_generic_qgenericengine.cpp new file mode 100644 index 000000000000..57261fa16fd2 --- /dev/null +++ b/net/qt5-network/files/patch-src_plugins_bearer_generic_qgenericengine.cpp @@ -0,0 +1,42 @@ +Determine suitable bearer. This code is basically the same +as the Linux code, except out ioctl()s are named differently +and we need an AF_LOCAL socket (this detail cribbed from ifconfig.c). +If getting the HW address succeeds, assume it's Ethernet. Tested +with two Ethernet cards and a vlan (all of which have a MAC reported +by ifconfig). + +--- src/plugins/bearer/generic/qgenericengine.cpp.orig 2018-12-03 12:15:26.000000000 +0100 ++++ src/plugins/bearer/generic/qgenericengine.cpp 2018-12-23 12:42:48.095145000 +0100 +@@ -82,7 +82,7 @@ + // needed as interface is used as parameter name in qGetInterfaceType + #undef interface + +-#ifdef Q_OS_LINUX ++#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) + #include + #include + #include +@@ -139,6 +139,23 @@ + + if (result >= 0 && request.ifr_hwaddr.sa_family == ARPHRD_ETHER) + return QNetworkConfiguration::BearerEthernet; ++ ++#elif defined(Q_OS_FREEBSD) ++ int sock = socket(AF_LOCAL, SOCK_DGRAM, 0); ++ ++ ifreq request; ++ memset(&request, 0, sizeof(struct ifreq)); ++ strncpy(request.ifr_name, interface.toLocal8Bit().data(), sizeof(request.ifr_name) - 1); ++ request.ifr_name[sizeof(request.ifr_name) - 1] = '\0'; ++ ++ if (sock >= 0) { ++ int result = ioctl(sock, SIOCGHWADDR, &request); ++ close(sock); ++ ++ if (result >= 0) ++ return QNetworkConfiguration::BearerEthernet; ++ } ++ + #elif defined(Q_OS_WINRT) + ComPtr networkInfoStatics; + HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Networking_Connectivity_NetworkInformation).Get(), &networkInfoStatics);