forked from manio/vdr-plugin-dvbapi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUDPSocket.cpp
More file actions
124 lines (116 loc) · 3.25 KB
/
UDPSocket.cpp
File metadata and controls
124 lines (116 loc) · 3.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
* vdr-plugin-dvbapi - softcam dvbapi plugin for VDR
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <linux/ioctl.h>
#include "UDPSocket.h"
#include "Log.h"
static UDPSocket *me = 0;
bool UDPSocket::bindx(SCCIAdapter *sCCIAdapter)
{
me = new UDPSocket(sCCIAdapter);
if (me->bint)
me->Start();
return me->bint;
}
UDPSocket::~UDPSocket()
{
bint = false;
close(sock);
}
UDPSocket::UDPSocket(SCCIAdapter *sCCIAdapter)
{
DEBUGLOG("%s", __FUNCTION__);
this->sCCIAdapter = sCCIAdapter;
struct sockaddr_in socketAddr;
memset(&socketAddr, 0, sizeof(sockaddr_in));
const struct hostent *const hostaddr = gethostbyname("127.0.0.1");
if (hostaddr)
{
unsigned int port;
port = 9000 + sCCIAdapter->Adapter();
DEBUGLOG("%s: Adapter %d\n", __FUNCTION__, sCCIAdapter->Adapter());
DEBUGLOG("%s: hostaddr port %d", __FUNCTION__, port);
socketAddr.sin_family = AF_INET;
socketAddr.sin_port = htons(port);
socketAddr.sin_addr.s_addr = ((struct in_addr *) hostaddr->h_addr)->s_addr;
sock = socket(PF_INET, SOCK_DGRAM, 0);
if (sock > 0)
{
bint = (bind(sock, (struct sockaddr *) &socketAddr, sizeof(socketAddr)) >= 0);
if (bint >= 0)
DEBUGLOG("%s: bint=%d", __FUNCTION__, bint);
else
ERRORLOG("%s: bind failed: %s", __FUNCTION__, strerror(errno));
}
else
ERRORLOG("%s: socket failed: %s", __FUNCTION__, strerror(errno));
}
else
ERRORLOG("%s: gethostbyname failed", __FUNCTION__);
}
void UDPSocket::unbind(void)
{
delete(me);
}
void UDPSocket::Action(void)
{
DEBUGLOG("%s", __FUNCTION__);
while (bint)
{
unsigned int r = 0;
int request = 0;
while (r < sizeof(request))
{
int cRead = read(sock, (&request) + r, sizeof(request));
if (cRead <= 0)
break;
r = +cRead;
}
if (request == CA_SET_DESCR)
{
while (r < sizeof(ca_descr_t))
{
r = 0;
int cRead = read(sock, (&ca_descr) + r, sizeof(ca_descr_t));
if (cRead <= 0)
break;
r = +cRead;
}
if (r == sizeof(ca_descr_t))
{
DEBUGLOG("%s: Got CA_SET_DESCR request", __FUNCTION__);
sCCIAdapter->DeCSASetCaDescr(&ca_descr);
}
}
if (request == CA_SET_PID)
{
r = 0;
while (r < sizeof(ca_pid_t))
{
int cRead = read(sock, (&ca_pid) + r, sizeof(ca_pid_t));
if (cRead <= 0)
break;
r = +cRead;
}
if (r == sizeof(ca_pid_t))
{
DEBUGLOG("%s: Got CA_SET_PID request", __FUNCTION__);
sCCIAdapter->DeCSASetCaPid(&ca_pid);
}
}
}
}