Commit 0f1d2b904a15d01bf653b3b1f3e8b5f1c20e1b20

Authored by Georg Hopp
1 parent 3f373aab

use new SizedData from trbase and remove automatic cast.

@@ -33,17 +33,16 @@ @@ -33,17 +33,16 @@
33 #include "tr/socket.h" 33 #include "tr/socket.h"
34 34
35 TR_CLASS(TR_RemoteData) { 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 TR_INSTANCE_INIT(TR_RemoteData); 41 TR_INSTANCE_INIT(TR_RemoteData);
41 TR_CLASSVARS_DECL(TR_RemoteData) {}; 42 TR_CLASSVARS_DECL(TR_RemoteData) {};
42 43
43 extern TR_RemoteData TR_emptyRemoteData; 44 extern TR_RemoteData TR_emptyRemoteData;
44 45
45 -void TR_remoteDataSetData(TR_RemoteData, unsigned char *, size_t);  
46 -  
47 #endif // __TR_REMOTE_DATA_H__ 46 #endif // __TR_REMOTE_DATA_H__
48 47
49 // vim: set ts=4 sw=4: 48 // vim: set ts=4 sw=4:
@@ -67,47 +67,50 @@ TR_CLASS(TR_Socket) { @@ -67,47 +67,50 @@ TR_CLASS(TR_Socket) {
67 TR_INSTANCE_INIT(TR_Socket); 67 TR_INSTANCE_INIT(TR_Socket);
68 TR_CLASSVARS_DECL(TR_Socket) {}; 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 : 0) 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 : NULL) 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 : 0) 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 buffer, nbuffer) 114 buffer, nbuffer)
112 115
113 TR_CLASS(TR_TcpSocket) { 116 TR_CLASS(TR_TcpSocket) {
@@ -17,7 +17,6 @@ TRIO = stream.c \ @@ -17,7 +17,6 @@ TRIO = stream.c \
17 tcp_socket.c \ 17 tcp_socket.c \
18 udp_socket.c \ 18 udp_socket.c \
19 remote_data.c \ 19 remote_data.c \
20 - remote_data_set_data.c \  
21 i_socket.c \ 20 i_socket.c \
22 i_reader.c \ 21 i_reader.c \
23 i_writer.c 22 i_writer.c
@@ -55,7 +55,7 @@ TR_socketRecv(void * _this, size_t size) @@ -55,7 +55,7 @@ TR_socketRecv(void * _this, size_t size)
55 55
56 TR_RETCALL(_this, TR_Socket, recv, remote_data, size); 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 switch (errno) { 59 switch (errno) {
60 case (EAGAIN|EWOULDBLOCK): 60 case (EAGAIN|EWOULDBLOCK):
61 TR_delete(remote_data); 61 TR_delete(remote_data);
@@ -72,7 +72,7 @@ TR_socketRecv(void * _this, size_t size) @@ -72,7 +72,7 @@ TR_socketRecv(void * _this, size_t size)
72 TR_delete(remote_data); 72 TR_delete(remote_data);
73 return NULL; 73 return NULL;
74 } 74 }
75 - } else if (remote_data->ndata == 0) { 75 + } else if (((TR_SizedData)remote_data)->size == 0) {
76 // this is a remote close... 76 // this is a remote close...
77 TR_delete(remote_data); 77 TR_delete(remote_data);
78 return NULL; 78 return NULL;
@@ -31,6 +31,7 @@ @@ -31,6 +31,7 @@
31 #include <netdb.h> 31 #include <netdb.h>
32 32
33 #include "trbase.h" 33 #include "trbase.h"
  34 +
34 #include "tr/remote_data.h" 35 #include "tr/remote_data.h"
35 #include "tr/socket.h" 36 #include "tr/socket.h"
36 37
@@ -38,28 +39,25 @@ static @@ -38,28 +39,25 @@ static
38 int 39 int
39 remoteDataCtor(void * _this, va_list * params) 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 return 0; 45 return 0;
49 } 46 }
50 47
51 static 48 static
52 void 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 TR_INIT_IFACE(TR_Class, remoteDataCtor, remoteDataDtor, NULL); 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 // vim: set ts=4 sw=4: 63 // vim: set ts=4 sw=4:
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,12 +40,13 @@
40 TR_TcpSocket 40 TR_TcpSocket
41 TR_socketAccept(TR_TcpSocket this) 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 //int flags; 45 //int flags;
45 46
46 remote->addrlen = ((TR_Socket)this)->addrlen; 47 remote->addrlen = ((TR_Socket)this)->addrlen;
47 remote->handle = accept( 48 remote->handle = accept(
48 - TR_socketHandle(this), 49 + TR_socketHandle((TR_Socket)this),
49 &(remote->addr.info), 50 &(remote->addr.info),
50 &(remote->addrlen)); 51 &(remote->addrlen));
51 52
@@ -58,8 +59,8 @@ TR_socketAccept(TR_TcpSocket this) @@ -58,8 +59,8 @@ TR_socketAccept(TR_TcpSocket this)
58 } else { 59 } else {
59 TR_socketAddrIpStr(remote, remote->host, TR_MAX_HOST); 60 TR_socketAddrIpStr(remote, remote->host, TR_MAX_HOST);
60 remote->port = TR_socketAddrPort(remote); 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 return (TR_TcpSocket)remote; 66 return (TR_TcpSocket)remote;
@@ -42,9 +42,9 @@ tcpSocketCtor(void * _this, va_list * params) @@ -42,9 +42,9 @@ tcpSocketCtor(void * _this, va_list * params)
42 42
43 TR_PARENTCALL(_this, TR_Class, ctor, params); 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 return 0; 49 return 0;
50 } 50 }
@@ -62,7 +62,7 @@ tcpSocketBind(void * _this) @@ -62,7 +62,7 @@ tcpSocketBind(void * _this)
62 return -1; 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 // error 66 // error
67 return -1; 67 return -1;
68 } 68 }
@@ -76,28 +76,29 @@ int @@ -76,28 +76,29 @@ int
76 tcpSocketConnect(void * _this) 76 tcpSocketConnect(void * _this)
77 { 77 {
78 TR_Socket this = _this; 78 TR_Socket this = _this;
79 -  
80 - return connect( 79 + int retval = connect(
81 this->handle, 80 this->handle,
82 (struct sockaddr *)&(this->addr), 81 (struct sockaddr *)&(this->addr),
83 this->addrlen); 82 this->addrlen);
  83 +
  84 + ((TR_TcpSocket)_this)->connected = TRUE;
  85 + return retval;
84 } 86 }
85 87
86 static 88 static
87 TR_RemoteData 89 TR_RemoteData
88 tcpSocketRecv(TR_Socket this, size_t size) 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 unsigned char buffer[size]; 93 unsigned char buffer[size];
92 ssize_t received; 94 ssize_t received;
93 95
94 received = recv(this->handle, buffer, size, this->flags); 96 received = recv(this->handle, buffer, size, this->flags);
95 97
96 if (-1 == received) { 98 if (-1 == received) {
97 - perror("recv");  
98 - TR_delete(rdata); 99 + rdata = TR_new(TR_RemoteData, NULL, received, this);
99 } else { 100 } else {
100 - TR_remoteDataSetData(rdata, buffer, received); 101 + rdata = TR_new(TR_RemoteData, buffer, received, this);
101 } 102 }
102 103
103 return rdata; 104 return rdata;
@@ -107,7 +108,11 @@ static @@ -107,7 +108,11 @@ static
107 ssize_t 108 ssize_t
108 tcpSocketSend(TR_Socket this, TR_RemoteData data) 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 TR_INIT_IFACE(TR_Class, tcpSocketCtor, NULL, NULL); 118 TR_INIT_IFACE(TR_Class, tcpSocketCtor, NULL, NULL);
@@ -51,27 +51,29 @@ static @@ -51,27 +51,29 @@ static
51 TR_RemoteData 51 TR_RemoteData
52 udpSocketRecv(TR_Socket this, size_t size) 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 received = recvfrom( 61 received = recvfrom(
61 this->handle, 62 this->handle,
62 buffer, 63 buffer,
63 size, 64 size,
64 this->flags, 65 this->flags,
65 - (struct sockaddr *)&addr,  
66 - &addrlen); 66 + (struct sockaddr *)&(remote->addr),
  67 + &remote->addrlen);
67 68
68 if (-1 == received) { 69 if (-1 == received) {
69 - perror("recvfrom"); 70 + rdata = TR_new(TR_RemoteData, NULL, received, remote);
70 } else { 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 return rdata; 77 return rdata;
76 } 78 }
77 79
@@ -83,11 +85,11 @@ udpSocketSend(TR_Socket this, TR_RemoteData data) @@ -83,11 +85,11 @@ udpSocketSend(TR_Socket this, TR_RemoteData data)
83 85
84 send = sendto( 86 send = sendto(
85 this->handle, 87 this->handle,
86 - data->data,  
87 - data->ndata, 88 + ((TR_SizedData)data)->data,
  89 + ((TR_SizedData)data)->size,
88 this->flags, 90 this->flags,
89 - &(data->socket->addr.info),  
90 - data->socket->addrlen); 91 + &(data->remote->addr.info),
  92 + data->remote->addrlen);
91 93
92 if (-1 == send) { 94 if (-1 == send) {
93 perror("sendto"); 95 perror("sendto");
Please register or login to post a comment