mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-05-12 11:18:11 -07:00
Merge branch 'settings'
* settings: Get/display a single preference Lighter msg for loading prefs, json will anyway always tell the filename Make sure colors and emoji are disabled when not on TTY Comment out file path code Pre Filepath cleanup Update preferences.c tuning streamline works Update fileutils.c updates clean up device debug and tweaks
This commit is contained in:
+82
-1
@@ -49,6 +49,7 @@
|
||||
#include "util.h"
|
||||
#ifdef _WIN32
|
||||
#include "scandir.h"
|
||||
#include <direct.h>
|
||||
#endif
|
||||
|
||||
#define PATH_MAX_LENGTH 200
|
||||
@@ -130,7 +131,87 @@ static bool is_directory(const char *filename) {
|
||||
return S_ISDIR(st.st_mode) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief create a new directory.
|
||||
* @param dirname
|
||||
* @return
|
||||
*/
|
||||
// Not used...
|
||||
/*
|
||||
#ifdef _WIN32
|
||||
#define make_dir(a) _mkdir(a)
|
||||
#else
|
||||
#define make_dir(a) mkdir(a,0755) //note 0755 MUST have leading 0 for octal linux file permissions
|
||||
#endif
|
||||
bool create_path(const char *dirname) {
|
||||
|
||||
if (dirname == NULL) // nothing to do
|
||||
return false;
|
||||
|
||||
if ((strlen(dirname) == 1) && (dirname[0] == '/'))
|
||||
return true;
|
||||
|
||||
if ((strlen(dirname) == 2) && (dirname[1] == ':'))
|
||||
return true;
|
||||
|
||||
if (fileExists(dirname) == 0) {
|
||||
|
||||
char *bs = strrchr(dirname, '\\');
|
||||
char *fs = strrchr(dirname, '/');
|
||||
|
||||
if ((bs == NULL) && (fs != NULL)) {
|
||||
*fs = 0x00;
|
||||
create_path (dirname);
|
||||
*fs = '/';
|
||||
}
|
||||
|
||||
if ((bs != NULL) && (fs == NULL)) {
|
||||
*bs = 0x00;
|
||||
create_path (dirname);
|
||||
*bs = '\\';
|
||||
}
|
||||
|
||||
if ((bs != NULL) && (fs != NULL)) {
|
||||
if (strlen (bs) > strlen (fs)) {
|
||||
*fs = 0x00; // No slash
|
||||
create_path (dirname);
|
||||
*fs = '/';
|
||||
} else {
|
||||
*bs = 0x00;
|
||||
create_path (dirname);
|
||||
*bs = '\\';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (make_dir(dirname) != 0) {
|
||||
PrintAndLogEx(ERR, "could not create directory.... "_RED_("%s"),dirname);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
bool setDefaultPath (savePaths_t pathIndex,const char *Path) {
|
||||
|
||||
if (pathIndex < spItemCount) {
|
||||
if ((Path == NULL) && (session.defaultPaths[pathIndex] != NULL)) {
|
||||
free (session.defaultPaths[pathIndex]);
|
||||
session.defaultPaths[pathIndex] = NULL;
|
||||
}
|
||||
|
||||
if (Path != NULL) {
|
||||
session.defaultPaths[pathIndex] = (char *)realloc(session.defaultPaths[pathIndex], strlen(Path) + 1);
|
||||
strcpy(session.defaultPaths[pathIndex], Path);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
static char *filenamemcopy(const char *preferredName, const char *suffix) {
|
||||
if (preferredName == NULL) return NULL;
|
||||
if (suffix == NULL) return NULL;
|
||||
@@ -905,10 +986,10 @@ int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_
|
||||
}
|
||||
*datalen = sptr;
|
||||
}
|
||||
PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName);
|
||||
if (!strcmp(ctype, "settings")) {
|
||||
preferences_load_callback(root);
|
||||
}
|
||||
PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName);
|
||||
out:
|
||||
json_decref(root);
|
||||
free(fileName);
|
||||
|
||||
@@ -74,6 +74,9 @@ typedef enum {
|
||||
} DumpFileType_t;
|
||||
|
||||
int fileExists(const char *filename);
|
||||
//bool create_path(const char *dirname);
|
||||
//bool setDefaultPath (savePaths_t pathIndex,const char *Path); // set a path in the path list session.defaultPaths
|
||||
|
||||
|
||||
/**
|
||||
* @brief Utility function to save data to a binary file. This method takes a preferred name, but if that
|
||||
|
||||
+455
-96
File diff suppressed because it is too large
Load Diff
@@ -9,6 +9,7 @@
|
||||
#define PREFERENCES_H_
|
||||
|
||||
#include "fileutils.h"
|
||||
#include <errno.h>
|
||||
|
||||
// Current working directory will be prepended.
|
||||
#define preferencesFilename "preferences.json"
|
||||
|
||||
+11
-11
@@ -139,21 +139,21 @@ ProxGuiQT::~ProxGuiQT(void) {
|
||||
SliderWidget::SliderWidget() {
|
||||
// Set the initail postion and size from settings
|
||||
if (session.preferences_loaded)
|
||||
setGeometry(session.window_overlay_xpos, session.window_overlay_ypos, session.window_overlay_wsize, session.window_overlay_hsize);
|
||||
setGeometry(session.overlay.x, session.overlay.y, session.overlay.w, session.overlay.h);
|
||||
else
|
||||
resize(800, 400);
|
||||
}
|
||||
|
||||
void SliderWidget::resizeEvent(QResizeEvent *event) {
|
||||
session.window_overlay_hsize = event->size().height();
|
||||
session.window_overlay_wsize = event->size().width();
|
||||
session.overlay.h = event->size().height();
|
||||
session.overlay.w = event->size().width();
|
||||
session.window_changed = true;
|
||||
|
||||
}
|
||||
|
||||
void SliderWidget::moveEvent(QMoveEvent *event) {
|
||||
session.window_overlay_xpos = event->pos().x();
|
||||
session.window_overlay_ypos = event->pos().y();
|
||||
session.overlay.x = event->pos().x();
|
||||
session.overlay.y = event->pos().y();
|
||||
session.window_changed = true;
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) {
|
||||
this->master = master;
|
||||
// Set the initail postion and size from settings
|
||||
if (session.preferences_loaded)
|
||||
setGeometry(session.window_plot_xpos, session.window_plot_ypos, session.window_plot_wsize, session.window_plot_hsize);
|
||||
setGeometry(session.plot.x, session.plot.y, session.plot.w, session.plot.h);
|
||||
else
|
||||
resize(800, 400);
|
||||
|
||||
@@ -224,7 +224,7 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) {
|
||||
QObject::connect(opsController->horizontalSlider_dirthr_down, SIGNAL(valueChanged(int)), this, SLOT(vchange_dthr_down(int)));
|
||||
QObject::connect(opsController->horizontalSlider_askedge, SIGNAL(valueChanged(int)), this, SLOT(vchange_askedge(int)));
|
||||
|
||||
controlWidget->setGeometry(session.window_overlay_xpos, session.window_overlay_ypos, session.window_overlay_wsize, session.window_overlay_hsize);
|
||||
controlWidget->setGeometry(session.overlay.x, session.overlay.y, session.overlay.w, session.overlay.h);
|
||||
|
||||
// Set up the plot widget, which does the actual plotting
|
||||
plot = new Plot(this);
|
||||
@@ -292,13 +292,13 @@ void ProxWidget::showEvent(QShowEvent *event) {
|
||||
plot->show();
|
||||
}
|
||||
void ProxWidget::moveEvent(QMoveEvent *event) {
|
||||
session.window_plot_xpos = event->pos().x();
|
||||
session.window_plot_ypos = event->pos().y();
|
||||
session.plot.x = event->pos().x();
|
||||
session.plot.y = event->pos().y();
|
||||
session.window_changed = true;
|
||||
}
|
||||
void ProxWidget::resizeEvent(QResizeEvent *event) {
|
||||
session.window_plot_hsize = event->size().height();
|
||||
session.window_plot_wsize = event->size().width();
|
||||
session.plot.h = event->size().height();
|
||||
session.plot.w = event->size().width();
|
||||
session.window_changed = true;
|
||||
}
|
||||
|
||||
|
||||
+55
-7
@@ -38,7 +38,7 @@
|
||||
#endif
|
||||
|
||||
// Used to enable/disable use of preferences json file
|
||||
// #define USE_PREFERENCE_FILE
|
||||
#define USE_PREFERENCE_FILE
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
@@ -412,13 +412,14 @@ static void set_my_executable_path(void) {
|
||||
}
|
||||
|
||||
static const char *my_user_directory = NULL;
|
||||
static char _cwd_Buffer [FILENAME_MAX] = {0};
|
||||
// static char _cwd_Buffer [FILENAME_MAX] = {0};
|
||||
|
||||
const char *get_my_user_directory(void) {
|
||||
return my_user_directory;
|
||||
}
|
||||
|
||||
static void set_my_user_directory(void) {
|
||||
my_user_directory = getenv("HOME");
|
||||
/* my_user_directory = getenv("HOME");
|
||||
|
||||
// if not found, default to current directory
|
||||
if (my_user_directory == NULL) {
|
||||
@@ -428,6 +429,38 @@ static void set_my_user_directory(void) {
|
||||
if (_cwd_Buffer[i] == '\\') _cwd_Buffer[i] = '/';
|
||||
// my_user_directory = ".";
|
||||
}
|
||||
*/
|
||||
my_user_directory = getenv("HOME");
|
||||
|
||||
// if not found, default to current directory
|
||||
if (my_user_directory == NULL) {
|
||||
|
||||
char *cwd_Buffer = NULL;
|
||||
uint16_t pathLen = FILENAME_MAX; // should be a good starting point
|
||||
bool error = false;
|
||||
|
||||
cwd_Buffer = (char *)calloc(pathLen, sizeof(uint8_t));
|
||||
|
||||
while (!error && (GetCurrentDir (cwd_Buffer,pathLen) == NULL)) {
|
||||
if (errno == ERANGE) { // Need bigger buffer
|
||||
pathLen += 10; // if buffer was too small add 10 characters and try again
|
||||
cwd_Buffer = realloc(cwd_Buffer, pathLen);
|
||||
} else {
|
||||
error = true;
|
||||
free (cwd_Buffer);
|
||||
cwd_Buffer = NULL;
|
||||
}
|
||||
printf ("Len... %d\n",pathLen);
|
||||
}
|
||||
|
||||
if (!error) {
|
||||
|
||||
for (int i = 0; i < strlen(cwd_Buffer); i++)
|
||||
if (cwd_Buffer[i] == '\\') cwd_Buffer[i] = '/';
|
||||
|
||||
my_user_directory = cwd_Buffer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void show_help(bool showFullHelp, char *exec_name) {
|
||||
@@ -668,10 +701,6 @@ int main(int argc, char *argv[]) {
|
||||
// Load Settings and assign
|
||||
// This will allow the command line to override the settings.json values
|
||||
preferences_load();
|
||||
// Change height/width (Rows,Cols) - Testing
|
||||
// printf ("\e[8;50;100t");
|
||||
// printf ("\e[3;50;50t"); // x,y
|
||||
//printf ("Path : %s \n",my_user_directory);
|
||||
// quick patch for debug level
|
||||
g_debugMode = session.client_debug_level;
|
||||
// settings_save ();
|
||||
@@ -877,6 +906,12 @@ int main(int argc, char *argv[]) {
|
||||
session.supports_colors = true;
|
||||
session.emoji_mode = EMOJI;
|
||||
}
|
||||
} else {
|
||||
// even if prefs, we disable colors if stdin or stdout is not a TTY
|
||||
if ((! session.stdinOnTTY) || (! session.stdoutOnTTY)) {
|
||||
session.supports_colors = false;
|
||||
session.emoji_mode = ALTTEXT;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (session.stdinOnTTY && session.stdoutOnTTY) {
|
||||
@@ -945,9 +980,22 @@ int main(int argc, char *argv[]) {
|
||||
// Doing this here will ensure other checks and updates are saved to over rule default
|
||||
// e.g. Linux color use check
|
||||
if (!session.preferences_loaded) {
|
||||
PrintAndLogEx (INFO,"Creating initial preferences file"); // json save reports file name, so just info msg here
|
||||
preferences_save(); // Save defaults
|
||||
session.preferences_loaded = true;
|
||||
} /* else {
|
||||
// Set device debug level
|
||||
PrintAndLogEx(INFO,"setting device debug loglevel");
|
||||
if (session.pm3_present) {
|
||||
SendCommandNG(CMD_SET_DBGMODE, &session.device_debug_level, 1);
|
||||
PacketResponseNG resp;
|
||||
if (WaitForResponseTimeout(CMD_SET_DBGMODE, &resp, 2000) == false)
|
||||
PrintAndLogEx (INFO,"failed to set device debug loglevel");
|
||||
}
|
||||
else
|
||||
PrintAndLogEx(WARNING,"Proxmark3 not ready to set debug level");
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_GUI
|
||||
|
||||
+8
-9
@@ -19,7 +19,10 @@
|
||||
|
||||
typedef enum logLevel {NORMAL, SUCCESS, INFO, FAILED, WARNING, ERR, DEBUG, INPLACE, HINT} logLevel_t;
|
||||
typedef enum emojiMode {ALIAS, EMOJI, ALTTEXT, ERASE} emojiMode_t;
|
||||
typedef enum clientdebugLevel {OFF, SIMPLE, FULL} clientdebugLevel_t;
|
||||
typedef enum clientdebugLevel {cdbOFF, cdbSIMPLE, cdbFULL} clientdebugLevel_t;
|
||||
// typedef enum devicedebugLevel {ddbOFF, ddbERROR, ddbINFO, ddbDEBUG, ddbEXTENDED} devicedebugLevel_t;
|
||||
//typedef enum savePaths {spDefault, spDump, spTrace, spItemCount} savePaths_t; // last item spItemCount used to auto map to number of files
|
||||
typedef struct {int x; int y; int h; int w;} qtWindow_t;
|
||||
|
||||
typedef struct {
|
||||
bool preferences_loaded;
|
||||
@@ -31,15 +34,11 @@ typedef struct {
|
||||
bool help_dump_mode;
|
||||
bool show_hints;
|
||||
bool window_changed; // track if plot/overlay pos/size changed to save on exit
|
||||
int window_plot_xpos;
|
||||
int window_plot_ypos;
|
||||
int window_plot_hsize;
|
||||
int window_plot_wsize;
|
||||
int window_overlay_xpos;
|
||||
int window_overlay_ypos;
|
||||
int window_overlay_hsize;
|
||||
int window_overlay_wsize;
|
||||
qtWindow_t plot;
|
||||
qtWindow_t overlay;
|
||||
// char *defaultPaths[spItemCount]; // Array should allow loop searching for files
|
||||
clientdebugLevel_t client_debug_level;
|
||||
// uint8_t device_debug_level;
|
||||
} session_arg_t;
|
||||
|
||||
extern session_arg_t session;
|
||||
|
||||
Reference in New Issue
Block a user