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 <ipaddr> IP address to assign to target device\n"
+ " -A <ipaddr> IP address to assign to seleted interface\n"
" -c <command> Command to run before (or instead of) TFTP upload\n"
" -f <firmware> Firmware file\n"
" -F <filename> Remote filename to use during TFTP upload\n"
#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"
if (success) {
if (CheckTokenMembership(NULL, adminGroup, &success)) {
if (!success) {
- fprintf(stderr, "Error: must be run as administrator");
+ fprintf(stderr, "Error: must be run as administrator\n");
exit(1);
} else {
return;
FreeSid(adminGroup);
}
- fprintf(stderr, "Warning: failed to check administrator privileges");
+ fprintf(stderr, "Warning: failed to check administrator privileges\n");
}
#else
void require_admin()
{
if (getuid() != 0) {
- fprintf(stderr, "Error: must be run as root");
+ fprintf(stderr, "Error: must be run as root\n");
exit(1);
}
}
int list = 0;
struct nmrpd_args args = {
.rx_timeout = 200,
- .ul_timeout = 120000,
+ .ul_timeout = 5 * 60 * 1000,
.tftpcmd = NULL,
.file_local = NULL,
.file_remote = NULL,
+ .ipaddr_intf = NULL,
.ipaddr = NULL,
.ipmask = "255.255.255.0",
.intf = NULL,
.region = NULL,
};
#ifdef NMRPFLASH_WINDOWS
+ char *newpath = NULL;
+ char *oldpath = NULL;
+ char *windir = NULL;
WSADATA wsa;
val = WSAStartup(MAKEWORD(2, 2), &wsa);
win_perror2("WSAStartup", val);
return 1;
}
+
+
+#ifndef _WIN64
+ // This dirty hack works around the WOW64 file system redirector[1], which would prevent
+ // us from calling programs residing in %windir%\System32 when running on a 64bit system
+ // (since nmrpflash is currently shipped as 32bit only).
+ //
+ // [1] https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85).aspx
+
+ oldpath = getenv("PATH");
+ windir = getenv("WINDIR");
+ if (oldpath && windir) {
+ newpath = malloc(strlen(oldpath) + strlen(windir) + 32);
+ sprintf(newpath, "%s;%s\\Sysnative", oldpath, windir);
+ SetEnvironmentVariable("PATH", newpath);
+ free(newpath);
+ }
+#endif
#endif
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;
}
}
- if (!list && ((!args.file_local && !args.tftpcmd) || !args.intf || !args.ipaddr)) {
+ if (args.ipaddr_intf && !args.ipaddr) {
+ fprintf(stderr, "Error: cannot use -A <ipaddr> without using -a <ipaddr>.\n");
+ return 1;
+ }
+
+#ifndef NMRPFLASH_FUZZ
+ if (!list && ((!args.file_local && !args.tftpcmd) || !args.intf /*|| !args.ipaddr*/)) {
usage(stderr);
return 1;
}
require_admin();
+#endif
val = !list ? nmrp_do(&args) : ethsock_list_all();
out: