summaryrefslogtreecommitdiffstats
path: root/src/device.c
diff options
context:
space:
mode:
authorGravatar Satoshi Ohgoh2014-07-29 12:04:18 +0900
committerGravatar Martin Szulecki2014-09-19 19:02:55 +0200
commit2f6d9d5f7047d4dd5ea9970721ba902301621ab2 (patch)
tree3b007b0c73ef9cd1159c2a2c1e3acd1296b3e6e4 /src/device.c
parent4da0a2f6f5e9634dd1dd99a8faf3374e8cfc6b1c (diff)
downloadusbmuxd-2f6d9d5f7047d4dd5ea9970721ba902301621ab2.tar.gz
usbmuxd-2f6d9d5f7047d4dd5ea9970721ba902301621ab2.tar.bz2
Flush input buffer for a client connection when calling connection_teardown().
Signed-off-by: Martin Szulecki <m.szulecki@libimobiledevice.org>
Diffstat (limited to 'src/device.c')
-rw-r--r--src/device.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/device.c b/src/device.c
index 9f45ea9..ec0c9f2 100644
--- a/src/device.c
+++ b/src/device.c
@@ -300,6 +300,7 @@ static int send_tcp(struct mux_connection *conn, uint8_t flags, const unsigned c
300static void connection_teardown(struct mux_connection *conn) 300static void connection_teardown(struct mux_connection *conn)
301{ 301{
302 int res; 302 int res;
303 int size;
303 if(conn->state == CONN_DEAD) 304 if(conn->state == CONN_DEAD)
304 return; 305 return;
305 usbmuxd_log(LL_DEBUG, "connection_teardown dev %d sport %d dport %d", conn->dev->id, conn->sport, conn->dport); 306 usbmuxd_log(LL_DEBUG, "connection_teardown dev %d sport %d dport %d", conn->dev->id, conn->sport, conn->dport);
@@ -313,6 +314,21 @@ static void connection_teardown(struct mux_connection *conn)
313 client_notify_connect(conn->client, RESULT_CONNREFUSED); 314 client_notify_connect(conn->client, RESULT_CONNREFUSED);
314 } else { 315 } else {
315 conn->state = CONN_DEAD; 316 conn->state = CONN_DEAD;
317 if((conn->events & POLLOUT) && conn->ib_size > 0){
318 while(1){
319 size = client_write(conn->client, conn->ib_buf, conn->ib_size);
320 if(size <= 0) {
321 break;
322 }
323 if(size == (int)conn->ib_size) {
324 conn->ib_size = 0;
325 break;
326 } else {
327 conn->ib_size -= size;
328 memmove(conn->ib_buf, conn->ib_buf + size, conn->ib_size);
329 }
330 }
331 }
316 client_close(conn->client); 332 client_close(conn->client);
317 } 333 }
318 } 334 }