diff options
author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2003-11-27 00:30:54 +0000 |
---|---|---|
committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2003-11-27 00:30:54 +0000 |
commit | 3febb302ad28fd25de51cbc686739469b92d8921 (patch) | |
tree | 0a8d9a1070a7c1f2566c22562693fb27963037d9 | |
parent | 9bc4e0648ab4a177293a94425594bdc54c9a84fa (diff) | |
download | luasocket-3febb302ad28fd25de51cbc686739469b92d8921.tar.gz luasocket-3febb302ad28fd25de51cbc686739469b92d8921.tar.bz2 luasocket-3febb302ad28fd25de51cbc686739469b92d8921.zip |
Killed a few bugs found by Tomas.
-rw-r--r-- | TODO | 12 | ||||
-rw-r--r-- | src/buffer.c | 6 | ||||
-rw-r--r-- | src/http.lua | 5 | ||||
-rw-r--r-- | src/tcp.c | 22 | ||||
-rw-r--r-- | src/timeout.c | 74 | ||||
-rw-r--r-- | src/timeout.h | 7 | ||||
-rw-r--r-- | src/udp.c | 8 | ||||
-rw-r--r-- | src/usocket.c | 6 | ||||
-rw-r--r-- | src/usocket.h | 5 | ||||
-rw-r--r-- | src/wsocket.c | 6 |
10 files changed, 96 insertions, 55 deletions
@@ -1,3 +1,15 @@ | |||
1 | replace times by getrusage | ||
2 | |||
3 | make sure modules know if their dependencies are there. | ||
4 | |||
5 | one thing i noticed in usocket.c is that it doesn't check for EINTR | ||
6 | after write(), sendto(), read(), recvfrom() etc. ? the usual trick is | ||
7 | to loop while you get EINTR: | ||
8 | |||
9 | do | ||
10 | ret = write(...); | ||
11 | while(ret < 0 && errno == EINTR) | ||
12 | |||
1 | 13 | ||
2 | Read about | 14 | Read about |
3 | 15 | ||
diff --git a/src/buffer.c b/src/buffer.c index c860f35..04419e7 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
@@ -138,7 +138,8 @@ int sendraw(p_buf buf, const char *data, size_t count, size_t *sent) | |||
138 | int err = IO_DONE; | 138 | int err = IO_DONE; |
139 | while (total < count && err == IO_DONE) { | 139 | while (total < count && err == IO_DONE) { |
140 | size_t done; | 140 | size_t done; |
141 | err = io->send(io->ctx, data+total, count-total, &done, tm_get(tm)); | 141 | err = io->send(io->ctx, data+total, count-total, &done, |
142 | tm_getsuccess(tm)); | ||
142 | total += done; | 143 | total += done; |
143 | } | 144 | } |
144 | *sent = total; | 145 | *sent = total; |
@@ -239,7 +240,8 @@ int buf_get(p_buf buf, const char **data, size_t *count) | |||
239 | p_tm tm = buf->tm; | 240 | p_tm tm = buf->tm; |
240 | if (buf_isempty(buf)) { | 241 | if (buf_isempty(buf)) { |
241 | size_t got; | 242 | size_t got; |
242 | err = io->recv(io->ctx, buf->data, BUF_SIZE, &got, tm_get(tm)); | 243 | err = io->recv(io->ctx, buf->data, BUF_SIZE, &got, |
244 | tm_getsuccess(tm)); | ||
243 | buf->first = 0; | 245 | buf->first = 0; |
244 | buf->last = got; | 246 | buf->last = got; |
245 | } | 247 | } |
diff --git a/src/http.lua b/src/http.lua index 252285a..18a44b6 100644 --- a/src/http.lua +++ b/src/http.lua | |||
@@ -18,7 +18,7 @@ Public.TIMEOUT = 60 | |||
18 | -- default port for document retrieval | 18 | -- default port for document retrieval |
19 | Public.PORT = 80 | 19 | Public.PORT = 80 |
20 | -- user agent field sent in request | 20 | -- user agent field sent in request |
21 | Public.USERAGENT = "LuaSocket 1.5" | 21 | Public.USERAGENT = "LuaSocket 2.0" |
22 | -- block size used in transfers | 22 | -- block size used in transfers |
23 | Public.BLOCKSIZE = 8192 | 23 | Public.BLOCKSIZE = 8192 |
24 | 24 | ||
@@ -193,7 +193,8 @@ function Private.receivebody_bylength(sock, length, receive_cb) | |||
193 | while length > 0 do | 193 | while length > 0 do |
194 | local size = math.min(Public.BLOCKSIZE, length) | 194 | local size = math.min(Public.BLOCKSIZE, length) |
195 | local chunk, err = sock:receive(size) | 195 | local chunk, err = sock:receive(size) |
196 | if err then | 196 | -- if there was an error before we got all the data |
197 | if err and string.len(chunk) ~= length then | ||
197 | go, uerr = receive_cb(nil, err) | 198 | go, uerr = receive_cb(nil, err) |
198 | return uerr or err | 199 | return uerr or err |
199 | end | 200 | end |
@@ -198,21 +198,21 @@ static int meth_accept(lua_State *L) | |||
198 | { | 198 | { |
199 | struct sockaddr_in addr; | 199 | struct sockaddr_in addr; |
200 | socklen_t addr_len = sizeof(addr); | 200 | socklen_t addr_len = sizeof(addr); |
201 | int err = IO_ERROR; | ||
201 | p_tcp server = (p_tcp) aux_checkclass(L, "tcp{server}", 1); | 202 | p_tcp server = (p_tcp) aux_checkclass(L, "tcp{server}", 1); |
202 | p_tm tm = &server->tm; | 203 | p_tm tm = &server->tm; |
203 | p_tcp client = lua_newuserdata(L, sizeof(t_tcp)); | 204 | p_tcp client = lua_newuserdata(L, sizeof(t_tcp)); |
204 | tm_markstart(tm); | ||
205 | aux_setclass(L, "tcp{client}", -1); | 205 | aux_setclass(L, "tcp{client}", -1); |
206 | for ( ;; ) { | 206 | tm_markstart(tm); |
207 | sock_accept(&server->sock, &client->sock, | 207 | /* loop until connection accepted or timeout happens */ |
208 | (SA *) &addr, &addr_len, tm_get(tm)); | 208 | while (err != IO_DONE) { |
209 | if (client->sock == SOCK_INVALID) { | 209 | err = sock_accept(&server->sock, &client->sock, |
210 | if (tm_get(tm) == 0) { | 210 | (SA *) &addr, &addr_len, tm_getfailure(tm)); |
211 | lua_pushnil(L); | 211 | if (err == IO_CLOSED || (err == IO_TIMEOUT && !tm_getfailure(tm))) { |
212 | io_pusherror(L, IO_TIMEOUT); | 212 | lua_pushnil(L); |
213 | return 2; | 213 | io_pusherror(L, err); |
214 | } | 214 | return 2; |
215 | } else break; | 215 | } |
216 | } | 216 | } |
217 | /* initialize remaining structure fields */ | 217 | /* initialize remaining structure fields */ |
218 | io_init(&client->io, (p_send) sock_send, (p_recv) sock_recv, &client->sock); | 218 | io_init(&client->io, (p_send) sock_send, (p_recv) sock_recv, &client->sock); |
diff --git a/src/timeout.c b/src/timeout.c index 38d1135..5d6de99 100644 --- a/src/timeout.c +++ b/src/timeout.c | |||
@@ -16,8 +16,8 @@ | |||
16 | #ifdef WIN32 | 16 | #ifdef WIN32 |
17 | #include <windows.h> | 17 | #include <windows.h> |
18 | #else | 18 | #else |
19 | #include <sys/time.h> | ||
19 | #include <sys/times.h> | 20 | #include <sys/times.h> |
20 | #include <time.h> | ||
21 | #include <unistd.h> | 21 | #include <unistd.h> |
22 | #endif | 22 | #endif |
23 | 23 | ||
@@ -46,40 +46,62 @@ void tm_init(p_tm tm, int block, int total) | |||
46 | } | 46 | } |
47 | 47 | ||
48 | /*-------------------------------------------------------------------------*\ | 48 | /*-------------------------------------------------------------------------*\ |
49 | * Set and get timeout limits | 49 | * Determines how much time we have left for the next system call, |
50 | * if the previous call was successful | ||
51 | * Input | ||
52 | * tm: timeout control structure | ||
53 | * Returns | ||
54 | * the number of ms left or -1 if there is no time limit | ||
55 | \*-------------------------------------------------------------------------*/ | ||
56 | int tm_getsuccess(p_tm tm) | ||
57 | { | ||
58 | if (tm->block < 0 && tm->total < 0) { | ||
59 | return -1; | ||
60 | } else if (tm->block < 0) { | ||
61 | int t = tm->total - tm_gettime() + tm->start; | ||
62 | return MAX(t, 0); | ||
63 | } else if (tm->total < 0) { | ||
64 | return tm->block; | ||
65 | } else { | ||
66 | int t = tm->total - tm_gettime() + tm->start; | ||
67 | return MIN(tm->block, MAX(t, 0)); | ||
68 | } | ||
69 | } | ||
70 | |||
71 | /*-------------------------------------------------------------------------*\ | ||
72 | * Returns time since start of operation | ||
73 | * Input | ||
74 | * tm: timeout control structure | ||
75 | * Returns | ||
76 | * start field of structure | ||
50 | \*-------------------------------------------------------------------------*/ | 77 | \*-------------------------------------------------------------------------*/ |
51 | void tm_setblock(p_tm tm, int block) | ||
52 | { tm->block = block; } | ||
53 | void tm_settotal(p_tm tm, int total) | ||
54 | { tm->total = total; } | ||
55 | int tm_getblock(p_tm tm) | ||
56 | { return tm->block; } | ||
57 | int tm_gettotal(p_tm tm) | ||
58 | { return tm->total; } | ||
59 | int tm_getstart(p_tm tm) | 78 | int tm_getstart(p_tm tm) |
60 | { return tm->start; } | 79 | { |
80 | return tm->start; | ||
81 | } | ||
61 | 82 | ||
62 | /*-------------------------------------------------------------------------*\ | 83 | /*-------------------------------------------------------------------------*\ |
63 | * Determines how much time we have left for the current operation | 84 | * Determines how much time we have left for the next system call, |
85 | * if the previous call was a failure | ||
64 | * Input | 86 | * Input |
65 | * tm: timeout control structure | 87 | * tm: timeout control structure |
66 | * Returns | 88 | * Returns |
67 | * the number of ms left or -1 if there is no time limit | 89 | * the number of ms left or -1 if there is no time limit |
68 | \*-------------------------------------------------------------------------*/ | 90 | \*-------------------------------------------------------------------------*/ |
69 | int tm_get(p_tm tm) | 91 | int tm_getfailure(p_tm tm) |
70 | { | 92 | { |
71 | /* no timeout */ | 93 | if (tm->block < 0 && tm->total < 0) { |
72 | if (tm->block < 0 && tm->total < 0) | ||
73 | return -1; | 94 | return -1; |
74 | /* there is no block timeout, we use the return timeout */ | 95 | } else if (tm->block < 0) { |
75 | else if (tm->block < 0) | 96 | int t = tm->total - tm_gettime() + tm->start; |
76 | return MAX(tm->total - tm_gettime() + tm->start, 0); | 97 | return MAX(t, 0); |
77 | /* there is no return timeout, we use the block timeout */ | 98 | } else if (tm->total < 0) { |
78 | else if (tm->total < 0) | 99 | int t = tm->block - tm_gettime() + tm->start; |
79 | return tm->block; | 100 | return MAX(t, 0); |
80 | /* both timeouts are specified */ | 101 | } else { |
81 | else return MIN(tm->block, | 102 | int t = tm->total - tm_gettime() + tm->start; |
82 | MAX(tm->total - tm_gettime() + tm->start, 0)); | 103 | return MIN(tm->block, MAX(t, 0)); |
104 | } | ||
83 | } | 105 | } |
84 | 106 | ||
85 | /*-------------------------------------------------------------------------*\ | 107 | /*-------------------------------------------------------------------------*\ |
@@ -131,10 +153,10 @@ int tm_meth_settimeout(lua_State *L, p_tm tm) | |||
131 | const char *mode = luaL_optstring(L, 3, "b"); | 153 | const char *mode = luaL_optstring(L, 3, "b"); |
132 | switch (*mode) { | 154 | switch (*mode) { |
133 | case 'b': | 155 | case 'b': |
134 | tm_setblock(tm, ms); | 156 | tm->block = ms; |
135 | break; | 157 | break; |
136 | case 'r': case 't': | 158 | case 'r': case 't': |
137 | tm_settotal(tm, ms); | 159 | tm->total = ms; |
138 | break; | 160 | break; |
139 | default: | 161 | default: |
140 | luaL_argcheck(L, 0, 3, "invalid timeout mode"); | 162 | luaL_argcheck(L, 0, 3, "invalid timeout mode"); |
diff --git a/src/timeout.h b/src/timeout.h index ef2f533..17f44ea 100644 --- a/src/timeout.h +++ b/src/timeout.h | |||
@@ -18,13 +18,10 @@ typedef t_tm *p_tm; | |||
18 | 18 | ||
19 | void tm_open(lua_State *L); | 19 | void tm_open(lua_State *L); |
20 | void tm_init(p_tm tm, int block, int total); | 20 | void tm_init(p_tm tm, int block, int total); |
21 | void tm_setblock(p_tm tm, int block); | 21 | int tm_getsuccess(p_tm tm); |
22 | void tm_settotal(p_tm tm, int total); | 22 | int tm_getfailure(p_tm tm); |
23 | int tm_getblock(p_tm tm); | ||
24 | int tm_gettotal(p_tm tm); | ||
25 | void tm_markstart(p_tm tm); | 23 | void tm_markstart(p_tm tm); |
26 | int tm_getstart(p_tm tm); | 24 | int tm_getstart(p_tm tm); |
27 | int tm_get(p_tm tm); | ||
28 | int tm_gettime(void); | 25 | int tm_gettime(void); |
29 | int tm_meth_settimeout(lua_State *L, p_tm tm); | 26 | int tm_meth_settimeout(lua_State *L, p_tm tm); |
30 | 27 | ||
@@ -100,7 +100,7 @@ static int meth_send(lua_State *L) | |||
100 | int err; | 100 | int err; |
101 | const char *data = luaL_checklstring(L, 2, &count); | 101 | const char *data = luaL_checklstring(L, 2, &count); |
102 | tm_markstart(tm); | 102 | tm_markstart(tm); |
103 | err = sock_send(&udp->sock, data, count, &sent, tm_get(tm)); | 103 | err = sock_send(&udp->sock, data, count, &sent, tm_getsuccess(tm)); |
104 | if (err == IO_DONE) lua_pushnumber(L, sent); | 104 | if (err == IO_DONE) lua_pushnumber(L, sent); |
105 | else lua_pushnil(L); | 105 | else lua_pushnil(L); |
106 | /* a 'closed' error on an unconnected means the target address was not | 106 | /* a 'closed' error on an unconnected means the target address was not |
@@ -129,7 +129,7 @@ static int meth_sendto(lua_State *L) | |||
129 | addr.sin_port = htons(port); | 129 | addr.sin_port = htons(port); |
130 | tm_markstart(tm); | 130 | tm_markstart(tm); |
131 | err = sock_sendto(&udp->sock, data, count, &sent, | 131 | err = sock_sendto(&udp->sock, data, count, &sent, |
132 | (SA *) &addr, sizeof(addr), tm_get(tm)); | 132 | (SA *) &addr, sizeof(addr), tm_getsuccess(tm)); |
133 | if (err == IO_DONE) lua_pushnumber(L, sent); | 133 | if (err == IO_DONE) lua_pushnumber(L, sent); |
134 | else lua_pushnil(L); | 134 | else lua_pushnil(L); |
135 | /* a 'closed' error on an unconnected means the target address was not | 135 | /* a 'closed' error on an unconnected means the target address was not |
@@ -150,7 +150,7 @@ static int meth_receive(lua_State *L) | |||
150 | p_tm tm = &udp->tm; | 150 | p_tm tm = &udp->tm; |
151 | count = MIN(count, sizeof(buffer)); | 151 | count = MIN(count, sizeof(buffer)); |
152 | tm_markstart(tm); | 152 | tm_markstart(tm); |
153 | err = sock_recv(&udp->sock, buffer, count, &got, tm_get(tm)); | 153 | err = sock_recv(&udp->sock, buffer, count, &got, tm_getsuccess(tm)); |
154 | if (err == IO_DONE) lua_pushlstring(L, buffer, got); | 154 | if (err == IO_DONE) lua_pushlstring(L, buffer, got); |
155 | else lua_pushnil(L); | 155 | else lua_pushnil(L); |
156 | io_pusherror(L, err); | 156 | io_pusherror(L, err); |
@@ -172,7 +172,7 @@ static int meth_receivefrom(lua_State *L) | |||
172 | tm_markstart(tm); | 172 | tm_markstart(tm); |
173 | count = MIN(count, sizeof(buffer)); | 173 | count = MIN(count, sizeof(buffer)); |
174 | err = sock_recvfrom(&udp->sock, buffer, count, &got, | 174 | err = sock_recvfrom(&udp->sock, buffer, count, &got, |
175 | (SA *) &addr, &addr_len, tm_get(tm)); | 175 | (SA *) &addr, &addr_len, tm_getsuccess(tm)); |
176 | if (err == IO_DONE) { | 176 | if (err == IO_DONE) { |
177 | lua_pushlstring(L, buffer, got); | 177 | lua_pushlstring(L, buffer, got); |
178 | lua_pushstring(L, inet_ntoa(addr.sin_addr)); | 178 | lua_pushstring(L, inet_ntoa(addr.sin_addr)); |
diff --git a/src/usocket.c b/src/usocket.c index 202238b..b120d7b 100644 --- a/src/usocket.c +++ b/src/usocket.c | |||
@@ -83,10 +83,12 @@ int sock_accept(p_sock ps, p_sock pa, SA *addr, socklen_t *addr_len, | |||
83 | SA dummy_addr; | 83 | SA dummy_addr; |
84 | socklen_t dummy_len; | 84 | socklen_t dummy_len; |
85 | fd_set fds; | 85 | fd_set fds; |
86 | if (sock == SOCK_INVALID) return IO_CLOSED; | ||
86 | tv.tv_sec = timeout / 1000; | 87 | tv.tv_sec = timeout / 1000; |
87 | tv.tv_usec = (timeout % 1000) * 1000; | 88 | tv.tv_usec = (timeout % 1000) * 1000; |
88 | FD_ZERO(&fds); | 89 | FD_ZERO(&fds); |
89 | FD_SET(sock, &fds); | 90 | FD_SET(sock, &fds); |
91 | *pa = SOCK_INVALID; | ||
90 | if (select(sock+1, &fds, NULL, NULL, timeout >= 0 ? &tv : NULL) <= 0) | 92 | if (select(sock+1, &fds, NULL, NULL, timeout >= 0 ? &tv : NULL) <= 0) |
91 | return IO_TIMEOUT; | 93 | return IO_TIMEOUT; |
92 | if (!addr) addr = &dummy_addr; | 94 | if (!addr) addr = &dummy_addr; |
@@ -108,6 +110,7 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, | |||
108 | ssize_t put = 0; | 110 | ssize_t put = 0; |
109 | int err; | 111 | int err; |
110 | int ret; | 112 | int ret; |
113 | if (sock == SOCK_INVALID) return IO_CLOSED; | ||
111 | tv.tv_sec = timeout / 1000; | 114 | tv.tv_sec = timeout / 1000; |
112 | tv.tv_usec = (timeout % 1000) * 1000; | 115 | tv.tv_usec = (timeout % 1000) * 1000; |
113 | FD_ZERO(&fds); | 116 | FD_ZERO(&fds); |
@@ -145,6 +148,7 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent, | |||
145 | ssize_t put = 0; | 148 | ssize_t put = 0; |
146 | int err; | 149 | int err; |
147 | int ret; | 150 | int ret; |
151 | if (sock == SOCK_INVALID) return IO_CLOSED; | ||
148 | tv.tv_sec = timeout / 1000; | 152 | tv.tv_sec = timeout / 1000; |
149 | tv.tv_usec = (timeout % 1000) * 1000; | 153 | tv.tv_usec = (timeout % 1000) * 1000; |
150 | FD_ZERO(&fds); | 154 | FD_ZERO(&fds); |
@@ -180,6 +184,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout) | |||
180 | fd_set fds; | 184 | fd_set fds; |
181 | int ret; | 185 | int ret; |
182 | ssize_t taken = 0; | 186 | ssize_t taken = 0; |
187 | if (sock == SOCK_INVALID) return IO_CLOSED; | ||
183 | tv.tv_sec = timeout / 1000; | 188 | tv.tv_sec = timeout / 1000; |
184 | tv.tv_usec = (timeout % 1000) * 1000; | 189 | tv.tv_usec = (timeout % 1000) * 1000; |
185 | FD_ZERO(&fds); | 190 | FD_ZERO(&fds); |
@@ -210,6 +215,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got, | |||
210 | struct timeval tv; | 215 | struct timeval tv; |
211 | fd_set fds; | 216 | fd_set fds; |
212 | int ret; | 217 | int ret; |
218 | if (sock == SOCK_INVALID) return IO_CLOSED; | ||
213 | ssize_t taken = 0; | 219 | ssize_t taken = 0; |
214 | tv.tv_sec = timeout / 1000; | 220 | tv.tv_sec = timeout / 1000; |
215 | tv.tv_usec = (timeout % 1000) * 1000; | 221 | tv.tv_usec = (timeout % 1000) * 1000; |
diff --git a/src/usocket.h b/src/usocket.h index 85b7caa..b9255cb 100644 --- a/src/usocket.h +++ b/src/usocket.h | |||
@@ -34,11 +34,6 @@ | |||
34 | /* TCP options (nagle algorithm disable) */ | 34 | /* TCP options (nagle algorithm disable) */ |
35 | #include <netinet/tcp.h> | 35 | #include <netinet/tcp.h> |
36 | 36 | ||
37 | #ifdef __APPLE__ | ||
38 | /* for some reason socklen_t is not defined in Mac Os X */ | ||
39 | typedef int socklen_t; | ||
40 | #endif | ||
41 | |||
42 | typedef int t_sock; | 37 | typedef int t_sock; |
43 | typedef t_sock *p_sock; | 38 | typedef t_sock *p_sock; |
44 | 39 | ||
diff --git a/src/wsocket.c b/src/wsocket.c index f9e1084..1ba28b6 100644 --- a/src/wsocket.c +++ b/src/wsocket.c | |||
@@ -86,10 +86,12 @@ int sock_accept(p_sock ps, p_sock pa, SA *addr, socklen_t *addr_len, | |||
86 | SA dummy_addr; | 86 | SA dummy_addr; |
87 | socklen_t dummy_len; | 87 | socklen_t dummy_len; |
88 | fd_set fds; | 88 | fd_set fds; |
89 | if (sock == SOCK_INVALID) return IO_CLOSED; | ||
89 | tv.tv_sec = timeout / 1000; | 90 | tv.tv_sec = timeout / 1000; |
90 | tv.tv_usec = (timeout % 1000) * 1000; | 91 | tv.tv_usec = (timeout % 1000) * 1000; |
91 | FD_ZERO(&fds); | 92 | FD_ZERO(&fds); |
92 | FD_SET(sock, &fds); | 93 | FD_SET(sock, &fds); |
94 | *pa = SOCK_INVALID; | ||
93 | if (select(sock+1, &fds, NULL, NULL, timeout >= 0 ? &tv : NULL) <= 0) | 95 | if (select(sock+1, &fds, NULL, NULL, timeout >= 0 ? &tv : NULL) <= 0) |
94 | return IO_TIMEOUT; | 96 | return IO_TIMEOUT; |
95 | if (!addr) addr = &dummy_addr; | 97 | if (!addr) addr = &dummy_addr; |
@@ -109,6 +111,7 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, | |||
109 | struct timeval tv; | 111 | struct timeval tv; |
110 | fd_set fds; | 112 | fd_set fds; |
111 | ssize_t put = 0; | 113 | ssize_t put = 0; |
114 | if (sock == SOCK_INVALID) return IO_CLOSED; | ||
112 | int err; | 115 | int err; |
113 | int ret; | 116 | int ret; |
114 | tv.tv_sec = timeout / 1000; | 117 | tv.tv_sec = timeout / 1000; |
@@ -148,6 +151,7 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent, | |||
148 | ssize_t put = 0; | 151 | ssize_t put = 0; |
149 | int err; | 152 | int err; |
150 | int ret; | 153 | int ret; |
154 | if (sock == SOCK_INVALID) return IO_CLOSED; | ||
151 | tv.tv_sec = timeout / 1000; | 155 | tv.tv_sec = timeout / 1000; |
152 | tv.tv_usec = (timeout % 1000) * 1000; | 156 | tv.tv_usec = (timeout % 1000) * 1000; |
153 | FD_ZERO(&fds); | 157 | FD_ZERO(&fds); |
@@ -183,6 +187,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout) | |||
183 | fd_set fds; | 187 | fd_set fds; |
184 | int ret; | 188 | int ret; |
185 | ssize_t taken = 0; | 189 | ssize_t taken = 0; |
190 | if (sock == SOCK_INVALID) return IO_CLOSED; | ||
186 | tv.tv_sec = timeout / 1000; | 191 | tv.tv_sec = timeout / 1000; |
187 | tv.tv_usec = (timeout % 1000) * 1000; | 192 | tv.tv_usec = (timeout % 1000) * 1000; |
188 | FD_ZERO(&fds); | 193 | FD_ZERO(&fds); |
@@ -214,6 +219,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got, | |||
214 | fd_set fds; | 219 | fd_set fds; |
215 | int ret; | 220 | int ret; |
216 | ssize_t taken = 0; | 221 | ssize_t taken = 0; |
222 | if (sock == SOCK_INVALID) return IO_CLOSED; | ||
217 | tv.tv_sec = timeout / 1000; | 223 | tv.tv_sec = timeout / 1000; |
218 | tv.tv_usec = (timeout % 1000) * 1000; | 224 | tv.tv_usec = (timeout % 1000) * 1000; |
219 | FD_ZERO(&fds); | 225 | FD_ZERO(&fds); |