X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=main.c;h=9cf0041c2b82aea2e25388c7ba1dc812dc44ed45;hb=c2ce9b429da981b5055638c53cf30cb8dea87b78;hp=9c1ce8d3822dcea7fb30d64f8291a726ba6a1778;hpb=50662ac174b73cec4cd9801adea45b6d93f93206;p=oweals%2Fnmrpflash.git diff --git a/main.c b/main.c index 9c1ce8d..9cf0041 100644 --- a/main.c +++ b/main.c @@ -23,8 +23,6 @@ #include #include "nmrpd.h" -#define NMRPFLASH_SET_REGION - int verbosity = 0; void usage(FILE *fp) @@ -32,8 +30,9 @@ void usage(FILE *fp) fprintf(fp, "Usage: nmrpflash [OPTIONS...]\n" "\n" - "Options (-a, -i and -f and/or -c are mandatory):\n" + "Options (-i, -f and/or -c are mandatory):\n" " -a IP address to assign to target device\n" + " -A IP address to assign to seleted interface\n" " -c Command to run before (or instead of) TFTP upload\n" " -f Firmware file\n" " -F Remote filename to use during TFTP upload\n" @@ -62,10 +61,14 @@ void usage(FILE *fp) #endif ")\n\n" #ifndef NMRPFLASH_WINDOWS - "# nmrpflash -i eth0 -a 192.168.1.254 -f firmware.bin\n" + "# nmrpflash -i eth0 -f firmware.bin\n" #else - "C:\\> nmrpflash.exe -i net0 -a 192.168.1.254 -f firmware.bin\n" + "C:\\> nmrpflash.exe -i net0 -f firmware.bin\n" #endif + "\n" + "When using -c, the environment variables IP, PORT, NETMASK\n" + "and MAC are set to the device IP address, TFTP port, subnet\n" + "mask and MAC address, respectively.\n" "\n" "nmrpflash %s, Copyright (C) 2016 Joseph C. Lehner\n" "nmrpflash is free software, licensed under the GNU GPLv3.\n" @@ -79,26 +82,41 @@ void usage(FILE *fp) void require_admin() { SID_IDENTIFIER_AUTHORITY auth = SECURITY_NT_AUTHORITY; - PSID adminGroup = NULL; - BOOL success = AllocateAndInitializeSid( + PSID group = NULL; + BOOL admin, success = AllocateAndInitializeSid( &auth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, - 0, 0, 0, 0, 0, 0, &adminGroup + 0, 0, 0, 0, 0, 0, &group ); if (success) { - if (CheckTokenMembership(NULL, adminGroup, &success)) { - if (!success) { + success = CheckTokenMembership(NULL, group, &admin); + FreeSid(group); + if (success) { + if (!admin) { fprintf(stderr, "Error: must be run as administrator\n"); exit(1); } else { return; } } - FreeSid(adminGroup); } fprintf(stderr, "Warning: failed to check administrator privileges\n"); } + +void show_exit_prompt() +{ + DWORD pid; + HWND win = GetConsoleWindow(); + if (!win || !GetWindowThreadProcessId(win, &pid)) { + return; + } + + if (GetCurrentProcessId() == pid) { + printf("Press any key to exit\n"); + getch(); + } +} #else void require_admin() { @@ -119,6 +137,7 @@ int main(int argc, char **argv) .tftpcmd = NULL, .file_local = NULL, .file_remote = NULL, + .ipaddr_intf = NULL, .ipaddr = NULL, .ipmask = "255.255.255.0", .intf = NULL, @@ -133,6 +152,8 @@ int main(int argc, char **argv) char *windir = NULL; WSADATA wsa; + atexit(&show_exit_prompt); + val = WSAStartup(MAKEWORD(2, 2), &wsa); if (val != 0) { win_perror2("WSAStartup", val); @@ -160,12 +181,15 @@ int main(int argc, char **argv) opterr = 0; - while ((c = getopt(argc, argv, "a:c:f:F:i:m:M:p:R:t:T:hLVvU")) != -1) { + while ((c = getopt(argc, argv, "a:A:c:f:F:i:m:M:p:R:t:T:hLVvU")) != -1) { max = 0x7fffffff; switch (c) { case 'a': args.ipaddr = optarg; break; + case 'A': + args.ipaddr_intf = optarg; + break; case 'c': args.tftpcmd = optarg; break; @@ -241,12 +265,21 @@ int main(int argc, char **argv) } } - if (!list && ((!args.file_local && !args.tftpcmd) || !args.intf || !args.ipaddr)) { + if (args.ipaddr_intf && !args.ipaddr) { + fprintf(stderr, "Error: cannot use -A without using -a .\n"); + return 1; + } + +#ifndef NMRPFLASH_FUZZ + if (!list && ((!args.file_local && !args.tftpcmd) || !args.intf /*|| !args.ipaddr*/)) { usage(stderr); return 1; } - require_admin(); + if (!list) { + require_admin(); + } +#endif val = !list ? nmrp_do(&args) : ethsock_list_all(); out: