# HG changeset patch # User doragasu # Date 1588922665 25200 # Node ID c16dabdb0aad6c22fef33ae7f28589cb0fa2757e # Parent bd70f1e15684d66cd9b636457571a75858413b75 megawifi: use util module socket functions for WIN32 compatibility diff -r bd70f1e15684 -r c16dabdb0aad megawifi.c --- a/megawifi.c Fri May 08 00:22:54 2020 -0700 +++ b/megawifi.c Fri May 08 00:24:25 2020 -0700 @@ -17,6 +17,7 @@ #include #include "genesis.h" #include "net.h" +#include "util.h" enum { TX_IDLE, @@ -85,11 +86,11 @@ m68k_context *m68k = context; genesis_context *gen = m68k->system; if (!gen->extra) { + socket_init(); gen->extra = calloc(1, sizeof(megawifi)); megawifi *mw = gen->extra; mw->module_state = STATE_IDLE; - for (int i = 0; i < 15; i++) - { + for (int i = 0; i < 15; i++) { mw->sock_fds[i] = -1; } } @@ -145,16 +146,13 @@ if (mw->channel_state[channel] == SOCKST_TCP_LISTEN) { int res = accept(mw->sock_fds[channel], NULL, NULL); if (res >= 0) { - close(mw->sock_fds[channel]); -#ifndef _WIN32 -//FIXME: Set nonblocking on Windows too - fcntl(res, F_SETFL, O_NONBLOCK); -#endif + socket_close(mw->sock_fds[channel]); + socket_blocking(res, 0); mw->sock_fds[channel] = res; mw->channel_state[channel] = SOCKST_TCP_EST; mw->channel_flags |= 1 << (channel + 1); } else if (errno != EAGAIN && errno != EWOULDBLOCK) { - close(mw->sock_fds[channel]); + socket_close(mw->sock_fds[channel]); mw->channel_state[channel] = SOCKST_NONE; mw->channel_flags |= 1 << (channel + 1); } @@ -163,7 +161,7 @@ if (max > MAX_RECV_SIZE) { max = MAX_RECV_SIZE; } - int bytes = recv(mw->sock_fds[channel], mw->receive_buffer + mw->receive_bytes + 3, max, 0); + int bytes = recv(mw->sock_fds[channel], (char*)(mw->receive_buffer + mw->receive_bytes + 3), max, 0); if (bytes > 0) { mw_putc(mw, STX); mw_putc(mw, bytes >> 8 | (channel+1) << 4); @@ -171,8 +169,8 @@ mw->receive_bytes += bytes; mw_putc(mw, ETX); //should this set the channel flag? - } else if (bytes < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { - close(mw->sock_fds[channel]); + } else if (bytes < 0 && !socket_error_is_wouldblock()) { + socket_close(mw->sock_fds[channel]); mw->channel_state[channel] = SOCKST_NONE; mw->channel_flags |= 1 << (channel + 1); } @@ -293,10 +291,7 @@ goto err; } -#ifndef _WIN32 - //FIXME: Set nonblocking on Windows too - fcntl(s, F_SETFL, O_NONBLOCK); -#endif + socket_blocking(s, 0); mw->sock_fds[channel] = s; mw->channel_state[channel] = SOCKST_TCP_EST; mw->channel_flags |= 1 << (channel + 1); @@ -436,7 +431,7 @@ } channel--; if (mw->sock_fds[channel] >= 0) { - close(mw->sock_fds[channel]); + socket_close(mw->sock_fds[channel]); } mw->sock_fds[channel] = socket(AF_INET, SOCK_STREAM, 0); if (mw->sock_fds[channel] < 0) { @@ -451,7 +446,7 @@ bind_addr.sin_family = AF_INET; bind_addr.sin_port = htons(mw->transmit_buffer[8] << 8 | mw->transmit_buffer[9]); if (bind(mw->sock_fds[channel], (struct sockaddr *)&bind_addr, sizeof(bind_addr)) != 0) { - close(mw->sock_fds[channel]); + socket_close(mw->sock_fds[channel]); mw->sock_fds[channel] = -1; start_reply(mw, CMD_ERROR); end_reply(mw); @@ -460,15 +455,12 @@ int res = listen(mw->sock_fds[channel], 2); start_reply(mw, res ? CMD_ERROR : CMD_OK); if (res) { - close(mw->sock_fds[channel]); + socket_close(mw->sock_fds[channel]); mw->sock_fds[channel] = -1; } else { mw->channel_flags |= 1 << (channel + 1); mw->channel_state[channel] = SOCKST_TCP_LISTEN; -#ifndef _WIN32 -//FIXME: Set nonblocking on Windows too - fcntl(mw->sock_fds[channel], F_SETFL, O_NONBLOCK); -#endif + socket_blocking(mw->sock_fds[channel], 0); } end_reply(mw); break; @@ -511,7 +503,7 @@ case CMD_SERVER_URL_GET: start_reply(mw, CMD_OK); // FIXME: This should be get from config file - mw_puts(mw, "192.168.1.32"); + mw_puts(mw, "doragasu.com"); end_reply(mw); break; default: @@ -530,9 +522,9 @@ int sock_fd = mw->sock_fds[channel]; // TODO Handle UDP type sockets if (sock_fd >= 0 && channel_state == SOCKST_TCP_EST) { - int sent = send(sock_fd, mw->transmit_buffer, mw->transmit_bytes, MSG_NOSIGNAL); - if (sent < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { - close(sock_fd); + int sent = send(sock_fd, (char*)mw->transmit_buffer, mw->transmit_bytes, 0); + if (sent < 0 && !socket_error_is_wouldblock()) { + socket_close(sock_fd); mw->sock_fds[channel] = -1; mw->channel_state[channel] = SOCKST_NONE; mw->channel_flags |= 1 << mw->transmit_channel;