Commit 0f1d2b904a15d01bf653b3b1f3e8b5f1c20e1b20
1 parent
3f373aab
use new SizedData from trbase and remove automatic cast.
Showing
9 changed files
with
91 additions
and
130 deletions
... | ... | @@ -33,17 +33,16 @@ |
33 | 33 | #include "tr/socket.h" |
34 | 34 | |
35 | 35 | TR_CLASS(TR_RemoteData) { |
36 | - unsigned char * data; | |
37 | - size_t ndata; | |
38 | - TR_Socket socket; | |
36 | + TR_EXTENDS(TR_SizedData); | |
37 | + | |
38 | + TR_Socket remote; // TR_Socket might become a more abstract TR_Remote one day. | |
39 | + int free_remote; | |
39 | 40 | }; |
40 | 41 | TR_INSTANCE_INIT(TR_RemoteData); |
41 | 42 | TR_CLASSVARS_DECL(TR_RemoteData) {}; |
42 | 43 | |
43 | 44 | extern TR_RemoteData TR_emptyRemoteData; |
44 | 45 | |
45 | -void TR_remoteDataSetData(TR_RemoteData, unsigned char *, size_t); | |
46 | - | |
47 | 46 | #endif // __TR_REMOTE_DATA_H__ |
48 | 47 | |
49 | 48 | // vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -67,47 +67,50 @@ TR_CLASS(TR_Socket) { |
67 | 67 | TR_INSTANCE_INIT(TR_Socket); |
68 | 68 | TR_CLASSVARS_DECL(TR_Socket) {}; |
69 | 69 | |
70 | -#define TR_socketLog(socket) (((TR_Socket)(socket))->log) | |
71 | -#define TR_socketFlags(socket) (((TR_Socket)(socket))->flags) | |
72 | -#define TR_socketType(socket) (((TR_Socket)(socket))->type) | |
73 | -#define TR_socketHost(socket) (((TR_Socket)(socket))->host) | |
74 | -#define TR_socketPort(socket) (((TR_Socket)(socket))->port) | |
75 | -#define TR_socketCname(socket) (((TR_Socket)(socket))->cname) | |
76 | -#define TR_socketTtl(socket) (((TR_Socket)(socket))->ttl) | |
77 | -#define TR_socketAddr(socket) ((void *)&((TR_Socket)(socket))->addr) | |
78 | -#define TR_socketAddrlen(socket) (((TR_Socket)(socket))->addrlen) | |
79 | -#define TR_socketHandle(socket) (((TR_Socket)(socket))->handle) | |
80 | -#define TR_socketFinState(socket) (((TR_Socket)(socket))->fin_state) | |
81 | -#define TR_socketFinRd(socket) ((TR_socketFinState((socket)) & 1) == 1) | |
82 | -#define TR_socketFinWr(socket) ((TR_socketFinState((socket)) & 2) == 2) | |
83 | -#define TR_socketFinRdWr(socket) ((TR_socketFinState((socket)) & 3) == 3) | |
84 | - | |
85 | -#define TR_socketAddrPort(socket) \ | |
86 | - (((TR_Socket)(socket))->addr.info.sa_family == AF_INET \ | |
87 | - ? ((TR_Socket)(socket))->addr.in.sin_port \ | |
88 | - : ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \ | |
89 | - ? ((TR_Socket)(socket))->addr.in6.sin6_port \ | |
70 | +#define TR_socketLog(socket) ((socket)->log) | |
71 | +#define TR_socketFlags(socket) ((socket)->flags) | |
72 | +#define TR_socketType(socket) ((socket)->type) | |
73 | +#define TR_socketHost(socket) ((socket)->host) | |
74 | +#define TR_socketPort(socket) ((socket)->port) | |
75 | +#define TR_socketCname(socket) ((socket)->cname) | |
76 | +#define TR_socketTtl(socket) ((socket)->ttl) | |
77 | +#define TR_socketAddr(socket) ((void *)&(socket)->addr) | |
78 | +#define TR_socketAddrlen(socket) ((socket)->addrlen) | |
79 | +#define TR_socketHandle(socket) ((socket)->handle) | |
80 | +#define TR_socketFinState(socket) ((socket)->fin_state) | |
81 | +#define TR_socketFinRd(socket) \ | |
82 | + ((TR_socketFinState(socket) & TR_FIN_RD) == TR_FIN_RD) | |
83 | +#define TR_socketFinWr(socket) \ | |
84 | + ((TR_socketFinState(socket) & TR_FIN_WR) == TR_FIN_WR) | |
85 | +#define TR_socketFinRdWr(socket) \ | |
86 | + ((TR_socketFinState(socket) & TR_FIN_RDWR) == TR_FIN_RDWR) | |
87 | + | |
88 | +#define TR_socketAddrPort(socket) \ | |
89 | + ((socket)->addr.info.sa_family == AF_INET \ | |
90 | + ? (socket)->addr.in.sin_port \ | |
91 | + : (socket)->addr.info.sa_family == AF_INET6 \ | |
92 | + ? (socket)->addr.in6.sin6_port \ | |
90 | 93 | : 0) |
91 | 94 | |
92 | -#define TR_socketAddrIp(socket) \ | |
93 | - (((TR_Socket)(socket))->addr.info.sa_family == AF_INET \ | |
94 | - ? (void *)&((TR_Socket)(socket))->addr.in.sin_addr.s_addr \ | |
95 | - : ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \ | |
96 | - ? (void *)&((TR_Socket)(socket))->addr.in6.sin6_addr.s6_addr \ | |
95 | +#define TR_socketAddrIp(socket) \ | |
96 | + ((socket)->addr.info.sa_family == AF_INET \ | |
97 | + ? (void *)&(socket)->addr.in.sin_addr.s_addr \ | |
98 | + : (socket)->addr.info.sa_family == AF_INET6 \ | |
99 | + ? (void *)&(socket)->addr.in6.sin6_addr.s6_addr \ | |
97 | 100 | : NULL) |
98 | 101 | |
99 | -#define TR_socketAddrIplen(socket) \ | |
100 | - (((TR_Socket)(socket))->addr.info.sa_family == AF_INET \ | |
101 | - ? sizeof(((TR_Socket)(socket))->addr.in.sin_addr) \ | |
102 | - : ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \ | |
103 | - ? sizeof(((TR_Socket)(socket))->addr.in6.sin6_addr) \ | |
102 | +#define TR_socketAddrIplen(socket) \ | |
103 | + ((socket)->addr.info.sa_family == AF_INET \ | |
104 | + ? sizeof((socket)->addr.in.sin_addr) \ | |
105 | + : (socket)->addr.info.sa_family == AF_INET6 \ | |
106 | + ? sizeof((socket)->addr.in6.sin6_addr) \ | |
104 | 107 | : 0) |
105 | 108 | |
106 | -#define TR_socketAddrIpStr(socket, buffer, nbuffer) \ | |
107 | - if (TR_socketAddrIp((socket))) \ | |
108 | - inet_ntop( \ | |
109 | - ((TR_Socket)(socket))->addr.info.sa_family, \ | |
110 | - TR_socketAddrIp((socket)), \ | |
109 | +#define TR_socketAddrIpStr(socket, buffer, nbuffer) \ | |
110 | + if (TR_socketAddrIp((socket))) \ | |
111 | + inet_ntop( \ | |
112 | + (socket)->addr.info.sa_family, \ | |
113 | + TR_socketAddrIp((socket)), \ | |
111 | 114 | buffer, nbuffer) |
112 | 115 | |
113 | 116 | TR_CLASS(TR_TcpSocket) { | ... | ... |
... | ... | @@ -55,7 +55,7 @@ TR_socketRecv(void * _this, size_t size) |
55 | 55 | |
56 | 56 | TR_RETCALL(_this, TR_Socket, recv, remote_data, size); |
57 | 57 | |
58 | - if (remote_data->ndata < 0) { | |
58 | + if (((TR_SizedData)remote_data)->size < 0) { | |
59 | 59 | switch (errno) { |
60 | 60 | case (EAGAIN|EWOULDBLOCK): |
61 | 61 | TR_delete(remote_data); |
... | ... | @@ -72,7 +72,7 @@ TR_socketRecv(void * _this, size_t size) |
72 | 72 | TR_delete(remote_data); |
73 | 73 | return NULL; |
74 | 74 | } |
75 | - } else if (remote_data->ndata == 0) { | |
75 | + } else if (((TR_SizedData)remote_data)->size == 0) { | |
76 | 76 | // this is a remote close... |
77 | 77 | TR_delete(remote_data); |
78 | 78 | return NULL; | ... | ... |
... | ... | @@ -31,6 +31,7 @@ |
31 | 31 | #include <netdb.h> |
32 | 32 | |
33 | 33 | #include "trbase.h" |
34 | + | |
34 | 35 | #include "tr/remote_data.h" |
35 | 36 | #include "tr/socket.h" |
36 | 37 | |
... | ... | @@ -38,28 +39,25 @@ static |
38 | 39 | int |
39 | 40 | remoteDataCtor(void * _this, va_list * params) |
40 | 41 | { |
41 | - TR_RemoteData this = _this; | |
42 | - | |
43 | - this->socket = va_arg(*params, TR_Socket); | |
44 | - | |
45 | - this->data = NULL; | |
46 | - this->ndata = 0; | |
42 | + TR_PARENTCALL(_this, TR_Class, ctor, params); | |
43 | + ((TR_RemoteData)_this)->remote = va_arg(*params, TR_Socket); | |
47 | 44 | |
48 | 45 | return 0; |
49 | 46 | } |
50 | 47 | |
51 | 48 | static |
52 | 49 | void |
53 | -remoteDataDtor(void * _this) | |
54 | -{ | |
55 | - TR_RemoteData this = _this; | |
50 | +remoteDataDtor(void * _this) { | |
51 | + TR_PARENTCALL(_this, TR_Class, dtor); | |
56 | 52 | |
57 | - TR_MEM_FREE(this->data); | |
53 | + if (((TR_RemoteData)_this)->free_remote) { | |
54 | + TR_delete(((TR_RemoteData)_this)->remote); | |
55 | + } | |
58 | 56 | } |
59 | 57 | |
60 | 58 | TR_INIT_IFACE(TR_Class, remoteDataCtor, remoteDataDtor, NULL); |
61 | -TR_CREATE_CLASS(TR_RemoteData, NULL, NULL, TR_IF(TR_Class)); | |
59 | +TR_CREATE_CLASS(TR_RemoteData, TR_SizedData, NULL, TR_IF(TR_Class)); | |
62 | 60 | |
63 | -TR_INSTANCE(TR_RemoteData, TR_emptyRemoteData, NULL, 0, NULL, NULL); | |
61 | +TR_INSTANCE(TR_RemoteData, TR_emptyRemoteData, { NULL, 0 }, NULL); | |
64 | 62 | |
65 | 63 | // vim: set ts=4 sw=4: | ... | ... |
src/remote_data_set_data.c
deleted
100644 → 0
1 | -/** | |
2 | - * \file | |
3 | - * | |
4 | - * \author Georg Hopp | |
5 | - * | |
6 | - * \copyright | |
7 | - * Copyright © 2014 Georg Hopp | |
8 | - * | |
9 | - * This program is free software: you can redistribute it and/or modify | |
10 | - * it under the terms of the GNU General Public License as published by | |
11 | - * the Free Software Foundation, either version 3 of the License, or | |
12 | - * (at your option) any later version. | |
13 | - * | |
14 | - * This program is distributed in the hope that it will be useful, | |
15 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | - * GNU General Public License for more details. | |
18 | - * | |
19 | - * You should have received a copy of the GNU General Public License | |
20 | - * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 | - */ | |
22 | - | |
23 | -#include <string.h> // for atoi() and exit() | |
24 | -#include <errno.h> // for errno | |
25 | -#include <stdio.h> | |
26 | -#include <unistd.h> | |
27 | - | |
28 | -#include "tr/remote_data.h" | |
29 | -#include "tr/logger.h" | |
30 | - | |
31 | -void | |
32 | -TR_remoteDataSetData(TR_RemoteData this, unsigned char * data, size_t size) | |
33 | -{ | |
34 | - if (this->data && TR_getSize(this->data) < size) { | |
35 | - TR_MEM_FREE(this->data); | |
36 | - } | |
37 | - | |
38 | - if (! this->data) { | |
39 | - this->data = TR_malloc(size); | |
40 | - } | |
41 | - | |
42 | - this->ndata = size; | |
43 | - memcpy(this->data, data, size); | |
44 | -} | |
45 | - | |
46 | -// vim: set ts=4 sw=4: |
... | ... | @@ -40,12 +40,13 @@ |
40 | 40 | TR_TcpSocket |
41 | 41 | TR_socketAccept(TR_TcpSocket this) |
42 | 42 | { |
43 | - TR_Socket remote = TR_new(TR_TcpSocket, TR_socketLog(this), NULL, 0, 0); | |
43 | + TR_Socket remote = | |
44 | + TR_new(TR_TcpSocket, TR_socketLog((TR_Socket)this), NULL, 0, 0); | |
44 | 45 | //int flags; |
45 | 46 | |
46 | 47 | remote->addrlen = ((TR_Socket)this)->addrlen; |
47 | 48 | remote->handle = accept( |
48 | - TR_socketHandle(this), | |
49 | + TR_socketHandle((TR_Socket)this), | |
49 | 50 | &(remote->addr.info), |
50 | 51 | &(remote->addrlen)); |
51 | 52 | |
... | ... | @@ -58,8 +59,8 @@ TR_socketAccept(TR_TcpSocket this) |
58 | 59 | } else { |
59 | 60 | TR_socketAddrIpStr(remote, remote->host, TR_MAX_HOST); |
60 | 61 | remote->port = TR_socketAddrPort(remote); |
61 | - remote->type = TR_socketType(this); | |
62 | - remote->flags = TR_socketFlags(this); | |
62 | + remote->type = TR_socketType((TR_Socket)this); | |
63 | + remote->flags = TR_socketFlags((TR_Socket)this); | |
63 | 64 | } |
64 | 65 | |
65 | 66 | return (TR_TcpSocket)remote; | ... | ... |
... | ... | @@ -42,9 +42,9 @@ tcpSocketCtor(void * _this, va_list * params) |
42 | 42 | |
43 | 43 | TR_PARENTCALL(_this, TR_Class, ctor, params); |
44 | 44 | |
45 | - TR_socketType(this) = SOCK_STREAM; | |
46 | - this->listen = FALSE; | |
47 | - this->connected = FALSE; | |
45 | + TR_socketType((TR_Socket)this) = SOCK_STREAM; | |
46 | + this->listen = FALSE; | |
47 | + this->connected = FALSE; | |
48 | 48 | |
49 | 49 | return 0; |
50 | 50 | } |
... | ... | @@ -62,7 +62,7 @@ tcpSocketBind(void * _this) |
62 | 62 | return -1; |
63 | 63 | } |
64 | 64 | |
65 | - if (listen(TR_socketHandle(this), SOMAXCONN) != 0) { | |
65 | + if (listen(TR_socketHandle((TR_Socket)this), SOMAXCONN) != 0) { | |
66 | 66 | // error |
67 | 67 | return -1; |
68 | 68 | } |
... | ... | @@ -76,28 +76,29 @@ int |
76 | 76 | tcpSocketConnect(void * _this) |
77 | 77 | { |
78 | 78 | TR_Socket this = _this; |
79 | - | |
80 | - return connect( | |
79 | + int retval = connect( | |
81 | 80 | this->handle, |
82 | 81 | (struct sockaddr *)&(this->addr), |
83 | 82 | this->addrlen); |
83 | + | |
84 | + ((TR_TcpSocket)_this)->connected = TRUE; | |
85 | + return retval; | |
84 | 86 | } |
85 | 87 | |
86 | 88 | static |
87 | 89 | TR_RemoteData |
88 | 90 | tcpSocketRecv(TR_Socket this, size_t size) |
89 | 91 | { |
90 | - TR_RemoteData rdata = TR_new(TR_RemoteData, &(this->addr), this->addrlen); | |
92 | + TR_RemoteData rdata = NULL; | |
91 | 93 | unsigned char buffer[size]; |
92 | 94 | ssize_t received; |
93 | 95 | |
94 | 96 | received = recv(this->handle, buffer, size, this->flags); |
95 | 97 | |
96 | 98 | if (-1 == received) { |
97 | - perror("recv"); | |
98 | - TR_delete(rdata); | |
99 | + rdata = TR_new(TR_RemoteData, NULL, received, this); | |
99 | 100 | } else { |
100 | - TR_remoteDataSetData(rdata, buffer, received); | |
101 | + rdata = TR_new(TR_RemoteData, buffer, received, this); | |
101 | 102 | } |
102 | 103 | |
103 | 104 | return rdata; |
... | ... | @@ -107,7 +108,11 @@ static |
107 | 108 | ssize_t |
108 | 109 | tcpSocketSend(TR_Socket this, TR_RemoteData data) |
109 | 110 | { |
110 | - return send(this->handle, data->data, data->ndata, this->flags); | |
111 | + return send( | |
112 | + this->handle, | |
113 | + ((TR_SizedData)data)->data, | |
114 | + ((TR_SizedData)data)->size, | |
115 | + this->flags); | |
111 | 116 | } |
112 | 117 | |
113 | 118 | TR_INIT_IFACE(TR_Class, tcpSocketCtor, NULL, NULL); | ... | ... |
... | ... | @@ -51,27 +51,29 @@ static |
51 | 51 | TR_RemoteData |
52 | 52 | udpSocketRecv(TR_Socket this, size_t size) |
53 | 53 | { |
54 | - TR_RemoteData rdata; | |
55 | - struct sockaddr_in addr; | |
56 | - socklen_t addrlen = this->addrlen; | |
57 | - unsigned char buffer[size]; | |
58 | - ssize_t received; | |
54 | + unsigned char buffer[size]; | |
55 | + ssize_t received; | |
56 | + TR_RemoteData rdata; | |
57 | + TR_Socket remote = TR_new(TR_UdpSocket, TR_socketLog(this), NULL, 0, 0); | |
58 | + | |
59 | + remote->addrlen = this->addrlen; | |
59 | 60 | |
60 | 61 | received = recvfrom( |
61 | 62 | this->handle, |
62 | 63 | buffer, |
63 | 64 | size, |
64 | 65 | this->flags, |
65 | - (struct sockaddr *)&addr, | |
66 | - &addrlen); | |
66 | + (struct sockaddr *)&(remote->addr), | |
67 | + &remote->addrlen); | |
67 | 68 | |
68 | 69 | if (-1 == received) { |
69 | - perror("recvfrom"); | |
70 | + rdata = TR_new(TR_RemoteData, NULL, received, remote); | |
70 | 71 | } else { |
71 | - rdata = TR_new(TR_RemoteData, &addr, addrlen); | |
72 | - TR_remoteDataSetData(rdata, buffer, received); | |
72 | + rdata = TR_new(TR_RemoteData, buffer, received, remote); | |
73 | 73 | } |
74 | 74 | |
75 | + rdata->free_remote = 1; | |
76 | + | |
75 | 77 | return rdata; |
76 | 78 | } |
77 | 79 | |
... | ... | @@ -83,11 +85,11 @@ udpSocketSend(TR_Socket this, TR_RemoteData data) |
83 | 85 | |
84 | 86 | send = sendto( |
85 | 87 | this->handle, |
86 | - data->data, | |
87 | - data->ndata, | |
88 | + ((TR_SizedData)data)->data, | |
89 | + ((TR_SizedData)data)->size, | |
88 | 90 | this->flags, |
89 | - &(data->socket->addr.info), | |
90 | - data->socket->addrlen); | |
91 | + &(data->remote->addr.info), | |
92 | + data->remote->addrlen); | |
91 | 93 | |
92 | 94 | if (-1 == send) { |
93 | 95 | perror("sendto"); | ... | ... |
Please
register
or
login
to post a comment