diff --git a/src/vdmodem/vdmodem.c b/src/vdmodem/vdmodem.c index 1f3a001c6031be80d69a2fe84a663ac914b8647a..f7f5805bbe5b6a10888991ff4d34d53dfab80834 100644 --- a/src/vdmodem/vdmodem.c +++ b/src/vdmodem/vdmodem.c @@ -92,9 +92,23 @@ static void dprintf(const char *fmt, ...) OutputDebugString(buf); } -void usage(void) +void usage(const char* progname) { - fprintf(stderr, "usage:\n"); + fprintf(stderr, "usage: %s [-opts] <program> [options]\n" + "opts:\n" + "\t-telnet Use Telnet protocol by default\n" + "\t-raw Use Raw TCP by default\n" + "\t-4 Use IPv4 address family by default\n" + "\t-6 Use IPv6 address family by default\n" + "\t-l[addr] Listen for incoming TCP connections\n" + "\t [on optionally-specified network interface]\n" + "\t-p<port> Specify default TCP port number (decimal)\n" + "\t-d Enable debug output\n" + "\t-h<sock> Specify socket descriptor/handle to use (decimal)\n" + "\t-r<cps> Specify maximum receive data rate (chars/second)\n" + "\t-c<fname> Specify alternate configuration (.ini) filename\n" + ,progname + ); exit(EXIT_SUCCESS); } @@ -945,6 +959,26 @@ void listen_thread(void* arg) } } +bool read_ini(const char* ini_fname) +{ + printf("Reading '%s'\n", ini_fname); + FILE* fp = iniOpenFile(ini_fname, /* create: */false); + if(fp == NULL) + return false; + + 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, "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); + return true; +} + int main(int argc, char** argv) { int argn = 1; @@ -972,25 +1006,13 @@ int main(int argc, char** argv) cfg.address_family = ADDRESS_FAMILY_INET; ini = strListInit(); - SAFECOPY(ini_fname, argv[0]); + GetModuleFileName(NULL, ini_fname, sizeof(ini_fname) - 1); char* ext = getfext(ini_fname); if(ext != NULL) *ext = 0; SAFECAT(ini_fname, ".ini"); - fprintf(stderr, "ini_fname = '%s'\n", ini_fname); - FILE* fp = iniOpenFile(ini_fname, /* create: */false); - 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, "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); - } + if(fexist(ini_fname)) + read_ini(ini_fname); for(; argn < argc; argn++) { char* arg = argv[argn]; @@ -1027,6 +1049,12 @@ int main(int argc, char** argv) case 'p': cfg.port = atoi(arg + 1); break; + case 'c': + if(!read_ini(arg + 1)) { + fprintf(stderr, "!Error %d reading: %s\n", errno, arg + 1); + return EXIT_FAILURE; + } + break; case 'd': cfg.debug = true; break; @@ -1042,12 +1070,12 @@ int main(int argc, char** argv) rx_delay = strtoul(arg + 1, NULL, 10); break; default: - usage(); + usage(argv[0]); break; } } if(argn >= argc) { - usage(); + usage(argv[0]); } struct modem modem = {0}; @@ -1086,7 +1114,7 @@ int main(int argc, char** argv) } const char* dropfile = "dosxtrn.env"; - fp = fopen(dropfile, "w"); + FILE* fp = fopen(dropfile, "w"); if(fp == NULL) { perror(dropfile); return EXIT_FAILURE; @@ -1154,7 +1182,7 @@ int main(int argc, char** argv) BOOL x64 = FALSE; IsWow64Process(GetCurrentProcess(), &x64); - sprintf(fullmodemline, "dosxtrn.exe %s %s %u svdm.ini", dropfile, x64 ? "x64" : "NT", cfg.node_num); + sprintf(fullmodemline, "dosxtrn.exe %s %s %u %s", dropfile, x64 ? "x64" : "NT", cfg.node_num, ini_fname); PROCESS_INFORMATION process_info; if(!CreateProcess( @@ -1163,7 +1191,7 @@ int main(int argc, char** argv) NULL, // process security attributes NULL, // thread security attributes FALSE, // handle inheritance flag - 0, //CREATE_NEW_CONSOLE/*|CREATE_SEPARATE_WOW_VDM*/, // creation flags + 0, // creation flags NULL, // pointer to new environment block NULL , // pointer to current directory name &startup_info, // pointer to STARTUPINFO