Coverage Report

Created: 2026-05-31 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/qtbase/src/network/socket/qnativesocketengine_p.h
Line
Count
Source
1
// Copyright (C) 2016 The Qt Company Ltd.
2
// Copyright (C) 2016 Intel Corporation.
3
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4
// Qt-Security score:significant reason:default
5
6
#ifndef QNATIVESOCKETENGINE_P_H
7
#define QNATIVESOCKETENGINE_P_H
8
9
//
10
//  W A R N I N G
11
//  -------------
12
//
13
// This file is not part of the Qt API. It exists purely as an
14
// implementation detail. This header file may change from version to
15
// version without notice, or even be removed.
16
//
17
// We mean it.
18
//
19
20
#include <QtNetwork/private/qtnetworkglobal_p.h>
21
#include "QtNetwork/qhostaddress.h"
22
#include "QtNetwork/qnetworkinterface.h"
23
#include "private/qabstractsocketengine_p.h"
24
#include "qplatformdefs.h"
25
26
#ifndef Q_OS_WIN
27
#  include <netinet/in.h>
28
#else
29
#  include <winsock2.h>
30
#  include <ws2tcpip.h>
31
#  include <mswsock.h>
32
#endif
33
34
QT_BEGIN_NAMESPACE
35
36
#ifdef Q_OS_WIN
37
#  define QT_SOCKLEN_T int
38
#  define QT_SOCKOPTLEN_T int
39
#endif
40
41
namespace {
42
namespace SetSALen {
43
    template <typename T> void set(T *sa, typename std::enable_if<(&T::sa_len, true), QT_SOCKLEN_T>::type len)
44
    { sa->sa_len = len; }
45
    template <typename T> void set(T *sa, typename std::enable_if<(&T::sin_len, true), QT_SOCKLEN_T>::type len)
46
    { sa->sin_len = len; }
47
    template <typename T> void set(T *sin6, typename std::enable_if<(&T::sin6_len, true), QT_SOCKLEN_T>::type len)
48
    { sin6->sin6_len = len; }
49
0
    template <typename T> void set(T *, ...) {}
Unexecuted instantiation: qdtls_openssl.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in>(sockaddr_in*, ...)
Unexecuted instantiation: qdtls_openssl.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in6>(sockaddr_in6*, ...)
Unexecuted instantiation: qabstractsocketengine.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in>(sockaddr_in*, ...)
Unexecuted instantiation: qabstractsocketengine.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in6>(sockaddr_in6*, ...)
Unexecuted instantiation: qnativesocketengine.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in>(sockaddr_in*, ...)
Unexecuted instantiation: qnativesocketengine.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in6>(sockaddr_in6*, ...)
Unexecuted instantiation: qnativesocketengine_unix.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in6>(sockaddr_in6*, ...)
Unexecuted instantiation: qnativesocketengine_unix.cpp:void (anonymous namespace)::SetSALen::set<sockaddr_in>(sockaddr_in*, ...)
50
}
51
52
inline QT_SOCKLEN_T setSockaddr(sockaddr_in *sin, const QHostAddress &addr, quint16 port = 0)
53
0
{
54
0
    *sin = {};
55
0
    SetSALen::set(sin, sizeof(*sin));
56
0
    sin->sin_family = AF_INET;
57
0
    sin->sin_port = htons(port);
58
0
    sin->sin_addr.s_addr = htonl(addr.toIPv4Address());
59
0
    return sizeof(*sin);
60
0
}
Unexecuted instantiation: qdtls_openssl.cpp:(anonymous namespace)::setSockaddr(sockaddr_in*, QHostAddress const&, unsigned short)
Unexecuted instantiation: qabstractsocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr_in*, QHostAddress const&, unsigned short)
Unexecuted instantiation: qnativesocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr_in*, QHostAddress const&, unsigned short)
Unexecuted instantiation: qnativesocketengine_unix.cpp:(anonymous namespace)::setSockaddr(sockaddr_in*, QHostAddress const&, unsigned short)
61
62
inline QT_SOCKLEN_T setSockaddr(sockaddr_in6 *sin6, const QHostAddress &addr, quint16 port = 0)
63
0
{
64
0
    *sin6 = {};
65
0
    SetSALen::set(sin6, sizeof(*sin6));
66
0
    sin6->sin6_family = AF_INET6;
67
0
    sin6->sin6_port = htons(port);
68
0
    memcpy(sin6->sin6_addr.s6_addr, addr.toIPv6Address().c, sizeof(sin6->sin6_addr));
69
0
#if QT_CONFIG(networkinterface)
70
0
    sin6->sin6_scope_id = QNetworkInterface::interfaceIndexFromName(addr.scopeId());
71
#else
72
    // it had better be a number then, if it is not empty
73
    sin6->sin6_scope_id = addr.scopeId().toUInt();
74
#endif
75
0
    return sizeof(*sin6);
76
0
}
Unexecuted instantiation: qdtls_openssl.cpp:(anonymous namespace)::setSockaddr(sockaddr_in6*, QHostAddress const&, unsigned short)
Unexecuted instantiation: qabstractsocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr_in6*, QHostAddress const&, unsigned short)
Unexecuted instantiation: qnativesocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr_in6*, QHostAddress const&, unsigned short)
Unexecuted instantiation: qnativesocketengine_unix.cpp:(anonymous namespace)::setSockaddr(sockaddr_in6*, QHostAddress const&, unsigned short)
77
78
inline QT_SOCKLEN_T setSockaddr(sockaddr *sa, const QHostAddress &addr, quint16 port = 0)
79
0
{
80
0
    switch (addr.protocol()) {
81
0
    case QHostAddress::IPv4Protocol:
82
0
        return setSockaddr(reinterpret_cast<sockaddr_in *>(sa), addr, port);
83
84
0
    case QHostAddress::IPv6Protocol:
85
0
    case QHostAddress::AnyIPProtocol:
86
0
        return setSockaddr(reinterpret_cast<sockaddr_in6 *>(sa), addr, port);
87
88
0
    case QHostAddress::UnknownNetworkLayerProtocol:
89
0
        break;
90
0
    }
91
0
    *sa = {};
92
0
    sa->sa_family = AF_UNSPEC;
93
0
    return 0;
94
0
}
Unexecuted instantiation: qdtls_openssl.cpp:(anonymous namespace)::setSockaddr(sockaddr*, QHostAddress const&, unsigned short)
Unexecuted instantiation: qabstractsocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr*, QHostAddress const&, unsigned short)
Unexecuted instantiation: qnativesocketengine.cpp:(anonymous namespace)::setSockaddr(sockaddr*, QHostAddress const&, unsigned short)
Unexecuted instantiation: qnativesocketengine_unix.cpp:(anonymous namespace)::setSockaddr(sockaddr*, QHostAddress const&, unsigned short)
95
} // unnamed namespace
96
97
class QNativeSocketEnginePrivate;
98
#ifndef QT_NO_NETWORKINTERFACE
99
class QNetworkInterface;
100
#endif
101
102
class Q_AUTOTEST_EXPORT QNativeSocketEngine : public QAbstractSocketEngine
103
{
104
0
    Q_OBJECT
105
0
public:
106
0
    QNativeSocketEngine(QObject *parent = nullptr);
107
0
    ~QNativeSocketEngine();
108
0
109
0
    bool initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol = QAbstractSocket::IPv4Protocol) override;
110
0
    bool initialize(qintptr socketDescriptor, QAbstractSocket::SocketState socketState = QAbstractSocket::ConnectedState) override;
111
0
112
0
    qintptr socketDescriptor() const override;
113
0
114
0
    bool isValid() const override;
115
0
116
0
    bool connectToHost(const QHostAddress &address, quint16 port) override;
117
0
    bool connectToHostByName(const QString &name, quint16 port) override;
118
0
    bool bind(const QHostAddress &address, quint16 port) override;
119
0
    bool listen(int backlog) override;
120
0
    qintptr accept() override;
121
0
    void close() override;
122
0
123
0
    qint64 bytesAvailable() const override;
124
0
125
0
    qint64 read(char *data, qint64 maxlen) override;
126
0
    qint64 write(const char *data, qint64 len) override;
127
0
128
0
#ifndef QT_NO_UDPSOCKET
129
0
#ifndef QT_NO_NETWORKINTERFACE
130
0
    bool joinMulticastGroup(const QHostAddress &groupAddress,
131
0
                            const QNetworkInterface &iface) override;
132
0
    bool leaveMulticastGroup(const QHostAddress &groupAddress,
133
0
                             const QNetworkInterface &iface) override;
134
0
    QNetworkInterface multicastInterface() const override;
135
0
    bool setMulticastInterface(const QNetworkInterface &iface) override;
136
0
#endif
137
0
138
0
    bool hasPendingDatagrams() const override;
139
0
    qint64 pendingDatagramSize() const override;
140
0
#endif // QT_NO_UDPSOCKET
141
0
142
0
    qint64 readDatagram(char *data, qint64 maxlen, QIpPacketHeader * = nullptr,
143
0
                        PacketHeaderOptions = WantNone) override;
144
0
    qint64 writeDatagram(const char *data, qint64 len, const QIpPacketHeader &) override;
145
0
    qint64 bytesToWrite() const override;
146
0
147
0
#if 0   // currently unused
148
0
    qint64 receiveBufferSize() const;
149
0
    void setReceiveBufferSize(qint64 bufferSize);
150
0
151
0
    qint64 sendBufferSize() const;
152
0
    void setSendBufferSize(qint64 bufferSize);
153
0
#endif
154
0
155
0
    int option(SocketOption option) const override;
156
0
    bool setOption(SocketOption option, int value) override;
157
0
158
0
    bool waitForRead(QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout},
159
0
                     bool *timedOut = nullptr) override;
160
0
    bool waitForWrite(QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout},
161
0
                      bool *timedOut = nullptr) override;
162
0
    bool waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
163
0
                            bool checkRead, bool checkWrite,
164
0
                            QDeadlineTimer deadline = QDeadlineTimer{DefaultTimeout},
165
0
                            bool *timedOut = nullptr) override;
166
0
167
0
    bool isReadNotificationEnabled() const override;
168
0
    void setReadNotificationEnabled(bool enable) override;
169
0
    bool isWriteNotificationEnabled() const override;
170
0
    void setWriteNotificationEnabled(bool enable) override;
171
0
    bool isExceptionNotificationEnabled() const override;
172
0
    void setExceptionNotificationEnabled(bool enable) override;
173
0
174
0
public Q_SLOTS:
175
0
    // non-virtual override;
176
0
    void connectionNotification();
177
0
178
0
private:
179
    Q_DECLARE_PRIVATE(QNativeSocketEngine)
Unexecuted instantiation: QNativeSocketEngine::d_func()
Unexecuted instantiation: QNativeSocketEngine::d_func() const
180
    Q_DISABLE_COPY_MOVE(QNativeSocketEngine)
181
};
182
183
QT_END_NAMESPACE
184
185
#endif // QNATIVESOCKETENGINE_P_H