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
|
From 3041a808c3797e3c87272d71666e7b2f7c7a9f46 Mon Sep 17 00:00:00 2001
From: Natanael Copa <ncopa@alpinelinux.org>
Date: Wed, 25 Jan 2017 12:43:29 +0100
Subject: [PATCH] Create socket on first sendto if family agnostic udp() was
used
Create socket and set family on first sendto() if udp() was created
without address family.
Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
---
src/udp.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/src/udp.c b/src/udp.c
index ec97252..605c195 100644
--- a/src/udp.c
+++ b/src/udp.c
@@ -189,6 +189,27 @@ static int meth_sendto(lua_State *L) {
lua_pushstring(L, gai_strerror(err));
return 2;
}
+
+ /* create socket if on first sendto if AF_UNSPEC was set */
+ if (udp->family == AF_UNSPEC && udp->sock == SOCKET_INVALID) {
+ struct addrinfo *ap;
+ const char *errstr = NULL;
+ for (ap = ai; ap != NULL; ap = ap->ai_next) {
+ errstr = inet_trycreate(&udp->sock, ap->ai_family, SOCK_DGRAM, 0);
+ if (errstr == NULL) {
+ socket_setnonblocking(&udp->sock);
+ udp->family = ap->ai_family;
+ break;
+ }
+ }
+ if (errstr != NULL) {
+ lua_pushnil(L);
+ lua_pushstring(L, errstr);
+ freeaddrinfo(ai);
+ return 2;
+ }
+ }
+
timeout_markstart(tm);
err = socket_sendto(&udp->sock, data, count, &sent, ai->ai_addr,
(socklen_t) ai->ai_addrlen, tm);
--
2.11.0
|