Skip to content

Commit 60a04b6

Browse files
committed
Refactoring for PicoRuby and Microruby
- DNS_resolve: Set outbuf as an argument instead of return mrb_value - picorb_warn instead of mrb_warn
1 parent 9aaa3ce commit 60a04b6

File tree

5 files changed

+53
-36
lines changed

5 files changed

+53
-36
lines changed

mrbgems/picoruby-net/include/net.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,13 @@ void lwip_end(void);
2121
void Net_sleep_ms(int);
2222
err_t Net_get_ip(const char *name, ip_addr_t *ip);
2323

24-
mrb_value DNS_resolve(mrb_state *mrb, const char *name, bool is_tcp);
24+
#if defined(PICORB_VM_MRUBYC)
25+
#define mrb_state mrbc_vm
26+
#endif
27+
28+
#define OUTBUF_SIZE 16
29+
30+
void DNS_resolve(const char *name, bool is_tcp, char *outbuf, size_t outlen);
2531
mrb_value TCPClient_send(const char *host, int port, mrb_state *mrb, mrb_value send_data, bool is_tls);
2632
mrb_value UDPClient_send(const char *host, int port, mrb_state *mrb, mrb_value send_data, bool is_dtls);
2733

mrbgems/picoruby-net/src/mruby/dns.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,17 @@
44

55
#include "mruby.h"
66

7-
mrb_value
8-
DNS_resolve(mrb_state *mrb, const char *name, bool is_tcp)
7+
void
8+
DNS_resolve(const char *name, bool is_tcp, char *outbuf, size_t outlen)
99
{
1010
(void)is_tcp;
1111
ip_addr_t ip;
12-
mrb_value ret;
1312
ip4_addr_set_zero(&ip);
1413
Net_get_ip(name, &ip);
15-
if(!ip4_addr_isloopback(&ip)) {
16-
char buf[16];
17-
ipaddr_ntoa_r(&ip, buf, 16);
18-
ret = mrb_str_new(mrb, buf, strlen(buf));
14+
if (!ip4_addr_isloopback(&ip)) {
15+
ipaddr_ntoa_r(&ip, outbuf, outlen);
1916
} else {
20-
ret = mrb_nil_value();
17+
outbuf[0] = '\0';
2118
}
22-
return ret;
2319
}
2420

mrbgems/picoruby-net/src/mruby/net.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ mrb_net_dns_s_resolve(mrb_state *mrb, mrb_value self)
99
const char *host;
1010
mrb_bool is_tls;
1111
mrb_get_args(mrb, "zb", &host, &is_tls);
12-
return DNS_resolve(mrb, host, is_tls);
12+
char outbuf[OUTBUF_SIZE];
13+
DNS_resolve(host, is_tls, outbuf, sizeof(outbuf));
14+
if (outbuf[0] == '\0') {
15+
return mrb_nil_value();
16+
} else {
17+
return mrb_str_new_cstr(mrb, outbuf);
18+
}
1319
}
1420

1521
static mrb_value

mrbgems/picoruby-net/src/mruby/tcp.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ TCPClient_close(tcp_connection_state *cs)
4444
{
4545
err_t err = ERR_OK;
4646
if (!cs || !cs->pcb) return ERR_ARG;
47+
mrb_state *mrb = cs->mrb;
4748
lwip_begin();
4849
altcp_arg(cs->pcb, NULL);
4950
altcp_recv(cs->pcb, NULL);
@@ -52,27 +53,28 @@ TCPClient_close(tcp_connection_state *cs)
5253
altcp_poll(cs->pcb, NULL, 0);
5354
err = altcp_close(cs->pcb);
5455
if (err != ERR_OK) {
55-
mrb_warn(cs->mrb, "altcp_close failed: %d\n", err);
56+
picorb_warn("altcp_close failed: %d\n", err);
5657
altcp_abort(cs->pcb);
5758
err = ERR_ABRT;
5859
}
5960
lwip_end();
6061
TCPClient_free_tls_config(cs);
61-
mrb_free(cs->mrb, cs);
62+
mrb_free(mrb, cs);
6263
return err;
6364
}
6465

6566
static err_t
6667
TCPClient_recv_cb(void *arg, struct altcp_pcb *pcb, struct pbuf *pbuf, err_t err)
6768
{
6869
tcp_connection_state *cs = (tcp_connection_state *)arg;
70+
mrb_state *mrb = cs->mrb;
6971
if (err != ERR_OK) {
70-
mrb_warn(cs->mrb, "TCPClient_recv_cb: err=%d\n", err);
72+
picorb_warn("TCPClient_recv_cb: err=%d\n", err);
7173
cs->state = NET_TCP_STATE_ERROR;
7274
return TCPClient_close(cs);
7375
}
7476
if (pbuf != NULL) {
75-
char *tmpbuf = mrb_malloc(cs->mrb, pbuf->tot_len + 1);
77+
char *tmpbuf = mrb_malloc(mrb, pbuf->tot_len + 1);
7678
struct pbuf *current_pbuf = pbuf;
7779
int offset = 0;
7880
while (current_pbuf != NULL) {
@@ -81,8 +83,8 @@ TCPClient_recv_cb(void *arg, struct altcp_pcb *pcb, struct pbuf *pbuf, err_t err
8183
current_pbuf = current_pbuf->next;
8284
}
8385
tmpbuf[pbuf->tot_len] = '\0';
84-
mrb_str_cat(cs->mrb, cs->recv_data, tmpbuf, pbuf->tot_len);
85-
mrb_free(cs->mrb, tmpbuf);
86+
mrb_str_cat(mrb, cs->recv_data, tmpbuf, pbuf->tot_len);
87+
mrb_free(mrb, tmpbuf);
8688
altcp_recved(pcb, pbuf->tot_len);
8789
cs->state = NET_TCP_STATE_PACKET_RECVED;
8890
pbuf_free(pbuf);
@@ -102,11 +104,12 @@ TCPClient_sent_cb(void *arg, struct altcp_pcb *pcb, u16_t len)
102104
static err_t
103105
TCPClient_connected_cb(void *arg, struct altcp_pcb *pcb, err_t err)
104106
{
107+
tcp_connection_state *cs = (tcp_connection_state *)arg;
108+
mrb_state *mrb = cs->mrb;
105109
if (err != ERR_OK) {
106-
printf("TCPClient_connected_cb: err=%d\n", err);
110+
picorb_warn("TCPClient_connected_cb: err=%d\n", err);
107111
return TCPClient_close((tcp_connection_state *)arg);
108112
}
109-
tcp_connection_state *cs = (tcp_connection_state *)arg;
110113
cs->state = NET_TCP_STATE_CONNECTED;
111114
return ERR_OK;
112115
}
@@ -115,7 +118,8 @@ static err_t
115118
TCPClient_poll_cb(void *arg, struct altcp_pcb *pcb)
116119
{
117120
tcp_connection_state *cs = (tcp_connection_state *)arg;
118-
mrb_warn(cs->mrb, "TCPClient_poll_cb (timeout)\n");
121+
mrb_state *mrb = cs->mrb;
122+
picorb_warn("TCPClient_poll_cb (timeout)\n");
119123
cs->state = NET_TCP_STATE_TIMEOUT;
120124
return ERR_OK;
121125
}
@@ -124,7 +128,8 @@ static void
124128
TCPClient_err_cb(void *arg, err_t err)
125129
{
126130
tcp_connection_state *cs = (tcp_connection_state *)arg;
127-
mrb_warn(cs->mrb, "Error with: %d\n", err);
131+
mrb_state *mrb = cs->mrb;
132+
picorb_warn("Error with: %d\n", err);
128133
cs->state = NET_TCP_STATE_ERROR;
129134
}
130135

@@ -155,7 +160,7 @@ TCPClient_new_tls_connection(const char *host, mrb_value send_data, mrb_value re
155160
struct altcp_tls_config *tls_config = altcp_tls_create_config_client(NULL, 0);
156161
cs->pcb = altcp_tls_new(tls_config, IPADDR_TYPE_V4);
157162
if (!cs->pcb) {
158-
mrb_warn(cs->mrb, "altcp_tls_new failed\n");
163+
picorb_warn("altcp_tls_new failed\n");
159164
mrb_free(mrb, cs);
160165
return NULL;
161166
}
@@ -186,7 +191,7 @@ TCPClient_connect_impl(ip_addr_t *ip, const char *host, int port, mrb_value send
186191
lwip_begin();
187192
err = altcp_connect(cs->pcb, ip, port, TCPClient_connected_cb);
188193
if (err != ERR_OK) {
189-
mrb_warn(cs->mrb, "altcp_connect failed: %d\n", err);
194+
picorb_warn("altcp_connect failed: %d\n", err);
190195
cs->state = NET_TCP_STATE_ERROR;
191196
lwip_end();
192197
return cs;
@@ -217,7 +222,8 @@ TCPClient_poll_impl(tcp_connection_state **pcs)
217222
lwip_begin();
218223
err = altcp_write(cs->pcb, RSTRING_PTR(cs->send_data), RSTRING_LEN(cs->send_data), 0);
219224
if (err != ERR_OK) {
220-
mrb_warn(cs->mrb, "altcp_write failed: %d\n", err);
225+
mrb_state *mrb = cs->mrb;
226+
picorb_warn("altcp_write failed: %d\n", err);
221227
cs->state = NET_TCP_STATE_ERROR;
222228
return 1;
223229
}

mrbgems/picoruby-net/src/mruby/udp.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ static void
3232
UDPClient_recv_cb(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
3333
{
3434
udp_connection_state *cs = (udp_connection_state *)arg;
35+
mrb_state *mrb = cs->mrb;
3536

3637
if (p != NULL) {
37-
char *tmpbuf = mrb_malloc(cs->mrb, p->tot_len + 1);
38+
char *tmpbuf = mrb_malloc(mrb, p->tot_len + 1);
3839
pbuf_copy_partial(p, tmpbuf, p->tot_len, 0);
3940
tmpbuf[p->tot_len] = '\0';
4041
mrb_str_cat(cs->mrb, cs->recv_data, tmpbuf, p->tot_len);
@@ -43,7 +44,7 @@ UDPClient_recv_cb(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_
4344
pbuf_free(p);
4445
} else {
4546
cs->state = NET_UDP_STATE_ERROR;
46-
mrb_warn(cs->mrb, "State changed to NET_UDP_STATE_ERROR\n");
47+
picorb_warn("State changed to NET_UDP_STATE_ERROR\n");
4748
}
4849
}
4950

@@ -54,7 +55,7 @@ UDPClient_new_connection(mrb_value send_data, mrb_value recv_data, mrb_state *mr
5455
cs->state = NET_UDP_STATE_NONE;
5556
cs->pcb = udp_new();
5657
if (cs->pcb == NULL) {
57-
mrb_warn(cs->mrb, "Failed to create new UDP PCB\n");
58+
picorb_warn("Failed to create new UDP PCB\n");
5859
return NULL;
5960
}
6061
udp_recv(cs->pcb, UDPClient_recv_cb, cs);
@@ -70,7 +71,7 @@ UDPClient_send_impl(ip_addr_t *ip, int port, mrb_value send_data, mrb_value recv
7071
(void)is_dtls;
7172
udp_connection_state *cs = UDPClient_new_connection(send_data, recv_data, mrb);
7273
if (cs == NULL) {
73-
mrb_warn(cs->mrb, "Failed to create new connection\n");
74+
picorb_warn("Failed to create new connection\n");
7475
return NULL;
7576
}
7677

@@ -89,11 +90,11 @@ UDPClient_send_impl(ip_addr_t *ip, int port, mrb_value send_data, mrb_value recv
8990
cs->state = NET_UDP_STATE_WAITING;
9091
} else {
9192
cs->state = NET_UDP_STATE_ERROR;
92-
mrb_warn(cs->mrb, "Failed to send UDP packet, error: %d\n", err);
93+
picorb_warn("Failed to send UDP packet, error: %d\n", err);
9394
}
9495
} else {
9596
cs->state = NET_UDP_STATE_ERROR;
96-
mrb_warn(cs->mrb, "Failed to allocate pbuf for send data\n");
97+
picorb_warn("Failed to allocate pbuf for send data\n");
9798
}
9899

99100
return cs;
@@ -122,7 +123,8 @@ UDPClient_poll_impl(udp_connection_state **pcs)
122123
*pcs = NULL;
123124
return 0;
124125
case NET_UDP_STATE_ERROR:
125-
mrb_warn(cs->mrb, "Error occurred, cleaning up\n");
126+
mrb_state *mrb = cs->mrb;
127+
picorb_warn("Error occurred, cleaning up\n");
126128
lwip_begin();
127129
udp_remove(cs->pcb);
128130
lwip_end();
@@ -145,9 +147,10 @@ UDPClient_send(const char *host, int port, mrb_state *mrb, mrb_value send_data,
145147
if(!ip4_addr_isloopback(&ip)) {
146148
mrb_value recv_data = mrb_str_new_capa(mrb, 0);
147149
udp_connection_state *cs = UDPClient_send_impl(&ip, port, send_data, recv_data, mrb, is_dtls);
150+
mrb_state *mrb = cs->mrb;
148151

149152
if (cs == NULL) {
150-
mrb_warn(cs->mrb, "Failed to create UDP connection\n");
153+
picorb_warn("Failed to create UDP connection\n");
151154
ret = mrb_nil_value();
152155
} else {
153156
int poll_count = 0;
@@ -157,21 +160,21 @@ UDPClient_send(const char *host, int port, mrb_state *mrb, mrb_value send_data,
157160
Net_sleep_ms(200);
158161
// Add a timeout mechanism to prevent infinite loop
159162
if (poll_count > 50) { // 10 seconds timeout (50 * 200ms)
160-
mrb_warn(cs->mrb, "Polling timeout reached\n");
163+
picorb_warn("Polling timeout reached\n");
161164
break;
162165
}
163166
}
164167
if (cs != NULL) {
165-
mrb_warn(cs->mrb, "Connection state not NULL after polling, cleaning up\n");
168+
picorb_warn("Connection state not NULL after polling, cleaning up\n");
166169
lwip_begin();
167170
udp_remove(cs->pcb);
168171
lwip_end();
169-
mrb_free(cs->mrb, cs);
172+
mrb_free(mrb, cs);
170173
}
171174
ret = recv_data;
172175
}
173176
} else {
174-
mrb_warn(mrb, "IP is loopback, not sending\n");
177+
picorb_warn("IP is loopback, not sending\n");
175178
ret = mrb_nil_value();
176179
}
177180
return ret;

0 commit comments

Comments
 (0)