xca/lib/xca_db_stat.cpp
Christian Hohnstaedt cefb140601 Switch to Qt5 for Windows build and installation
Don't depend on htonl() and friends to avoid lwsock32
Fixup WIN32 define to use the Qt definition
2017-07-17 09:27:46 +02:00

109 lines
2.4 KiB
C++

/* vi: set sw=4 ts=4:
*
* Copyright (C) 2001 - 2015 Christian Hohnstaedt.
*
* All rights reserved.
*/
#include "db.h"
#include "exception.h"
#include <stdlib.h>
#include <QByteArray>
QByteArray filename2bytearray(const QString &fname)
{
#if defined(Q_OS_WIN32)
return fname.toLocal8Bit();
#else
return fname.toUtf8();
#endif
}
QString filename2QString(const char *fname)
{
#if defined(Q_OS_WIN32)
return QString::fromLocal8Bit(fname);
#else
return QString::fromUtf8(fname);
#endif
}
static void usage(const char *me)
{
printf("%s <DatabaseFile>: Dump database statistics\n"
" Prints details about the chunks in the database\n", me);
}
int main(int argc, char *argv[])
{
if (argc != 2 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")){
usage(argv[0]);
return 1;
}
QString database = filename2QString(argv[1]);
if (!QFile::exists(database)) {
printf("Database file '%s' not found\n", argv[1]);
usage(argv[0]);
return 1;
}
try {
db mydb(database);
unsigned char *p;
db_header_t h;
int i=0;
size_t last_end = 0;
QList<size_t> errs;
int format=16;
const char *type[] = {
"(none)", "Software Key", "Request", "Certificate",
"Revocation", "Template", "Setting", "Token key"
};
#define FW_IDX 5
#define FW_TYPE -13
#define FW_VER 3
#define FW_SIZE 6
#define FW_FLAGS 6
mydb.first(0);
//QString fmt = QString("%1 %2 %3 %4 %5 %6 %7");
QString fmt = QString("%1 | %2 | %3 | %4 | %5 | %6 | %7 | %8");
puts(CCHAR(fmt .arg("Index", FW_IDX)
.arg("Type", FW_TYPE)
.arg("Ver", FW_VER)
.arg("Offset", FW_SIZE)
.arg("Length", FW_SIZE)
.arg("End", FW_SIZE)
.arg("Flags", FW_SIZE)
.arg("Name")));
while (!mydb.eof()) {
p = mydb.load(&h);
free(p);
if (last_end != (size_t)mydb.head_offset)
errs << mydb.head_offset;
last_end = mydb.head_offset + h.len;
if (h.type > smartCard)
h.type = 0;
puts(CCHAR(fmt .arg(i++, FW_IDX)
.arg(type[h.type], FW_TYPE)
.arg(h.version, FW_VER)
.arg(mydb.head_offset, FW_SIZE, format)
.arg(h.len, FW_SIZE, format)
.arg(last_end -1, FW_SIZE, format)
.arg(h.flags, FW_SIZE)
.arg(h.name)));
if (mydb.next(0))
break;
}
if (errs.size() > 0) {
fputs("Garbage found at offset:", stdout);
foreach(size_t e, errs)
puts(CCHAR(QString(" %1").arg(e)));
puts("");
}
} catch (errorEx &ex) {
printf("Exception: '%s'\n", ex.getCString());
return 1;
}
return 0;
}