# HG changeset patch # User doragasu # Date 1588922794 25200 # Node ID 41b9509ede387420212afc04e6b00ae9b9701301 # Parent 852393cdec7c491dc6a786b8ed19b21d4ed2ccf7 megawifi: implement CMD_DATETIME diff -r 852393cdec7c -r 41b9509ede38 megawifi.c --- a/megawifi.c Fri May 08 00:25:24 2020 -0700 +++ b/megawifi.c Fri May 08 00:26:34 2020 -0700 @@ -6,6 +6,7 @@ #define WINVER 0x501 #include #include +#include #else #include #include @@ -20,6 +21,14 @@ #include "net.h" #include "util.h" +#ifdef _WIN32 +# if BYTE_ORDER == LITTLE_ENDIAN +#define htobe64(val) ((((uint64_t)htonl((val)&0xFFFFFFFF))<<32) | htonl((val)>>32)) +# else +#define htobe64(val) (val) +# endif +#endif + enum { TX_IDLE, TX_LEN1, @@ -47,7 +56,7 @@ #define MSG_NOSIGNAL 0 #endif -enum { +enum mw_state { STATE_IDLE=1, STATE_AP_JOIN, STATE_SCAN, @@ -99,6 +108,7 @@ gen->extra = calloc(1, sizeof(megawifi)); megawifi *mw = gen->extra; mw->module_state = STATE_IDLE; + mw->flags = 0xE0; // cfg_ok, dt_ok, online for (int i = 0; i < 15; i++) { mw->sock_fds[i] = -1; } @@ -512,6 +522,25 @@ end_reply(mw); } +static void cmd_datetime(megawifi *mw) +{ + start_reply(mw, CMD_OK); +#ifdef _WIN32 + __time64_t t = _time64(NULL); + int64_t t_be = htobe64(t); + mw_copy(mw, (uint8_t*)&t_be, sizeof(int64_t)); + mw_puts(mw, _ctime64(&t)); +#else + time_t t = time(NULL); + int64_t t_be = htobe64(t); + mw_copy(mw, (uint8_t*)&t_be, sizeof(int64_t)); + mw_puts(mw, ctime(&t)); +#endif + + mw_putc(mw, '\0'); + end_reply(mw); +} + static void process_command(megawifi *mw) { uint32_t command = mw->transmit_buffer[0] << 8 | mw->transmit_buffer[1]; @@ -528,6 +557,7 @@ mw_putc(mw, 3); mw_putc(mw, 0); mw_puts(mw, "blastem"); + mw_putc(mw, '\0'); end_reply(mw); break; case CMD_ECHO: @@ -602,7 +632,7 @@ break; } int value = 1; - setsockopt(mw->sock_fds[channel], SOL_SOCKET, SO_REUSEADDR, &value, sizeof(value)); + setsockopt(mw->sock_fds[channel], SOL_SOCKET, SO_REUSEADDR, (char*)&value, sizeof(value)); struct sockaddr_in bind_addr; memset(&bind_addr, 0, sizeof(bind_addr)); bind_addr.sin_family = AF_INET; @@ -648,6 +678,9 @@ end_reply(mw); break; } + case CMD_DATETIME: + cmd_datetime(mw); + break; case CMD_SYS_STAT: poll_all_sockets(mw); start_reply(mw, CMD_OK); @@ -672,6 +705,7 @@ start_reply(mw, CMD_OK); // FIXME: This should be get from config file mw_puts(mw, "doragasu.com"); + mw_putc(mw,'\0'); end_reply(mw); break; default: