#include <stdio.h>
#include "nmrpd.h"
-#define NMRPFLASH_SET_REGION
-
int verbosity = 0;
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 <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"
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()
{
.tftpcmd = NULL,
.file_local = NULL,
.file_remote = NULL,
+ .ipaddr_intf = NULL,
.ipaddr = NULL,
.ipmask = "255.255.255.0",
.intf = NULL,
char *windir = NULL;
WSADATA wsa;
+ atexit(&show_exit_prompt);
+
val = WSAStartup(MAKEWORD(2, 2), &wsa);
if (val != 0) {
win_perror2("WSAStartup", val);
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();
+ if (!list) {
+ require_admin();
+ }
+#endif
val = !list ? nmrp_do(&args) : ethsock_list_all();
out: