Commit 0f1d2b904a15d01bf653b3b1f3e8b5f1c20e1b20

Authored by Georg Hopp
1 parent 3f373aab

use new SizedData from trbase and remove automatic cast.

... ... @@ -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) {
... ...
... ... @@ -17,7 +17,6 @@ TRIO = stream.c \
17 17 tcp_socket.c \
18 18 udp_socket.c \
19 19 remote_data.c \
20   - remote_data_set_data.c \
21 20 i_socket.c \
22 21 i_reader.c \
23 22 i_writer.c
... ...
... ... @@ -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:
... ...
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