Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qnet_unix_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QNET_UNIX_P_H
5#define QNET_UNIX_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists for the convenience
12// of Qt code on Unix. This header file may change from version to
13// version to version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtNetwork/private/qtnetworkglobal_p.h>
19#include "private/qcore_unix_p.h"
20
21#include <sys/types.h>
22#include <sys/socket.h>
23#include <netinet/in.h>
24
25#if defined(Q_OS_VXWORKS)
26# include <sockLib.h>
27#endif
28
29// for inet_addr
30#include <netdb.h>
31#include <arpa/inet.h>
32#if defined(Q_OS_VXWORKS)
33# include <hostLib.h>
34#else
35# include <resolv.h>
36#endif
37
39
40// Almost always the same. If not, specify in qplatformdefs.h.
41#if !defined(QT_SOCKOPTLEN_T)
42# define QT_SOCKOPTLEN_T QT_SOCKLEN_T
43#endif
44
45static inline int qt_safe_socket(int domain, int type, int protocol, int flags = 0)
46{
47 Q_ASSERT((flags & ~O_NONBLOCK) == 0);
48
49 int fd;
50#ifdef QT_THREADSAFE_CLOEXEC
51 int newtype = type | SOCK_CLOEXEC;
52 if (flags & O_NONBLOCK)
53 newtype |= SOCK_NONBLOCK;
54 fd = ::socket(domain, newtype, protocol);
55 return fd;
56#else
57 fd = ::socket(domain, type, protocol);
58 if (fd == -1)
59 return -1;
60
61 ::fcntl(fd, F_SETFD, FD_CLOEXEC);
62
63 // set non-block too?
64 if (flags & O_NONBLOCK)
65 ::fcntl(fd, F_SETFL, ::fcntl(fd, F_GETFL) | O_NONBLOCK);
66
67 return fd;
68#endif
69}
70
71static inline int qt_safe_accept(int s, struct sockaddr *addr, QT_SOCKLEN_T *addrlen, int flags = 0)
72{
73 Q_ASSERT((flags & ~O_NONBLOCK) == 0);
74
75 int fd;
76#ifdef QT_THREADSAFE_CLOEXEC
77 // use accept4
78 int sockflags = SOCK_CLOEXEC;
79 if (flags & O_NONBLOCK)
80 sockflags |= SOCK_NONBLOCK;
81# if defined(Q_OS_NETBSD)
82 fd = ::paccept(s, addr, static_cast<QT_SOCKLEN_T *>(addrlen), NULL, sockflags);
83# else
84 fd = ::accept4(s, addr, static_cast<QT_SOCKLEN_T *>(addrlen), sockflags);
85# endif
86 return fd;
87#else
88 fd = ::accept(s, addr, static_cast<QT_SOCKLEN_T *>(addrlen));
89 if (fd == -1)
90 return -1;
91
92 ::fcntl(fd, F_SETFD, FD_CLOEXEC);
93
94 // set non-block too?
95 if (flags & O_NONBLOCK)
96 ::fcntl(fd, F_SETFL, ::fcntl(fd, F_GETFL) | O_NONBLOCK);
97
98 return fd;
99#endif
100}
101
102static inline int qt_safe_listen(int s, int backlog)
103{
104 return ::listen(s, backlog);
105}
106
107static inline int qt_safe_connect(int sockfd, const struct sockaddr *addr, QT_SOCKLEN_T addrlen)
108{
109 int ret;
110 // Solaris e.g. expects a non-const 2nd parameter
111 QT_EINTR_LOOP(ret, QT_SOCKET_CONNECT(sockfd, const_cast<struct sockaddr *>(addr), addrlen));
112 return ret;
113}
114#undef QT_SOCKET_CONNECT
115#define QT_SOCKET_CONNECT qt_safe_connect
116
117#if defined(socket)
118# undef socket
119#endif
120#if defined(accept)
121# undef accept
122#endif
123#if defined(listen)
124# undef listen
125#endif
126
127template <typename T>
128static inline int qt_safe_ioctl(int sockfd, unsigned long request, T arg)
129{
130 return ::ioctl(sockfd, request, arg);
131}
132
133static inline int qt_safe_sendmsg(int sockfd, const struct msghdr *msg, int flags)
134{
135#ifdef MSG_NOSIGNAL
136 flags |= MSG_NOSIGNAL;
137#else
139#endif
140
141 int ret;
142 QT_EINTR_LOOP(ret, ::sendmsg(sockfd, msg, flags));
143 return ret;
144}
145
146static inline int qt_safe_recvmsg(int sockfd, struct msghdr *msg, int flags)
147{
148 int ret;
149
150 QT_EINTR_LOOP(ret, ::recvmsg(sockfd, msg, flags));
151 return ret;
152}
153
155
156#endif // QNET_UNIX_P_H
Combined button and popup list for selecting options.
QT_BEGIN_NAMESPACE void qt_ignore_sigpipe() noexcept
#define QT_EINTR_LOOP(var, cmd)
return ret
static int qt_safe_ioctl(int sockfd, unsigned long request, T arg)
#define QT_SOCKET_CONNECT
static int qt_safe_listen(int s, int backlog)
static int qt_safe_sendmsg(int sockfd, const struct msghdr *msg, int flags)
static int qt_safe_socket(int domain, int type, int protocol, int flags=0)
Definition qnet_unix_p.h:45
static int qt_safe_accept(int s, struct sockaddr *addr, QT_SOCKLEN_T *addrlen, int flags=0)
Definition qnet_unix_p.h:71
static int qt_safe_recvmsg(int sockfd, struct msghdr *msg, int flags)
static int qt_safe_connect(int sockfd, const struct sockaddr *addr, QT_SOCKLEN_T addrlen)
GLenum type
GLbitfield flags
GLuint64 GLenum GLint fd
GLdouble s
[6]
Definition qopenglext.h:235
GLenum const void * addr
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
SSL_CTX int void * arg
QTcpSocket * socket
[1]
QNetworkRequest request(url)