cutter/src/main.cpp

122 lines
3.6 KiB
C++
Raw Normal View History

#include <QApplication>
2017-04-01 11:20:13 +00:00
#include <QCommandLineParser>
#include <QTextCodec>
#include <QMessageBox>
2017-10-01 19:09:42 +00:00
#include "MainWindow.h"
2017-10-02 09:41:28 +00:00
#include "dialogs/NewFileDialog.h"
2017-10-01 19:09:42 +00:00
#include "dialogs/OptionsDialog.h"
2017-09-25 12:55:41 +00:00
2017-10-23 09:22:15 +00:00
#ifdef __unix__
2017-10-23 09:37:30 +00:00
#define PREFIX "/tmp/.cutter_usr"
2017-10-23 09:22:15 +00:00
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
void set_appimage_symlink(char* argv0)
{
char* path = strdup(argv0);
char* i = strrchr(path, '/');
*(i+1) = '\0';
char* dest = strcat(path, "usr/");
struct stat buf;
2017-10-23 09:37:30 +00:00
if (lstat(PREFIX, &buf) == 0 && S_ISLNK(buf.st_mode)) {
remove(PREFIX);
2017-10-23 09:22:15 +00:00
}
2017-10-23 09:37:30 +00:00
symlink(dest, PREFIX);
2017-10-23 09:22:15 +00:00
free(path);
}
#endif
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
2017-09-25 12:55:41 +00:00
a.setOrganizationName("cutter");
a.setApplicationName("cutter");
a.setApplicationVersion(APP_VERSION);
// Set QString codec to UTF-8
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
#endif
QCommandLineParser cmd_parser;
cmd_parser.setApplicationDescription(QObject::tr("A Qt and C++ GUI for radare2 reverse engineering framework"));
cmd_parser.addHelpOption();
cmd_parser.addVersionOption();
cmd_parser.addPositionalArgument("filename", QObject::tr("Filename to open."));
QCommandLineOption anal_option({"A", "anal"},
2017-06-03 12:27:23 +00:00
QObject::tr("Automatically start analysis. Needs filename to be specified. May be a value between 0 and 4."),
QObject::tr("level"));
cmd_parser.addOption(anal_option);
cmd_parser.process(a);
2017-04-01 11:20:13 +00:00
QStringList args = cmd_parser.positionalArguments();
2017-04-01 11:20:13 +00:00
// Check r2 version
QString r2version = r_core_version();
QString localVersion = "" R2_GITTAP;
2017-04-09 19:55:06 +00:00
if (r2version != localVersion)
{
QMessageBox msg;
msg.setIcon(QMessageBox::Critical);
msg.setWindowIcon(QIcon(":/img/logo-small.png"));
msg.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msg.setWindowTitle(QObject::tr("Version mismatch!"));
2017-09-25 12:55:41 +00:00
msg.setText(QString(QObject::tr("The version used to compile cutter (%1) does not match the binary version of radare2 (%2). This could result in unexpected behaviour. Are you sure you want to continue?")).arg(localVersion, r2version));
2017-04-09 19:55:06 +00:00
if (msg.exec() == QMessageBox::No)
return 1;
}
bool anal_level_specified = false;
int anal_level = 0;
if (cmd_parser.isSet(anal_option))
{
anal_level = cmd_parser.value(anal_option).toInt(&anal_level_specified);
if (!anal_level_specified || anal_level < 0 || anal_level > 4)
{
printf("%s\n", QObject::tr("Invalid Analysis Level. May be a value between 0 and 4.").toLocal8Bit().constData());
return 1;
}
}
2017-04-09 19:55:06 +00:00
if (args.empty())
2017-04-01 11:20:13 +00:00
{
if (anal_level_specified)
{
printf("%s\n", QObject::tr("Filename must be specified to start analysis automatically.").toLocal8Bit().constData());
return 1;
}
2017-04-01 11:20:13 +00:00
NewFileDialog *n = new NewFileDialog();
n->setAttribute(Qt::WA_DeleteOnClose);
2017-04-01 11:33:16 +00:00
n->show();
2017-04-01 11:20:13 +00:00
}
else // filename specified as positional argument
{
MainWindow *main = new MainWindow();
main->openNewFile(args[0], anal_level_specified ? anal_level : -1);
2017-04-01 11:20:13 +00:00
}
2017-10-23 09:22:15 +00:00
// Hack to make it work with AppImage
#ifdef __unix__
set_appimage_symlink(argv[0]);
#endif
int ret = a.exec();
#ifdef __unix__
2017-10-23 09:37:30 +00:00
remove(PREFIX);
2017-10-23 09:22:15 +00:00
#endif
return ret;
}