posix: fixed lib/platform/sockets/tcp.h compilation and some bugs. added CTcpSocket...
[deb_libcec.git] / src / lib / platform / posix / os-tcp.h
CommitLineData
0e51267b
LOK
1#pragma once
2/*
3 * This file is part of the libCEC(R) library.
4 *
9b53a148 5 * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved.
0e51267b
LOK
6 * libCEC(R) is an original work, containing original code.
7 *
8 * libCEC(R) is a trademark of Pulse-Eight Limited.
9 *
10 * This program is dual-licensed; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 *
24 *
25 * Alternatively, you can license this library under a commercial license,
26 * please contact Pulse-Eight Licensing for more information.
27 *
28 * For more information contact:
29 * Pulse-Eight Licensing <license@pulse-eight.com>
30 * http://www.pulse-eight.com/
31 * http://www.pulse-eight.net/
32 */
33
34#include "../os.h"
35#include "../sockets/socket.h"
36
cb2397e9
LOK
37#include <sys/socket.h>
38#include <netinet/in.h>
39#include <netinet/tcp.h>
40#include <arpa/inet.h>
41#include <netdb.h>
42#include <poll.h>
43
0e51267b
LOK
44namespace PLATFORM
45{
cb2397e9
LOK
46 inline void TcpShutdownSocket(socket_t socket)
47 {
48 shutdown(socket, SHUT_RDWR);
49 }
50
0e51267b
LOK
51 inline int TcpGetSocketError(socket_t socket)
52 {
53 int iReturn(0);
54 socklen_t optLen = sizeof(socket_t);
55 getsockopt(socket, SOL_SOCKET, SO_ERROR, (void *)&iReturn, &optLen);
56 return iReturn;
57 }
58
59 inline bool TcpSetNoDelay(socket_t socket)
60 {
61 int iSetTo(1);
62 setsockopt(socket, SOL_TCP, TCP_NODELAY, &iSetTo, sizeof(iSetTo));
63 return true;
64 }
65
66 inline bool TcpConnectSocket(socket_t socket, struct addrinfo* addr, int *iError, uint64_t iTimeout = 0)
67 {
68 bool bConnected = (connect(socket, addr->ai_addr, addr->ai_addrlen) == 0);
69 if (!bConnected && errno == EINPROGRESS)
70 {
71 struct pollfd pfd;
72 pfd.fd = socket;
73 pfd.events = POLLOUT;
74 pfd.revents = 0;
75
76 int iPollResult = poll(&pfd, 1, iTimeout);
77 if (iPollResult == 0)
78 *iError = ETIMEDOUT;
79 else if (iPollResult == -1)
80 *iError = errno;
81 else
cb2397e9
LOK
82 bConnected = true;
83 }
84 else
85 {
86 *iError = errno;
0e51267b
LOK
87 }
88
89 return bConnected;
90 }
91
cb2397e9 92 inline bool TcpResolveAddress(const char *strHost, uint16_t iPort, int *iError, struct addrinfo **info)
0e51267b
LOK
93 {
94 struct addrinfo hints;
95 char service[33];
96 memset(&hints, 0, sizeof(hints));
97 hints.ai_family = AF_UNSPEC;
98 hints.ai_socktype = SOCK_STREAM;
99 hints.ai_protocol = IPPROTO_TCP;
100 sprintf(service, "%d", iPort);
101
cb2397e9
LOK
102 *iError = getaddrinfo(strHost, service, &hints, info);
103 return !(*iError);
0e51267b
LOK
104 }
105}