diff --git a/src/vdmodem/vdmodem.c b/src/vdmodem/vdmodem.c index e3f0675ceb97db210ebe9d05708c2a0414183d2a..1f3a001c6031be80d69a2fe84a663ac914b8647a 100644 --- a/src/vdmodem/vdmodem.c +++ b/src/vdmodem/vdmodem.c @@ -249,28 +249,51 @@ bool kbhit() return waiting != 0; } +const char* iniKeyAutoAnswer = "AutoAnswer"; +const char* iniKeyEcho = "Echo"; +const char* iniKeyQuiet = "Quiet"; +const char* iniKeyNumeric = "Numeric"; +const char* iniKeyCR = "CR"; +const char* iniKeyLF = "LF"; +const char* iniKeyBS = "BS"; +const char* iniKeyESC = "ESC"; +const char* iniKeyExtResults = "ExtResults"; +const char* iniKeyDialWait = "DialWait"; +const char* iniKeyGuardTime = "GuardTime"; + void init(struct modem* modem) { const char* section = "modem"; memset(modem, 0, sizeof(*modem)); - modem->auto_answer = iniGetBool(ini, section, "auto_answer", FALSE); - modem->echo_off = !iniGetBool(ini, section, "echo", TRUE); - modem->quiet = iniGetBool(ini, section, "quiet", FALSE); - modem->numeric_mode = iniGetBool(ini, section, "numeric", FALSE); - modem->cr = (char)iniGetInteger(ini, section, "cr", '\r'); - modem->lf = (char)iniGetInteger(ini, section, "lf", '\n'); - modem->bs = (char)iniGetInteger(ini, section, "bs", '\b'); - modem->esc = (char)iniGetInteger(ini, section, "esc", '+'); - modem->ext_results = iniGetInteger(ini, section, "ext_results", 4); - modem->dial_wait = iniGetInteger(ini, section, "dial_wait", 60); - modem->guard_time = iniGetInteger(ini, section, "guard_time", 50); + modem->auto_answer = iniGetBool(ini, section, iniKeyAutoAnswer, FALSE); + modem->echo_off = !iniGetBool(ini, section, iniKeyEcho, TRUE); + modem->quiet = iniGetBool(ini, section, iniKeyQuiet, FALSE); + modem->numeric_mode = iniGetBool(ini, section, iniKeyNumeric, FALSE); + modem->cr = (char)iniGetInteger(ini, section, iniKeyCR, '\r'); + modem->lf = (char)iniGetInteger(ini, section, iniKeyLF, '\n'); + modem->bs = (char)iniGetInteger(ini, section, iniKeyBS, '\b'); + modem->esc = (char)iniGetInteger(ini, section, iniKeyESC, '+'); + modem->ext_results = iniGetInteger(ini, section, iniKeyExtResults, 4); + modem->dial_wait = iniGetInteger(ini, section, iniKeyDialWait, 60); + modem->guard_time = iniGetInteger(ini, section, iniKeyGuardTime, 50); } bool write_cfg(struct modem* modem) { dprintf(__FUNCTION__); + ini_style_t* style = NULL; const char* section = "modem"; - iniSetBool(&ini, section, "auto_answer", modem->auto_answer, /* style: */NULL); + iniSetBool(&ini, section, iniKeyAutoAnswer, modem->auto_answer, style); + iniSetBool(&ini, section, iniKeyEcho, !modem->echo_off, style); + iniSetBool(&ini, section, iniKeyQuiet, modem->quiet, style); + iniSetBool(&ini, section, iniKeyNumeric, modem->numeric_mode, style); + iniSetInteger(&ini, section, iniKeyCR, modem->cr, style); + iniSetInteger(&ini, section, iniKeyLF, modem->lf, style); + iniSetInteger(&ini, section, iniKeyBS, modem->bs, style); + iniSetInteger(&ini, section, iniKeyESC, modem->esc, style); + iniSetInteger(&ini, section, iniKeyExtResults, modem->ext_results, style); + iniSetInteger(&ini, section, iniKeyDialWait, modem->dial_wait, style); + iniSetInteger(&ini, section, iniKeyGuardTime, modem->guard_time, style); bool result = false; FILE* fp = iniOpenFile(ini_fname, /* create: */TRUE); if(fp != NULL) { @@ -290,7 +313,7 @@ bool write_save(struct modem* modem, ulong savnum) if(savnum >= MAX_SAVES) return false; - SAFEPRINTF(key, "save%lu", savnum); + SAFEPRINTF(key, "Save%lu", savnum); FILE* fp = iniOpenFile(ini_fname, /* create: */TRUE); if(fp == NULL) return false; @@ -476,6 +499,26 @@ BYTE* telnet_interpret(BYTE* inbuf, size_t inlen, BYTE* outbuf, size_t *outlen) return(outbuf); } +void setsockopts(SOCKET sock) +{ + char error[256] = ""; + dprintf("Setting socket options"); + if(iniGetSocketOptions(ini, "sockopts", sock, error, sizeof(error)) != 0) + dprintf("!ERROR %s", error); + int value = 0; + socklen_t len = sizeof(value); + if(getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*)&value, &len) == 0) + dprintf("Socket send buffer length: %d bytes", value); + value = 0; + len = sizeof(value); + if(getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*)&value, &len) == 0) + dprintf("Socket receive buffer length: %d bytes", value); + value = 0; + len = sizeof(value); + if(getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&value, &len) == 0) + dprintf("Socket TCP_NODELAY: %d", value); +} + // Significant portions copies from syncterm/conn.c char* dial(struct modem* modem, const char* number) { @@ -591,6 +634,7 @@ connected: res=NULL; nonblock=0; ioctlsocket(sock, FIONBIO, &nonblock); + setsockopts(sock); if(socket_recvdone(sock, 0)) { dprintf("%s %d socket_recvdone", __FILE__, __LINE__); return response(modem, NO_CARRIER); @@ -621,6 +665,7 @@ char* answer(struct modem* modem) dprintf("accept returned %d (errno=%ld)", sock, WSAGetLastError()); return response(modem, NO_CARRIER); } + setsockopts(sock); char tmp[256]; dprintf("Connection accepted from TCP port %hu at %s", inet_addrport(&addr), inet_addrtop(&addr, tmp, sizeof(tmp))); @@ -913,7 +958,7 @@ int main(int argc, char** argv) WSADATA WSAData; int result; - fprintf(stderr, TITLE " v" VERSION " Copyright %s Rob Swindell\n", &__DATE__[7]); + fprintf(stdout, TITLE " v" VERSION " Copyright %s Rob Swindell\n", &__DATE__[7]); if((result = WSAStartup(MAKEWORD(1,1), &WSAData)) == 0) dprintf("%s %s",WSAData.szDescription, WSAData.szSystemStatus); else { @@ -937,14 +982,14 @@ int main(int argc, char** argv) if(fp != NULL) { ini = iniReadFile(fp); iniCloseFile(fp); - mode = iniGetEnum(ini, ROOT_SECTION, "mode", modeNames, mode); - cfg.port = iniGetShortInt(ini, ROOT_SECTION, "port", cfg.port); - cfg.node_num = iniGetInteger(ini, ROOT_SECTION, "node", cfg.node_num); - cfg.listen = iniGetBool(ini, ROOT_SECTION, "listen", cfg.listen); - cfg.debug = iniGetBool(ini, ROOT_SECTION, "debug", cfg.debug); - cfg.server_echo = iniGetBool(ini, ROOT_SECTION, "server_echo", cfg.server_echo); - cfg.data_rate = iniGetLongInt(ini, ROOT_SECTION, "rate", cfg.data_rate); - cfg.address_family = iniGetEnum(ini, ROOT_SECTION, "address_family", addrFamilyNames, cfg.address_family); + mode = iniGetEnum(ini, ROOT_SECTION, "Mode", modeNames, mode); + cfg.port = iniGetShortInt(ini, ROOT_SECTION, "Port", cfg.port); + cfg.node_num = iniGetInteger(ini, ROOT_SECTION, "Node", cfg.node_num); + cfg.listen = iniGetBool(ini, ROOT_SECTION, "Listen", cfg.listen); + cfg.debug = iniGetBool(ini, ROOT_SECTION, "Debug", cfg.debug); + cfg.server_echo = iniGetBool(ini, ROOT_SECTION, "ServerEcho", cfg.server_echo); + cfg.data_rate = iniGetLongInt(ini, ROOT_SECTION, "Rate", cfg.data_rate); + cfg.address_family = iniGetEnum(ini, ROOT_SECTION, "AddressFamily", addrFamilyNames, cfg.address_family); } for(; argn < argc; argn++) { @@ -1034,8 +1079,10 @@ int main(int argc, char** argv) _beginthread(listen_thread, /* stack_size: */0, &modem); } else { - if(sock != INVALID_SOCKET) + if(sock != INVALID_SOCKET) { + setsockopts(sock); connected(&modem); + } } const char* dropfile = "dosxtrn.env";