fixed some bugs

This commit is contained in:
hyung-hwan 2020-05-12 17:53:19 +00:00
parent 02a6d5db1e
commit cc74d317a2
7 changed files with 178 additions and 146 deletions

View File

@ -130,31 +130,31 @@ static void tcp_sck_on_disconnect (mio_dev_sck_t* tcp)
switch (MIO_DEV_SCK_GET_PROGRESS(tcp)) switch (MIO_DEV_SCK_GET_PROGRESS(tcp))
{ {
case MIO_DEV_SCK_CONNECTING: case MIO_DEV_SCK_CONNECTING:
MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_CONNECTING_SSL: case MIO_DEV_SCK_CONNECTING_SSL:
MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO SSL-CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO SSL-CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_LISTENING: case MIO_DEV_SCK_LISTENING:
MIO_INFO1 (tcp->mio, "SHUTTING DOWN THE SERVER SOCKET(%d)...\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "SHUTTING DOWN THE SERVER SOCKET(%d)...\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_CONNECTED: case MIO_DEV_SCK_CONNECTED:
MIO_INFO1 (tcp->mio, "OUTGOING CLIENT CONNECTION GOT TORN DOWN(%d).......\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "OUTGOING CLIENT CONNECTION GOT TORN DOWN(%d).......\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_ACCEPTING_SSL: case MIO_DEV_SCK_ACCEPTING_SSL:
MIO_INFO1 (tcp->mio, "INCOMING SSL-ACCEPT GOT DISCONNECTED(%d) ....\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "INCOMING SSL-ACCEPT GOT DISCONNECTED(%d) ....\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_ACCEPTED: case MIO_DEV_SCK_ACCEPTED:
MIO_INFO1 (tcp->mio, "INCOMING CLIENT BEING SERVED GOT DISCONNECTED(%d).......\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "INCOMING CLIENT BEING SERVED GOT DISCONNECTED(%d).......\n", (int)tcp->hnd);
break; break;
default: default:
MIO_INFO2 (tcp->mio, "SOCKET DEVICE DISCONNECTED (%d - %x)\n", (int)tcp->sck, (unsigned int)tcp->state); MIO_INFO2 (tcp->mio, "SOCKET DEVICE DISCONNECTED (%d - %x)\n", (int)tcp->hnd, (unsigned int)tcp->state);
break; break;
} }
} }
@ -168,11 +168,11 @@ static void tcp_sck_on_connect (mio_dev_sck_t* tcp)
if (tcp->state & MIO_DEV_SCK_CONNECTED) if (tcp->state & MIO_DEV_SCK_CONNECTED)
{ {
MIO_INFO3 (tcp->mio, "DEVICE connected to a remote server... LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->sck); MIO_INFO3 (tcp->mio, "DEVICE connected to a remote server... LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->hnd);
} }
else if (tcp->state & MIO_DEV_SCK_ACCEPTED) else if (tcp->state & MIO_DEV_SCK_ACCEPTED)
{ {
MIO_INFO3 (tcp->mio, "DEVICE accepted client device... .LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->sck); MIO_INFO3 (tcp->mio, "DEVICE accepted client device... .LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->hnd);
} }
if (mio_dev_sck_write(tcp, "hello", 5, MIO_NULL, MIO_NULL) <= -1) if (mio_dev_sck_write(tcp, "hello", 5, MIO_NULL, MIO_NULL) <= -1)
@ -188,7 +188,7 @@ static int tcp_sck_on_write (mio_dev_sck_t* tcp, mio_iolen_t wrlen, void* wrctx,
if (wrlen <= -1) if (wrlen <= -1)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SEDING TIMED OUT...........\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SEDING TIMED OUT...........\n", (int)tcp->hnd);
mio_dev_sck_halt (tcp); mio_dev_sck_halt (tcp);
} }
else else
@ -196,11 +196,11 @@ static int tcp_sck_on_write (mio_dev_sck_t* tcp, mio_iolen_t wrlen, void* wrctx,
ts = (tcp_server_t*)(tcp + 1); ts = (tcp_server_t*)(tcp + 1);
if (wrlen == 0) if (wrlen == 0)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> CLOSED WRITING END\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> CLOSED WRITING END\n", (int)tcp->hnd);
} }
else else
{ {
MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SENT MESSAGE %d of length %ld\n", (int)tcp->sck, ts->tally, (long int)wrlen); MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SENT MESSAGE %d of length %ld\n", (int)tcp->hnd, ts->tally, (long int)wrlen);
} }
ts->tally++; ts->tally++;
@ -210,7 +210,7 @@ static int tcp_sck_on_write (mio_dev_sck_t* tcp, mio_iolen_t wrlen, void* wrctx,
MIO_INIT_NTIME (&tmout, 5, 0); MIO_INIT_NTIME (&tmout, 5, 0);
//mio_dev_sck_read (tcp, 1); //mio_dev_sck_read (tcp, 1);
MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> REQUESTING to READ with timeout of %ld.%08ld\n", (int)tcp->sck, (long int)tmout.sec, (long int)tmout.nsec); MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> REQUESTING to READ with timeout of %ld.%08ld\n", (int)tcp->hnd, (long int)tmout.sec, (long int)tmout.nsec);
mio_dev_sck_timedread (tcp, 1, &tmout); mio_dev_sck_timedread (tcp, 1, &tmout);
} }
return 0; return 0;
@ -222,19 +222,19 @@ static int tcp_sck_on_read (mio_dev_sck_t* tcp, const void* buf, mio_iolen_t len
if (len <= -1) if (len <= -1)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: TIMED OUT...\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: TIMED OUT...\n", (int)tcp->hnd);
mio_dev_sck_halt (tcp); mio_dev_sck_halt (tcp);
return 0; return 0;
} }
else if (len <= 0) else if (len <= 0)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: EOF RECEIVED...\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: EOF RECEIVED...\n", (int)tcp->hnd);
/* no outstanding request. but EOF */ /* no outstanding request. but EOF */
mio_dev_sck_halt (tcp); mio_dev_sck_halt (tcp);
return 0; return 0;
} }
MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) - received %d bytes\n", (int)tcp->sck, (int)len); MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) - received %d bytes\n", (int)tcp->hnd, (int)len);
{ {
mio_ntime_t tmout; mio_ntime_t tmout;
@ -243,7 +243,7 @@ static int tcp_sck_on_read (mio_dev_sck_t* tcp, const void* buf, mio_iolen_t len
static char xxx[1000000]; static char xxx[1000000];
memset (xxx, a++ , MIO_SIZEOF(xxx)); memset (xxx, a++ , MIO_SIZEOF(xxx));
MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) >>> REQUESTING to write data of %d bytes\n", (int)tcp->sck, MIO_SIZEOF(xxx)); MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) >>> REQUESTING to write data of %d bytes\n", (int)tcp->hnd, MIO_SIZEOF(xxx));
//return mio_dev_sck_write (tcp, "HELLO", 5, MIO_NULL); //return mio_dev_sck_write (tcp, "HELLO", 5, MIO_NULL);
MIO_INIT_NTIME (&tmout, 5, 0); MIO_INIT_NTIME (&tmout, 5, 0);
n = mio_dev_sck_timedwrite(tcp, xxx, MIO_SIZEOF(xxx), &tmout, MIO_NULL, MIO_NULL); n = mio_dev_sck_timedwrite(tcp, xxx, MIO_SIZEOF(xxx), &tmout, MIO_NULL, MIO_NULL);
@ -251,11 +251,11 @@ static int tcp_sck_on_read (mio_dev_sck_t* tcp, const void* buf, mio_iolen_t len
if (n <= -1) return -1; if (n <= -1) return -1;
} }
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO STOP READ\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO STOP READ\n", (int)tcp->hnd);
mio_dev_sck_read (tcp, 0); mio_dev_sck_read (tcp, 0);
#if 0 #if 0
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO CLOSE WRITING END\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO CLOSE WRITING END\n", (int)tcp->hnd);
/* post the write finisher - close the writing end */ /* post the write finisher - close the writing end */
n = mio_dev_sck_write(tcp, MIO_NULL, 0, MIO_NULL, MIO_NULL); n = mio_dev_sck_write(tcp, MIO_NULL, 0, MIO_NULL, MIO_NULL);
if (n <= -1) return -1; if (n <= -1) return -1;

View File

@ -142,31 +142,31 @@ static void tcp_sck_on_disconnect (mio_dev_sck_t* tcp)
switch (MIO_DEV_SCK_GET_PROGRESS(tcp)) switch (MIO_DEV_SCK_GET_PROGRESS(tcp))
{ {
case MIO_DEV_SCK_CONNECTING: case MIO_DEV_SCK_CONNECTING:
MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_CONNECTING_SSL: case MIO_DEV_SCK_CONNECTING_SSL:
MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO SSL-CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO SSL-CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_LISTENING: case MIO_DEV_SCK_LISTENING:
MIO_INFO1 (tcp->mio, "SHUTTING DOWN THE SERVER SOCKET(%d)...\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "SHUTTING DOWN THE SERVER SOCKET(%d)...\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_CONNECTED: case MIO_DEV_SCK_CONNECTED:
MIO_INFO1 (tcp->mio, "OUTGOING CLIENT CONNECTION GOT TORN DOWN(%d).......\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "OUTGOING CLIENT CONNECTION GOT TORN DOWN(%d).......\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_ACCEPTING_SSL: case MIO_DEV_SCK_ACCEPTING_SSL:
MIO_INFO1 (tcp->mio, "INCOMING SSL-ACCEPT GOT DISCONNECTED(%d) ....\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "INCOMING SSL-ACCEPT GOT DISCONNECTED(%d) ....\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_ACCEPTED: case MIO_DEV_SCK_ACCEPTED:
MIO_INFO1 (tcp->mio, "INCOMING CLIENT BEING SERVED GOT DISCONNECTED(%d).......\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "INCOMING CLIENT BEING SERVED GOT DISCONNECTED(%d).......\n", (int)tcp->hnd);
break; break;
default: default:
MIO_INFO2 (tcp->mio, "SOCKET DEVICE DISCONNECTED (%d - %x)\n", (int)tcp->sck, (unsigned int)tcp->state); MIO_INFO2 (tcp->mio, "SOCKET DEVICE DISCONNECTED (%d - %x)\n", (int)tcp->hnd, (unsigned int)tcp->state);
break; break;
} }
} }
@ -191,11 +191,11 @@ static void tcp_sck_on_connect (mio_dev_sck_t* tcp)
if (tcp->state & MIO_DEV_SCK_CONNECTED) if (tcp->state & MIO_DEV_SCK_CONNECTED)
{ {
MIO_INFO3 (tcp->mio, "DEVICE connected to a remote server... LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->sck); MIO_INFO3 (tcp->mio, "DEVICE connected to a remote server... LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->hnd);
} }
else if (tcp->state & MIO_DEV_SCK_ACCEPTED) else if (tcp->state & MIO_DEV_SCK_ACCEPTED)
{ {
MIO_INFO3 (tcp->mio, "DEVICE accepted client device... .LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->sck); MIO_INFO3 (tcp->mio, "DEVICE accepted client device... .LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->hnd);
} }
for (i = 0; i < MIO_COUNTOF(k); i++) k[i] = 'A' + (i % 26); for (i = 0; i < MIO_COUNTOF(k); i++) k[i] = 'A' + (i % 26);
@ -220,7 +220,7 @@ static int tcp_sck_on_write (mio_dev_sck_t* tcp, mio_iolen_t wrlen, void* wrctx,
if (wrlen <= -1) if (wrlen <= -1)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SEDING TIMED OUT...........\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SEDING TIMED OUT...........\n", (int)tcp->hnd);
mio_dev_sck_halt (tcp); mio_dev_sck_halt (tcp);
} }
else else
@ -228,11 +228,11 @@ static int tcp_sck_on_write (mio_dev_sck_t* tcp, mio_iolen_t wrlen, void* wrctx,
ts = (tcp_server_t*)(tcp + 1); ts = (tcp_server_t*)(tcp + 1);
if (wrlen == 0) if (wrlen == 0)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> CLOSED WRITING END\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> CLOSED WRITING END\n", (int)tcp->hnd);
} }
else else
{ {
MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SENT MESSAGE %d of length %ld\n", (int)tcp->sck, ts->tally, (long int)wrlen); MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SENT MESSAGE %d of length %ld\n", (int)tcp->hnd, ts->tally, (long int)wrlen);
} }
ts->tally++; ts->tally++;
@ -242,7 +242,7 @@ static int tcp_sck_on_write (mio_dev_sck_t* tcp, mio_iolen_t wrlen, void* wrctx,
MIO_INIT_NTIME (&tmout, 5, 0); MIO_INIT_NTIME (&tmout, 5, 0);
//mio_dev_sck_read (tcp, 1); //mio_dev_sck_read (tcp, 1);
MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> REQUESTING to READ with timeout of %ld.%08ld\n", (int)tcp->sck, (long int)tmout.sec, (long int)tmout.nsec); MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> REQUESTING to READ with timeout of %ld.%08ld\n", (int)tcp->hnd, (long int)tmout.sec, (long int)tmout.nsec);
mio_dev_sck_timedread (tcp, 1, &tmout); mio_dev_sck_timedread (tcp, 1, &tmout);
} }
return 0; return 0;
@ -254,19 +254,19 @@ static int tcp_sck_on_read (mio_dev_sck_t* tcp, const void* buf, mio_iolen_t len
if (len <= -1) if (len <= -1)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: TIMED OUT...\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: TIMED OUT...\n", (int)tcp->hnd);
mio_dev_sck_halt (tcp); mio_dev_sck_halt (tcp);
return 0; return 0;
} }
else if (len <= 0) else if (len <= 0)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: EOF RECEIVED...\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: EOF RECEIVED...\n", (int)tcp->hnd);
/* no outstanding request. but EOF */ /* no outstanding request. but EOF */
mio_dev_sck_halt (tcp); mio_dev_sck_halt (tcp);
return 0; return 0;
} }
MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) - received %d bytes\n", (int)tcp->sck, (int)len); MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) - received %d bytes\n", (int)tcp->hnd, (int)len);
{ {
mio_ntime_t tmout; mio_ntime_t tmout;
@ -275,7 +275,7 @@ static int tcp_sck_on_read (mio_dev_sck_t* tcp, const void* buf, mio_iolen_t len
static char xxx[1000000]; static char xxx[1000000];
memset (xxx, a++ , MIO_SIZEOF(xxx)); memset (xxx, a++ , MIO_SIZEOF(xxx));
MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) >>> REQUESTING to write data of %d bytes\n", (int)tcp->sck, MIO_SIZEOF(xxx)); MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) >>> REQUESTING to write data of %d bytes\n", (int)tcp->hnd, MIO_SIZEOF(xxx));
//return mio_dev_sck_write (tcp, "HELLO", 5, MIO_NULL); //return mio_dev_sck_write (tcp, "HELLO", 5, MIO_NULL);
MIO_INIT_NTIME (&tmout, 5, 0); MIO_INIT_NTIME (&tmout, 5, 0);
n = mio_dev_sck_timedwrite(tcp, xxx, MIO_SIZEOF(xxx), &tmout, MIO_NULL, MIO_NULL); n = mio_dev_sck_timedwrite(tcp, xxx, MIO_SIZEOF(xxx), &tmout, MIO_NULL, MIO_NULL);
@ -283,11 +283,11 @@ static int tcp_sck_on_read (mio_dev_sck_t* tcp, const void* buf, mio_iolen_t len
if (n <= -1) return -1; if (n <= -1) return -1;
} }
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO STOP READ\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO STOP READ\n", (int)tcp->hnd);
mio_dev_sck_read (tcp, 0); mio_dev_sck_read (tcp, 0);
#if 0 #if 0
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO CLOSE WRITING END\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO CLOSE WRITING END\n", (int)tcp->hnd);
/* post the write finisher - close the writing end */ /* post the write finisher - close the writing end */
n = mio_dev_sck_write(tcp, MIO_NULL, 0, MIO_NULL, MIO_NULL); n = mio_dev_sck_write(tcp, MIO_NULL, 0, MIO_NULL, MIO_NULL);
if (n <= -1) return -1; if (n <= -1) return -1;
@ -382,12 +382,12 @@ static int arp_sck_on_write (mio_dev_sck_t* dev, mio_iolen_t wrlen, void* wrctx,
static void arp_sck_on_connect (mio_dev_sck_t* dev) static void arp_sck_on_connect (mio_dev_sck_t* dev)
{ {
printf ("STARTING UP ARP SOCKET %d...\n", dev->sck); printf ("STARTING UP ARP SOCKET %d...\n", dev->hnd);
} }
static void arp_sck_on_disconnect (mio_dev_sck_t* dev) static void arp_sck_on_disconnect (mio_dev_sck_t* dev)
{ {
printf ("SHUTTING DOWN ARP SOCKET %d...\n", dev->sck); printf ("SHUTTING DOWN ARP SOCKET %d...\n", dev->hnd);
} }
static int setup_arp_tester (mio_t* mio) static int setup_arp_tester (mio_t* mio)
@ -584,7 +584,7 @@ static void icmp_sck_on_disconnect (mio_dev_sck_t* dev)
icmpxtn = (icmpxtn_t*)(dev + 1); icmpxtn = (icmpxtn_t*)(dev + 1);
printf ("SHUTTING DOWN ICMP SOCKET %d...\n", dev->sck); printf ("SHUTTING DOWN ICMP SOCKET %d...\n", dev->hnd);
if (icmpxtn->tmout_jobidx != MIO_TMRIDX_INVALID) if (icmpxtn->tmout_jobidx != MIO_TMRIDX_INVALID)
{ {

View File

@ -64,31 +64,31 @@ static void tcp_sck_on_disconnect (mio_dev_sck_t* tcp)
switch (MIO_DEV_SCK_GET_PROGRESS(tcp)) switch (MIO_DEV_SCK_GET_PROGRESS(tcp))
{ {
case MIO_DEV_SCK_CONNECTING: case MIO_DEV_SCK_CONNECTING:
MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_CONNECTING_SSL: case MIO_DEV_SCK_CONNECTING_SSL:
MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO SSL-CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO SSL-CONNECT (%d) TO REMOTE SERVER\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_LISTENING: case MIO_DEV_SCK_LISTENING:
MIO_INFO1 (tcp->mio, "SHUTTING DOWN THE SERVER SOCKET(%d)...\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "SHUTTING DOWN THE SERVER SOCKET(%d)...\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_CONNECTED: case MIO_DEV_SCK_CONNECTED:
MIO_INFO1 (tcp->mio, "OUTGOING CLIENT CONNECTION GOT TORN DOWN(%d).......\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "OUTGOING CLIENT CONNECTION GOT TORN DOWN(%d).......\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_ACCEPTING_SSL: case MIO_DEV_SCK_ACCEPTING_SSL:
MIO_INFO1 (tcp->mio, "INCOMING SSL-ACCEPT GOT DISCONNECTED(%d) ....\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "INCOMING SSL-ACCEPT GOT DISCONNECTED(%d) ....\n", (int)tcp->hnd);
break; break;
case MIO_DEV_SCK_ACCEPTED: case MIO_DEV_SCK_ACCEPTED:
MIO_INFO1 (tcp->mio, "INCOMING CLIENT BEING SERVED GOT DISCONNECTED(%d).......\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "INCOMING CLIENT BEING SERVED GOT DISCONNECTED(%d).......\n", (int)tcp->hnd);
break; break;
default: default:
MIO_INFO2 (tcp->mio, "SOCKET DEVICE DISCONNECTED (%d - %x)\n", (int)tcp->sck, (unsigned int)tcp->state); MIO_INFO2 (tcp->mio, "SOCKET DEVICE DISCONNECTED (%d - %x)\n", (int)tcp->hnd, (unsigned int)tcp->state);
break; break;
} }
} }
@ -102,11 +102,11 @@ static void tcp_sck_on_connect (mio_dev_sck_t* tcp)
if (tcp->state & MIO_DEV_SCK_CONNECTED) if (tcp->state & MIO_DEV_SCK_CONNECTED)
{ {
MIO_INFO3 (tcp->mio, "DEVICE connected to a remote server... LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->sck); MIO_INFO3 (tcp->mio, "DEVICE connected to a remote server... LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->hnd);
} }
else if (tcp->state & MIO_DEV_SCK_ACCEPTED) else if (tcp->state & MIO_DEV_SCK_ACCEPTED)
{ {
MIO_INFO3 (tcp->mio, "DEVICE accepted client device... .LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->sck); MIO_INFO3 (tcp->mio, "DEVICE accepted client device... .LOCAL %hs REMOTE %hs SCK: %d\n", buf1, buf2, tcp->hnd);
} }
if (mio_dev_sck_write(tcp, "hello", 5, MIO_NULL, MIO_NULL) <= -1) if (mio_dev_sck_write(tcp, "hello", 5, MIO_NULL, MIO_NULL) <= -1)
@ -122,7 +122,7 @@ static int tcp_sck_on_write (mio_dev_sck_t* tcp, mio_iolen_t wrlen, void* wrctx,
if (wrlen <= -1) if (wrlen <= -1)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SEDING TIMED OUT...........\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SEDING TIMED OUT...........\n", (int)tcp->hnd);
mio_dev_sck_halt (tcp); mio_dev_sck_halt (tcp);
} }
else else
@ -130,11 +130,11 @@ static int tcp_sck_on_write (mio_dev_sck_t* tcp, mio_iolen_t wrlen, void* wrctx,
ts = (tcp_xtn_t*)(tcp + 1); ts = (tcp_xtn_t*)(tcp + 1);
if (wrlen == 0) if (wrlen == 0)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> CLOSED WRITING END\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> CLOSED WRITING END\n", (int)tcp->hnd);
} }
else else
{ {
MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SENT MESSAGE %d of length %ld\n", (int)tcp->sck, ts->tally, (long int)wrlen); MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> SENT MESSAGE %d of length %ld\n", (int)tcp->hnd, ts->tally, (long int)wrlen);
} }
ts->tally++; ts->tally++;
@ -144,7 +144,7 @@ static int tcp_sck_on_write (mio_dev_sck_t* tcp, mio_iolen_t wrlen, void* wrctx,
MIO_INIT_NTIME (&tmout, 5, 0); MIO_INIT_NTIME (&tmout, 5, 0);
//mio_dev_sck_read (tcp, 1); //mio_dev_sck_read (tcp, 1);
MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> REQUESTING to READ with timeout of %ld.%08ld\n", (int)tcp->sck, (long int)tmout.sec, (long int)tmout.nsec); MIO_INFO3 (tcp->mio, "TCP_SCK_ON_WRITE(%d) >>> REQUESTING to READ with timeout of %ld.%08ld\n", (int)tcp->hnd, (long int)tmout.sec, (long int)tmout.nsec);
mio_dev_sck_timedread (tcp, 1, &tmout); mio_dev_sck_timedread (tcp, 1, &tmout);
} }
return 0; return 0;
@ -156,19 +156,19 @@ static int tcp_sck_on_read (mio_dev_sck_t* tcp, const void* buf, mio_iolen_t len
if (len <= -1) if (len <= -1)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: TIMED OUT...\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: TIMED OUT...\n", (int)tcp->hnd);
mio_dev_sck_halt (tcp); mio_dev_sck_halt (tcp);
return 0; return 0;
} }
else if (len <= 0) else if (len <= 0)
{ {
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: EOF RECEIVED...\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) STREAM DEVICE: EOF RECEIVED...\n", (int)tcp->hnd);
/* no outstanding request. but EOF */ /* no outstanding request. but EOF */
mio_dev_sck_halt (tcp); mio_dev_sck_halt (tcp);
return 0; return 0;
} }
MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) - received %d bytes\n", (int)tcp->sck, (int)len); MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) - received %d bytes\n", (int)tcp->hnd, (int)len);
{ {
mio_ntime_t tmout; mio_ntime_t tmout;
@ -177,7 +177,7 @@ static int tcp_sck_on_read (mio_dev_sck_t* tcp, const void* buf, mio_iolen_t len
static char xxx[1000000]; static char xxx[1000000];
memset (xxx, a++ , MIO_SIZEOF(xxx)); memset (xxx, a++ , MIO_SIZEOF(xxx));
MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) >>> REQUESTING to write data of %d bytes\n", (int)tcp->sck, MIO_SIZEOF(xxx)); MIO_INFO2 (tcp->mio, "TCP_SCK_ON_READ(%d) >>> REQUESTING to write data of %d bytes\n", (int)tcp->hnd, MIO_SIZEOF(xxx));
//return mio_dev_sck_write (tcp, "HELLO", 5, MIO_NULL); //return mio_dev_sck_write (tcp, "HELLO", 5, MIO_NULL);
MIO_INIT_NTIME (&tmout, 5, 0); MIO_INIT_NTIME (&tmout, 5, 0);
n = mio_dev_sck_timedwrite(tcp, xxx, MIO_SIZEOF(xxx), &tmout, MIO_NULL, MIO_NULL); n = mio_dev_sck_timedwrite(tcp, xxx, MIO_SIZEOF(xxx), &tmout, MIO_NULL, MIO_NULL);
@ -185,11 +185,11 @@ static int tcp_sck_on_read (mio_dev_sck_t* tcp, const void* buf, mio_iolen_t len
if (n <= -1) return -1; if (n <= -1) return -1;
} }
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO STOP READ\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO STOP READ\n", (int)tcp->hnd);
mio_dev_sck_read (tcp, 0); mio_dev_sck_read (tcp, 0);
#if 0 #if 0
MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO CLOSE WRITING END\n", (int)tcp->sck); MIO_INFO1 (tcp->mio, "TCP_SCK_ON_READ(%d) - REQUESTING TO CLOSE WRITING END\n", (int)tcp->hnd);
/* post the write finisher - close the writing end */ /* post the write finisher - close the writing end */
n = mio_dev_sck_write(tcp, MIO_NULL, 0, MIO_NULL, MIO_NULL); n = mio_dev_sck_write(tcp, MIO_NULL, 0, MIO_NULL, MIO_NULL);
if (n <= -1) return -1; if (n <= -1) return -1;

View File

@ -13,9 +13,8 @@
typedef struct mio_svc_htts_cli_t mio_svc_htts_cli_t; typedef struct mio_svc_htts_cli_t mio_svc_htts_cli_t;
struct mio_svc_htts_cli_t struct mio_svc_htts_cli_t
{ {
mio_svc_htts_cli_t* cli_prev; /* a listener socket sets htts and sck fields only */
mio_svc_htts_cli_t* cli_next; /* a client sockets uses all the fields in this struct */
mio_svc_htts_t* htts; mio_svc_htts_t* htts;
mio_dev_sck_t* sck; mio_dev_sck_t* sck;
@ -26,6 +25,9 @@ struct mio_svc_htts_cli_t
mio_becs_t* sbuf; /* temporary buffer for status line formatting */ mio_becs_t* sbuf; /* temporary buffer for status line formatting */
mio_svc_htts_rsrc_t rsrc; /* list head for resource list */ mio_svc_htts_rsrc_t rsrc; /* list head for resource list */
mio_svc_htts_cli_t* cli_prev;
mio_svc_htts_cli_t* cli_next;
}; };
struct mio_svc_htts_t struct mio_svc_htts_t
@ -58,6 +60,13 @@ struct mio_svc_httc_t
(cli)->cli_next->cli_prev = (cli)->cli_prev; \ (cli)->cli_next->cli_prev = (cli)->cli_prev; \
} while (0) } while (0)
#define CLIL_UNLINK_CLI_CLEAN(cli) do { \
(cli)->cli_prev->cli_next = (cli)->cli_next; \
(cli)->cli_next->cli_prev = (cli)->cli_prev; \
(cli)->cli_prev = (cli); \
(cli)->cli_next = (cli); \
} while (0)
#define CLIL_INIT(lh) ((lh)->cli_next = (lh)->cli_prev = lh) #define CLIL_INIT(lh) ((lh)->cli_next = (lh)->cli_prev = lh)
#define CLIL_FIRST_CLI(lh) ((lh)->cli_next) #define CLIL_FIRST_CLI(lh) ((lh)->cli_next)
#define CLIL_LAST_CLI(lh) ((lh)->cli_prev) #define CLIL_LAST_CLI(lh) ((lh)->cli_prev)
@ -374,6 +383,7 @@ static int init_client (mio_svc_htts_cli_t* cli, mio_dev_sck_t* sck)
/* the htts field must be filled with the same field in the listening socket upon accept() */ /* the htts field must be filled with the same field in the listening socket upon accept() */
MIO_ASSERT (sck->mio, cli->htts != MIO_NULL); MIO_ASSERT (sck->mio, cli->htts != MIO_NULL);
MIO_ASSERT (sck->mio, cli->sck == cli->htts->lsck); /* the field should still point to the listner socket */
MIO_ASSERT (sck->mio, sck->mio == cli->htts->mio); MIO_ASSERT (sck->mio, sck->mio == cli->htts->mio);
cli->htrd = mio_htrd_open(sck->mio, MIO_SIZEOF(*htrdxtn)); cli->htrd = mio_htrd_open(sck->mio, MIO_SIZEOF(*htrdxtn));
@ -389,6 +399,7 @@ static int init_client (mio_svc_htts_cli_t* cli, mio_dev_sck_t* sck)
cli->sck = sck; cli->sck = sck;
CLIL_APPEND_CLI (&cli->htts->cli, cli); CLIL_APPEND_CLI (&cli->htts->cli, cli);
MIO_DEBUG3 (sck->mio, "HTTS(%p) - initialized client %p socket %p\n", cli->htts, cli, sck);
return 0; return 0;
oops: oops:
@ -407,6 +418,8 @@ oops:
static void fini_client (mio_svc_htts_cli_t* cli) static void fini_client (mio_svc_htts_cli_t* cli)
{ {
MIO_DEBUG3 (cli->sck->mio, "HTTS(%p) - finalizing client %p socket %p\n", cli->htts, cli, cli->sck);
while (!RSRCL_IS_EMPTY(&cli->rsrc)) while (!RSRCL_IS_EMPTY(&cli->rsrc))
mio_svc_htts_rsrc_kill (RSRCL_FIRST_RSRC(&cli->rsrc)); mio_svc_htts_rsrc_kill (RSRCL_FIRST_RSRC(&cli->rsrc));
@ -421,7 +434,14 @@ static void fini_client (mio_svc_htts_cli_t* cli)
cli->htrd = MIO_NULL; cli->htrd = MIO_NULL;
} }
CLIL_UNLINK_CLI (cli); CLIL_UNLINK_CLI_CLEAN (cli);
/* are these needed? not symmetrical if done here.
* these fields are copied from the listener socket upon accept.
* init_client() doesn't fill in these fields. let's comment out these lines
cli->sck = MIO_NULL;
cli->htts = MIO_NULL;
*/
} }
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
@ -461,13 +481,6 @@ static int client_on_write (mio_dev_sck_t* sck, mio_iolen_t wrlen, void* wrctx,
return 0; return 0;
} }
static void client_on_disconnect (mio_dev_sck_t* sck)
{
mio_svc_htts_cli_t* cli = mio_dev_sck_getxtn(sck);
MIO_DEBUG1 (sck->mio, "** HTTS - client disconnect %p\n", sck);
fini_client (cli);
}
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
static int listener_on_read (mio_dev_sck_t* sck, const void* buf, mio_iolen_t len, const mio_skad_t* srcaddr) static int listener_on_read (mio_dev_sck_t* sck, const void* buf, mio_iolen_t len, const mio_skad_t* srcaddr)
@ -487,23 +500,22 @@ static void listener_on_connect (mio_dev_sck_t* sck)
if (sck->state & MIO_DEV_SCK_ACCEPTED) if (sck->state & MIO_DEV_SCK_ACCEPTED)
{ {
/* accepted a new client */ /* accepted a new client */
MIO_DEBUG3 (sck->mio, "** HTTS(%p) - accepted... %p %d \n", cli->htts, sck, sck->sck); MIO_DEBUG3 (sck->mio, "HTTS(%p) - accepted... %p %d \n", cli->htts, sck, sck->hnd);
/* the accepted socket inherits various event callbacks. switch some of them to avoid sharing */ /* the accepted socket inherits various event callbacks. switch some of them to avoid sharing */
sck->on_read = client_on_read; sck->on_read = client_on_read;
sck->on_write = client_on_write; sck->on_write = client_on_write;
sck->on_disconnect = client_on_disconnect;
if (init_client(cli, sck) <= -1) if (init_client(cli, sck) <= -1)
{ {
MIO_INFO2 (sck->mio, "UNABLE TO INITIALIZE NEW CLIENT %p %d\n", sck, (int)sck->sck); MIO_INFO2 (sck->mio, "UNABLE TO INITIALIZE NEW CLIENT %p %d\n", sck, (int)sck->hnd);
mio_dev_sck_halt (sck); mio_dev_sck_halt (sck);
} }
} }
else if (sck->state & MIO_DEV_SCK_CONNECTED) else if (sck->state & MIO_DEV_SCK_CONNECTED)
{ {
/* this will never be triggered as the listing socket never call mio_dev_sck_connect() */ /* this will never be triggered as the listing socket never call mio_dev_sck_connect() */
MIO_DEBUG3 (sck->mio, "** HTTS(%p) - connected... %p %d \n", cli->htts, sck, sck->sck); MIO_DEBUG3 (sck->mio, "** HTTS(%p) - connected... %p %d \n", cli->htts, sck, sck->hnd);
} }
/* MIO_DEV_SCK_CONNECTED must not be seen here as this is only for the listener socket */ /* MIO_DEV_SCK_CONNECTED must not be seen here as this is only for the listener socket */
@ -517,45 +529,60 @@ static void listener_on_disconnect (mio_dev_sck_t* sck)
{ {
case MIO_DEV_SCK_CONNECTING: case MIO_DEV_SCK_CONNECTING:
/* only for connecting sockets */ /* only for connecting sockets */
MIO_INFO1 (sck->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO CONNECT (%d) TO REMOTE SERVER\n", (int)sck->sck); MIO_INFO1 (sck->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO CONNECT (%d) TO REMOTE SERVER\n", (int)sck->hnd);
break; break;
case MIO_DEV_SCK_CONNECTING_SSL: case MIO_DEV_SCK_CONNECTING_SSL:
/* only for connecting sockets */ /* only for connecting sockets */
MIO_INFO1 (sck->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO SSL-CONNECT (%d) TO REMOTE SERVER\n", (int)sck->sck); MIO_INFO1 (sck->mio, "OUTGOING SESSION DISCONNECTED - FAILED TO SSL-CONNECT (%d) TO REMOTE SERVER\n", (int)sck->hnd);
break; break;
case MIO_DEV_SCK_CONNECTED: case MIO_DEV_SCK_CONNECTED:
/* only for connecting sockets */ /* only for connecting sockets */
MIO_INFO1 (sck->mio, "OUTGOING CLIENT CONNECTION GOT TORN DOWN %p(%d).......\n", (int)sck->sck); MIO_INFO1 (sck->mio, "OUTGOING CLIENT CONNECTION GOT TORN DOWN %p(%d).......\n", (int)sck->hnd);
break; break;
case MIO_DEV_SCK_LISTENING: case MIO_DEV_SCK_LISTENING:
MIO_INFO2 (sck->mio, "LISTNER SOCKET %p(%d) - SHUTTUING DOWN\n", sck, (int)sck->sck); MIO_INFO2 (sck->mio, "LISTNER SOCKET %p(%d) - SHUTTUING DOWN\n", sck, (int)sck->hnd);
break; break;
case MIO_DEV_SCK_ACCEPTING_SSL: case MIO_DEV_SCK_ACCEPTING_SSL: /* special case. */
MIO_INFO2 (sck->mio, "LISTENER INCOMING SSL-ACCEPT GOT DISCONNECTED %p(%d) ....\n", sck, (int)sck->sck); /* this progress code indicates that the ssl-level accept failed.
break; * on_disconnected() with this code is called without corresponding on_connect().
* the cli extension are is not initialized yet */
MIO_ASSERT (sck->mio, sck != cli->sck);
MIO_ASSERT (sck->mio, cli->sck == cli->htts->lsck); /* the field is a copy of the extension are of the listener socket. so it should point to the listner socket */
MIO_INFO2 (sck->mio, "LISTENER UNABLE TO SSL-ACCEPT CLIENT %p(%d) ....%p\n", sck, (int)sck->hnd);
return;
case MIO_DEV_SCK_ACCEPTED: case MIO_DEV_SCK_ACCEPTED:
/* only for sockets accepted by the listeners. will never come here because /* only for sockets accepted by the listeners. will never come here because
* the disconnect call for such sockets have been changed in listener_on_connect() */ * the disconnect call for such sockets have been changed in listener_on_connect() */
MIO_INFO2 (sck->mio, "ACCEPTED SOCKET %p(%d) GOT DISCONNECTED.......\n", sck, (int)sck->sck); MIO_INFO2 (sck->mio, "ACCEPTED CLIENT SOCKET %p(%d) GOT DISCONNECTED.......\n", sck, (int)sck->hnd);
break; break;
default: default:
MIO_INFO2 (sck->mio, "SOCKET %p(%d) DISCONNECTED AFTER ALL.......\n", sck, (int)sck->sck); MIO_INFO2 (sck->mio, "SOCKET %p(%d) DISCONNECTED AFTER ALL.......\n", sck, (int)sck->hnd);
break; break;
} }
/* the client sockets are finalized in clinet_on_disconnect(). if (sck == cli->htts->lsck)
* for a listener socket, these fields must be NULL */ {
/* the listener socket has these fields set to NULL */
MIO_ASSERT (sck->mio, cli->htrd == MIO_NULL); MIO_ASSERT (sck->mio, cli->htrd == MIO_NULL);
MIO_ASSERT (sck->mio, cli->sbuf == MIO_NULL); MIO_ASSERT (sck->mio, cli->sbuf == MIO_NULL);
MIO_DEBUG2 (sck->mio, "HTTS(%p) - listener socket disconnect %p\n", cli->htts, sck);
cli->htts->lsck = MIO_NULL; /* let the htts service forget about this listening socket */ cli->htts->lsck = MIO_NULL; /* let the htts service forget about this listening socket */
} }
else
{
/* client socket */
MIO_DEBUG2 (sck->mio, "HTTS(%p) - client socket disconnect %p\n", cli->htts, sck);
MIO_ASSERT (sck->mio, cli->sck == sck);
fini_client (cli);
}
}
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
@ -602,15 +629,19 @@ mio_svc_htts_t* mio_svc_htts_start (mio_t* mio, const mio_skad_t* bind_addr)
if (!htts->lsck) goto oops; if (!htts->lsck) goto oops;
/* the name 'cli' for the listening socket is awkard. /* the name 'cli' for the listening socket is awkard.
* the listing socket will use the htts field for tracking only. * the listing socket will use the htts and sck fields for tracking only.
* each accepted client socket gets the extension size for this size as well. * each accepted client socket gets the extension size for this size as well.
* most of other fields are used for client management */ * most of other fields are used for client management */
cli = (mio_svc_htts_cli_t*)mio_dev_sck_getxtn(htts->lsck); cli = (mio_svc_htts_cli_t*)mio_dev_sck_getxtn(htts->lsck);
cli->htts = htts; cli->htts = htts;
cli->sck = htts->lsck;
MIO_MEMSET (&info, 0, MIO_SIZEOF(info)); MIO_MEMSET (&info, 0, MIO_SIZEOF(info));
info.b.localaddr = *bind_addr; info.b.localaddr = *bind_addr;
info.b.options = MIO_DEV_SCK_BIND_REUSEADDR | MIO_DEV_SCK_BIND_REUSEPORT; info.b.options = MIO_DEV_SCK_BIND_REUSEADDR | MIO_DEV_SCK_BIND_REUSEPORT;
info.b.options |= MIO_DEV_SCK_BIND_SSL;
info.b.ssl_certfile = "localhost.crt";
info.b.ssl_keyfile = "localhost.key";
if (mio_dev_sck_bind(htts->lsck, &info.b) <= -1) goto oops; if (mio_dev_sck_bind(htts->lsck, &info.b) <= -1) goto oops;
MIO_MEMSET (&info, 0, MIO_SIZEOF(info)); MIO_MEMSET (&info, 0, MIO_SIZEOF(info));
@ -626,7 +657,7 @@ mio_svc_htts_t* mio_svc_htts_start (mio_t* mio, const mio_skad_t* bind_addr)
MIO_SVCL_APPEND_SVC (&mio->actsvc, (mio_svc_t*)htts); MIO_SVCL_APPEND_SVC (&mio->actsvc, (mio_svc_t*)htts);
CLIL_INIT (&htts->cli); CLIL_INIT (&htts->cli);
MIO_DEBUG3 (mio, "STARTED SVC(HTTS) LISTENER %p LISTENER SOCKET %p(%d)\n", htts, htts->lsck, (int)htts->lsck->sck); MIO_DEBUG3 (mio, "STARTED SVC(HTTS) LISTENER %p LISTENER SOCKET %p(%d)\n", htts, htts->lsck, (int)htts->lsck->hnd);
return htts; return htts;
oops: oops:
@ -642,7 +673,7 @@ void mio_svc_htts_stop (mio_svc_htts_t* htts)
{ {
mio_t* mio = htts->mio; mio_t* mio = htts->mio;
MIO_DEBUG3 (mio, "STOPPING SVC(HTTS) %p LISTENER SOCKET %p(%d)\n", htts, htts->lsck, (int)(htts->lsck? htts->lsck->sck: -1)); MIO_DEBUG3 (mio, "STOPPING SVC(HTTS) %p LISTENER SOCKET %p(%d)\n", htts, htts->lsck, (int)(htts->lsck? htts->lsck->hnd: -1));
/* htts->lsck may be null if the socket has been destroyed for operational error and /* htts->lsck may be null if the socket has been destroyed for operational error and
* forgotten in the disconnect callback thereafter */ * forgotten in the disconnect callback thereafter */
@ -704,7 +735,6 @@ void mio_svc_htts_rsrc_kill (mio_svc_htts_rsrc_t* rsrc)
printf ("RSRC KILL >>>>> %p\n", rsrc->htts); printf ("RSRC KILL >>>>> %p\n", rsrc->htts);
mio_t* mio = rsrc->htts->mio; mio_t* mio = rsrc->htts->mio;
if (rsrc->on_kill) rsrc->on_kill (rsrc); if (rsrc->on_kill) rsrc->on_kill (rsrc);
RSRCL_UNLINK_RSRC (rsrc); RSRCL_UNLINK_RSRC (rsrc);
@ -1033,7 +1063,7 @@ int mio_svc_htts_docgi (mio_svc_htts_t* htts, mio_dev_sck_t* csck, mio_htre_t* r
#endif #endif
#if 0 #if 0
rsrc = mio_svc_htts_rsrc_make(htts, csck, rsrc_cgi_on_write, rsrc_cgi_on_kill, MIO_SIZEOF(*rsrc_cgi)); rsrc = mio_svc_htts_rsrc_make(htts, csck, rsrc_cgi_on_read, rsrc_cgi_on_write, rsrc_cgi_on_kill, MIO_SIZEOF(*rsrc_cgi));
if (MIO_UNLIKELY(!rsrc)) goto oops; if (MIO_UNLIKELY(!rsrc)) goto oops;
#endif #endif

View File

@ -363,7 +363,7 @@ struct mio_dev_sck_t
MIO_DEV_HEADER; MIO_DEV_HEADER;
mio_dev_sck_type_t type; mio_dev_sck_type_t type;
mio_sckhnd_t sck; mio_sckhnd_t hnd;
int state; int state;

View File

@ -703,6 +703,7 @@ mio_dev_t* mio_dev_make (mio_t* mio, mio_oow_t dev_size, mio_dev_mth_t* dev_mth,
if (!(dev->dev_cap & MIO_DEV_CAP_OUT)) dev->dev_cap |= MIO_DEV_CAP_OUT_CLOSED; if (!(dev->dev_cap & MIO_DEV_CAP_OUT)) dev->dev_cap |= MIO_DEV_CAP_OUT_CLOSED;
if (mio_dev_watch(dev, MIO_DEV_WATCH_START, 0) <= -1) goto oops_after_make; if (mio_dev_watch(dev, MIO_DEV_WATCH_START, 0) <= -1) goto oops_after_make;
/* and place the new device object at the back of the active device list */ /* and place the new device object at the back of the active device list */
MIO_DEVL_APPEND_DEV (&mio->actdev, dev); MIO_DEVL_APPEND_DEV (&mio->actdev, dev);
dev->dev_cap |= MIO_DEV_CAP_ACTIVE; dev->dev_cap |= MIO_DEV_CAP_ACTIVE;

View File

@ -300,8 +300,8 @@ static int dev_sck_make (mio_dev_t* dev, void* ctx)
return -1; return -1;
} }
rdev->sck = open_async_socket(mio, sck_type_map[arg->type].domain, sck_type_map[arg->type].type, sck_type_map[arg->type].proto); rdev->hnd = open_async_socket(mio, sck_type_map[arg->type].domain, sck_type_map[arg->type].type, sck_type_map[arg->type].proto);
if (rdev->sck == MIO_SCKHND_INVALID) goto oops; if (rdev->hnd == MIO_SCKHND_INVALID) goto oops;
rdev->dev_cap = MIO_DEV_CAP_IN | MIO_DEV_CAP_OUT | sck_type_map[arg->type].extra_dev_cap; rdev->dev_cap = MIO_DEV_CAP_IN | MIO_DEV_CAP_OUT | sck_type_map[arg->type].extra_dev_cap;
rdev->on_write = arg->on_write; rdev->on_write = arg->on_write;
@ -314,10 +314,10 @@ static int dev_sck_make (mio_dev_t* dev, void* ctx)
return 0; return 0;
oops: oops:
if (rdev->sck != MIO_SCKHND_INVALID) if (rdev->hnd != MIO_SCKHND_INVALID)
{ {
close_async_socket (mio, rdev->sck); close_async_socket (mio, rdev->hnd);
rdev->sck = MIO_SCKHND_INVALID; rdev->hnd = MIO_SCKHND_INVALID;
} }
return -1; return -1;
} }
@ -334,14 +334,14 @@ static int dev_sck_make_client (mio_dev_t* dev, void* ctx)
* most of the initialization is done by the listening socket device * most of the initialization is done by the listening socket device
* after a client socket has been created. */ * after a client socket has been created. */
rdev->sck = *sck; rdev->hnd = *sck;
rdev->tmrjob_index = MIO_TMRIDX_INVALID; rdev->tmrjob_index = MIO_TMRIDX_INVALID;
if (mio_makesckasync(mio, rdev->sck) <= -1) return -1; if (mio_makesckasync(mio, rdev->hnd) <= -1) return -1;
#if defined(FD_CLOEXEC) #if defined(FD_CLOEXEC)
{ {
int flags = fcntl(rdev->sck, F_GETFD, 0); int flags = fcntl(rdev->hnd, F_GETFD, 0);
if (fcntl(rdev->sck, F_SETFD, flags | FD_CLOEXEC) == -1) if (fcntl(rdev->hnd, F_SETFD, flags | FD_CLOEXEC) == -1)
{ {
mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set FD_CLOEXEC"); mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set FD_CLOEXEC");
return -1; return -1;
@ -361,8 +361,9 @@ static int dev_sck_kill (mio_dev_t* dev, int force)
{ {
/*if (MIO_DEV_SCK_GET_PROGRESS(rdev)) /*if (MIO_DEV_SCK_GET_PROGRESS(rdev))
{*/ {*/
/* for MIO_DEV_SCK_CONNECTING, MIO_DEV_SCK_CONNECTING_SSL, and MIO_DEV_ACCEPTING_SSL /* for MIO_DEV_SCK_CONNECTING, MIO_DEV_SCK_CONNECTING_SSL, and MIO_DEV_SCK_ACCEPTING_SSL
* on_disconnect() is called without corresponding on_connect() */ * on_disconnect() is called without corresponding on_connect().
* it is the same if connect or accept has not been called. */
if (rdev->on_disconnect) rdev->on_disconnect (rdev); if (rdev->on_disconnect) rdev->on_disconnect (rdev);
/*}*/ /*}*/
@ -394,10 +395,10 @@ static int dev_sck_kill (mio_dev_t* dev, int force)
} }
#endif #endif
if (rdev->sck != MIO_SCKHND_INVALID) if (rdev->hnd != MIO_SCKHND_INVALID)
{ {
close_async_socket (mio, rdev->sck); close_async_socket (mio, rdev->hnd);
rdev->sck = MIO_SCKHND_INVALID; rdev->hnd = MIO_SCKHND_INVALID;
} }
return 0; return 0;
@ -406,7 +407,7 @@ static int dev_sck_kill (mio_dev_t* dev, int force)
static mio_syshnd_t dev_sck_getsyshnd (mio_dev_t* dev) static mio_syshnd_t dev_sck_getsyshnd (mio_dev_t* dev)
{ {
mio_dev_sck_t* rdev = (mio_dev_sck_t*)dev; mio_dev_sck_t* rdev = (mio_dev_sck_t*)dev;
return (mio_syshnd_t)rdev->sck; return (mio_syshnd_t)rdev->hnd;
} }
static int dev_sck_read_stateful (mio_dev_t* dev, void* buf, mio_iolen_t* len, mio_devaddr_t* srcaddr) static int dev_sck_read_stateful (mio_dev_t* dev, void* buf, mio_iolen_t* len, mio_devaddr_t* srcaddr)
@ -435,7 +436,7 @@ static int dev_sck_read_stateful (mio_dev_t* dev, void* buf, mio_iolen_t* len, m
#endif #endif
ssize_t x; ssize_t x;
x = recv(rdev->sck, buf, *len, 0); x = recv(rdev->hnd, buf, *len, 0);
if (x == -1) if (x == -1)
{ {
if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; /* no data available */ if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; /* no data available */
@ -459,7 +460,7 @@ static int dev_sck_read_stateless (mio_dev_t* dev, void* buf, mio_iolen_t* len,
ssize_t x; ssize_t x;
srcaddrlen = MIO_SIZEOF(rdev->remoteaddr); srcaddrlen = MIO_SIZEOF(rdev->remoteaddr);
x = recvfrom(rdev->sck, buf, *len, 0, (struct sockaddr*)&rdev->remoteaddr, &srcaddrlen); x = recvfrom(rdev->hnd, buf, *len, 0, (struct sockaddr*)&rdev->remoteaddr, &srcaddrlen);
if (x <= -1) if (x <= -1)
{ {
if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; /* no data available */ if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; /* no data available */
@ -520,7 +521,7 @@ static int dev_sck_write_stateful (mio_dev_t* dev, const void* data, mio_iolen_t
/* the write handler for a stream device must handle a zero-length /* the write handler for a stream device must handle a zero-length
* writing request specially. it's a writing finish indicator. close * writing request specially. it's a writing finish indicator. close
* the writing end of the socket, probably leaving it in the half-closed state */ * the writing end of the socket, probably leaving it in the half-closed state */
if (shutdown(rdev->sck, SHUT_WR) == -1) if (shutdown(rdev->hnd, SHUT_WR) == -1)
{ {
mio_seterrwithsyserr (mio, 0, errno); mio_seterrwithsyserr (mio, 0, errno);
return -1; return -1;
@ -535,7 +536,7 @@ static int dev_sck_write_stateful (mio_dev_t* dev, const void* data, mio_iolen_t
#if defined(MSG_NOSIGNAL) #if defined(MSG_NOSIGNAL)
flags |= MSG_NOSIGNAL; flags |= MSG_NOSIGNAL;
#endif #endif
x = send(rdev->sck, data, *len, flags); x = send(rdev->hnd, data, *len, flags);
if (x == -1) if (x == -1)
{ {
if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; /* no data can be written */ if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; /* no data can be written */
@ -605,7 +606,7 @@ static int dev_sck_writev_stateful (mio_dev_t* dev, const mio_iovec_t* iov, mio_
{ {
/* it's a writing finish indicator. close the writing end of /* it's a writing finish indicator. close the writing end of
* the socket, probably leaving it in the half-closed state */ * the socket, probably leaving it in the half-closed state */
if (shutdown(rdev->sck, SHUT_WR) == -1) if (shutdown(rdev->hnd, SHUT_WR) == -1)
{ {
mio_seterrwithsyserr (mio, 0, errno); mio_seterrwithsyserr (mio, 0, errno);
return -1; return -1;
@ -623,9 +624,9 @@ static int dev_sck_writev_stateful (mio_dev_t* dev, const mio_iovec_t* iov, mio_
MIO_MEMSET (&msg, 0, MIO_SIZEOF(msg)); MIO_MEMSET (&msg, 0, MIO_SIZEOF(msg));
msg.msg_iov = (struct iovec*)iov; msg.msg_iov = (struct iovec*)iov;
msg.msg_iovlen = *iovcnt; msg.msg_iovlen = *iovcnt;
x = sendmsg(rdev->sck, &msg, flags); x = sendmsg(rdev->hnd, &msg, flags);
#else #else
x = writev(rdev->sck, (const struct iovec*)iov, *iovcnt); x = writev(rdev->hnd, (const struct iovec*)iov, *iovcnt);
#endif #endif
if (x == -1) if (x == -1)
{ {
@ -648,7 +649,7 @@ static int dev_sck_write_stateless (mio_dev_t* dev, const void* data, mio_iolen_
mio_dev_sck_t* rdev = (mio_dev_sck_t*)dev; mio_dev_sck_t* rdev = (mio_dev_sck_t*)dev;
ssize_t x; ssize_t x;
x = sendto(rdev->sck, data, *len, 0, dstaddr->ptr, dstaddr->len); x = sendto(rdev->hnd, data, *len, 0, dstaddr->ptr, dstaddr->len);
if (x <= -1) if (x <= -1)
{ {
if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; /* no data can be written */ if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; /* no data can be written */
@ -677,7 +678,7 @@ static int dev_sck_writev_stateless (mio_dev_t* dev, const mio_iovec_t* iov, mio
msg.msg_iov = (struct iovec*)iov; msg.msg_iov = (struct iovec*)iov;
msg.msg_iovlen = *iovcnt; msg.msg_iovlen = *iovcnt;
x = sendmsg(rdev->sck, &msg, 0); x = sendmsg(rdev->hnd, &msg, 0);
if (x <= -1) if (x <= -1)
{ {
if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; /* no data can be written */ if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; /* no data can be written */
@ -710,7 +711,7 @@ static int do_ssl (mio_dev_sck_t* dev, int (*ssl_func)(SSL*))
return -1; return -1;
} }
if (SSL_set_fd(ssl, dev->sck) == 0) if (SSL_set_fd(ssl, dev->hnd) == 0)
{ {
set_ssl_error (mio, ERR_get_error()); set_ssl_error (mio, ERR_get_error());
return -1; return -1;
@ -722,7 +723,7 @@ static int do_ssl (mio_dev_sck_t* dev, int (*ssl_func)(SSL*))
} }
watcher_cmd = MIO_DEV_WATCH_RENEW; watcher_cmd = MIO_DEV_WATCH_RENEW;
watcher_events = 0; watcher_events = MIO_DEV_EVENT_IN;
ret = ssl_func((SSL*)dev->ssl); ret = ssl_func((SSL*)dev->ssl);
if (ret <= 0) if (ret <= 0)
@ -795,7 +796,7 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
if (bnd->options & MIO_DEV_SCK_BIND_BROADCAST) if (bnd->options & MIO_DEV_SCK_BIND_BROADCAST)
{ {
int v = 1; int v = 1;
if (setsockopt(rdev->sck, SOL_SOCKET, SO_BROADCAST, &v, MIO_SIZEOF(v)) == -1) if (setsockopt(rdev->hnd, SOL_SOCKET, SO_BROADCAST, &v, MIO_SIZEOF(v)) == -1)
{ {
mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set SO_BROADCAST"); mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set SO_BROADCAST");
return -1; return -1;
@ -806,7 +807,7 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
{ {
#if defined(SO_REUSEADDR) #if defined(SO_REUSEADDR)
int v = 1; int v = 1;
if (setsockopt(rdev->sck, SOL_SOCKET, SO_REUSEADDR, &v, MIO_SIZEOF(v)) == -1) if (setsockopt(rdev->hnd, SOL_SOCKET, SO_REUSEADDR, &v, MIO_SIZEOF(v)) == -1)
{ {
mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set SO_REUSEADDR"); mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set SO_REUSEADDR");
return -1; return -1;
@ -823,7 +824,7 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
{ {
#if defined(SO_REUSEPORT) #if defined(SO_REUSEPORT)
int v = 1; int v = 1;
if (setsockopt(rdev->sck, SOL_SOCKET, SO_REUSEPORT, &v, MIO_SIZEOF(v)) == -1) if (setsockopt(rdev->hnd, SOL_SOCKET, SO_REUSEPORT, &v, MIO_SIZEOF(v)) == -1)
{ {
mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set SO_REUSEPORT"); mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set SO_REUSEPORT");
return -1; return -1;
@ -840,7 +841,7 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
{ {
#if defined(IP_TRANSPARENT) #if defined(IP_TRANSPARENT)
int v = 1; int v = 1;
if (setsockopt(rdev->sck, SOL_IP, IP_TRANSPARENT, &v, MIO_SIZEOF(v)) == -1) if (setsockopt(rdev->hnd, SOL_IP, IP_TRANSPARENT, &v, MIO_SIZEOF(v)) == -1)
{ {
mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set IP_TRANSPARENT"); mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to set IP_TRANSPARENT");
return -1; return -1;
@ -907,7 +908,7 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
#endif #endif
} }
x = bind(rdev->sck, (struct sockaddr*)&bnd->localaddr, mio_skad_size(&bnd->localaddr)); x = bind(rdev->hnd, (struct sockaddr*)&bnd->localaddr, mio_skad_size(&bnd->localaddr));
if (x == -1) if (x == -1)
{ {
mio_seterrwithsyserr (mio, 0, errno); mio_seterrwithsyserr (mio, 0, errno);
@ -987,13 +988,13 @@ static int dev_sck_ioctl (mio_dev_t* dev, int cmd, void* arg)
#endif #endif
/* the socket is already non-blocking */ /* the socket is already non-blocking */
/*{ /*{
int flags = fcntl (rdev->sck, F_GETFL); int flags = fcntl (rdev->hnd, F_GETFL);
fcntl (rdev->sck, F_SETFL, flags & ~O_NONBLOCK); fcntl (rdev->hnd, F_SETFL, flags & ~O_NONBLOCK);
}*/ }*/
x = connect(rdev->sck, sa, sl); x = connect(rdev->hnd, sa, sl);
/*{ /*{
int flags = fcntl (rdev->sck, F_GETFL); int flags = fcntl (rdev->hnd, F_GETFL);
fcntl (rdev->sck, F_SETFL, flags | O_NONBLOCK); fcntl (rdev->hnd, F_SETFL, flags | O_NONBLOCK);
}*/ }*/
if (x <= -1) if (x <= -1)
{ {
@ -1089,7 +1090,7 @@ fcntl (rdev->sck, F_SETFL, flags | O_NONBLOCK);
return -1; return -1;
} }
x = listen(rdev->sck, lstn->backlogs); x = listen(rdev->hnd, lstn->backlogs);
if (x == -1) if (x == -1)
{ {
mio_seterrwithsyserr (mio, 0, errno); mio_seterrwithsyserr (mio, 0, errno);
@ -1154,7 +1155,7 @@ static int harvest_outgoing_connection (mio_dev_sck_t* rdev)
MIO_ASSERT (mio, !(rdev->state & MIO_DEV_SCK_CONNECTED)); MIO_ASSERT (mio, !(rdev->state & MIO_DEV_SCK_CONNECTED));
len = MIO_SIZEOF(errcode); len = MIO_SIZEOF(errcode);
if (getsockopt(rdev->sck, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1) if (getsockopt(rdev->hnd, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1)
{ {
mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to get SO_ERROR"); mio_seterrbfmtwithsyserr (mio, 0, errno, "unable to get SO_ERROR");
return -1; return -1;
@ -1173,7 +1174,7 @@ static int harvest_outgoing_connection (mio_dev_sck_t* rdev)
} }
addrlen = MIO_SIZEOF(localaddr); addrlen = MIO_SIZEOF(localaddr);
if (getsockname(rdev->sck, (struct sockaddr*)&localaddr, &addrlen) == 0) rdev->localaddr = localaddr; if (getsockname(rdev->hnd, (struct sockaddr*)&localaddr, &addrlen) == 0) rdev->localaddr = localaddr;
if (mio_dev_watch((mio_dev_t*)rdev, MIO_DEV_WATCH_RENEW, MIO_DEV_EVENT_IN) <= -1) if (mio_dev_watch((mio_dev_t*)rdev, MIO_DEV_WATCH_RENEW, MIO_DEV_EVENT_IN) <= -1)
{ {
@ -1252,7 +1253,7 @@ static int accept_incoming_connection (mio_dev_sck_t* rdev)
flags = SOCK_NONBLOCK | SOCK_CLOEXEC; flags = SOCK_NONBLOCK | SOCK_CLOEXEC;
addrlen = MIO_SIZEOF(remoteaddr); addrlen = MIO_SIZEOF(remoteaddr);
clisck = accept4(rdev->sck, (struct sockaddr*)&remoteaddr, &addrlen, flags); clisck = accept4(rdev->hnd, (struct sockaddr*)&remoteaddr, &addrlen, flags);
if (clisck == MIO_SCKHND_INVALID) if (clisck == MIO_SCKHND_INVALID)
{ {
if (errno != ENOSYS) if (errno != ENOSYS)
@ -1273,7 +1274,7 @@ static int accept_incoming_connection (mio_dev_sck_t* rdev)
#endif #endif
addrlen = MIO_SIZEOF(remoteaddr); addrlen = MIO_SIZEOF(remoteaddr);
clisck = accept(rdev->sck, (struct sockaddr*)&remoteaddr, &addrlen); clisck = accept(rdev->hnd, (struct sockaddr*)&remoteaddr, &addrlen);
if (clisck == MIO_SCKHND_INVALID) if (clisck == MIO_SCKHND_INVALID)
{ {
if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0; if (errno == EINPROGRESS || errno == EWOULDBLOCK || errno == EAGAIN) return 0;
@ -1295,7 +1296,7 @@ accept_done:
return -1; return -1;
} }
MIO_ASSERT (mio, clidev->sck == clisck); MIO_ASSERT (mio, clidev->hnd == clisck);
clidev->dev_cap |= MIO_DEV_CAP_IN | MIO_DEV_CAP_OUT | MIO_DEV_CAP_STREAM; clidev->dev_cap |= MIO_DEV_CAP_IN | MIO_DEV_CAP_OUT | MIO_DEV_CAP_STREAM;
clidev->remoteaddr = remoteaddr; clidev->remoteaddr = remoteaddr;
@ -1365,7 +1366,6 @@ accept_done:
if (MIO_IS_POS_NTIME(&rdev->tmout) && if (MIO_IS_POS_NTIME(&rdev->tmout) &&
schedule_timer_job_after(clidev, &rdev->tmout, ssl_accept_timedout) <= -1) schedule_timer_job_after(clidev, &rdev->tmout, ssl_accept_timedout) <= -1)
{ {
/* TODO: call a warning/error callback */
/* timer job scheduling failed. halt the device */ /* timer job scheduling failed. halt the device */
mio_dev_halt ((mio_dev_t*)clidev); mio_dev_halt ((mio_dev_t*)clidev);
} }
@ -1391,7 +1391,7 @@ static int dev_evcb_sck_ready_stateful (mio_dev_t* dev, int events)
mio_scklen_t len; mio_scklen_t len;
len = MIO_SIZEOF(errcode); len = MIO_SIZEOF(errcode);
if (getsockopt(rdev->sck, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1) if (getsockopt(rdev->hnd, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1)
{ {
/* the error number is set to the socket error code. /* the error number is set to the socket error code.
* errno resulting from getsockopt() doesn't reflect the actual * errno resulting from getsockopt() doesn't reflect the actual
@ -1521,9 +1521,10 @@ static int dev_evcb_sck_ready_stateful (mio_dev_t* dev, int events)
else if (events & (MIO_DEV_EVENT_IN | MIO_DEV_EVENT_OUT)) else if (events & (MIO_DEV_EVENT_IN | MIO_DEV_EVENT_OUT))
{ {
int x; int x;
x = accept_ssl(rdev); x = accept_ssl(rdev);
if (x <= -1) return -1; if (x <= -1) return -1;
if (x <= 0) return 0; /* not SSL-accepted yet */ if (x == 0) return 0; /* not SSL-accepted yet */
if (rdev->tmrjob_index != MIO_TMRIDX_INVALID) if (rdev->tmrjob_index != MIO_TMRIDX_INVALID)
{ {
@ -1575,7 +1576,7 @@ static int dev_evcb_sck_ready_stateless (mio_dev_t* dev, int events)
mio_scklen_t len; mio_scklen_t len;
len = MIO_SIZEOF(errcode); len = MIO_SIZEOF(errcode);
if (getsockopt (rdev->sck, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1) if (getsockopt (rdev->hnd, SOL_SOCKET, SO_ERROR, (char*)&errcode, &len) == -1)
{ {
/* the error number is set to the socket error code. /* the error number is set to the socket error code.
* errno resulting from getsockopt() doesn't reflect the actual * errno resulting from getsockopt() doesn't reflect the actual
@ -1707,12 +1708,12 @@ int mio_dev_sck_timedwritev (mio_dev_sck_t* dev, mio_iovec_t* iov, mio_iolen_t i
/* ========================================================================= */ /* ========================================================================= */
int mio_dev_sck_setsockopt (mio_dev_sck_t* dev, int level, int optname, void* optval, mio_scklen_t optlen) int mio_dev_sck_setsockopt (mio_dev_sck_t* dev, int level, int optname, void* optval, mio_scklen_t optlen)
{ {
return setsockopt(dev->sck, level, optname, optval, optlen); return setsockopt(dev->hnd, level, optname, optval, optlen);
} }
int mio_dev_sck_getsockopt (mio_dev_sck_t* dev, int level, int optname, void* optval, mio_scklen_t* optlen) int mio_dev_sck_getsockopt (mio_dev_sck_t* dev, int level, int optname, void* optval, mio_scklen_t* optlen)
{ {
return getsockopt(dev->sck, level, optname, optval, optlen); return getsockopt(dev->hnd, level, optname, optval, optlen);
} }
/* ========================================================================= */ /* ========================================================================= */