diff --git a/main.cpp b/main.cpp index b8e81ddd..fc4f537e 100644 --- a/main.cpp +++ b/main.cpp @@ -1,29 +1,7 @@ #include "pip.h" -class Base: public PIObject { - PIOBJECT(Base) -public: - EVENT_HANDLER(void, tick) {piCout << "tick";} -}; int main() { - Base b; - PIConnection c; - c.configureFromConfig("d:/orders/nicirt/bin/spec_core.conf", "core"); - //CONNECTU(&t, tickEvent, &b, tick); - piCout << "start ..."; - c.start(); - //t.start(500); - piSleep(3); - //t.stop(); - //delete t; - c.stop(); - piCout << "deleted"; - - /*PIEthernet * eth = PIIODevice::createFromFullPath("eth://UDP:::192.168.0.33:16666")->cast(); - for (;;) { - eth->send(PIByteArray::fromHex("00112233445566778899")); - piSleep(1.5); - }*/ + PISystemInfo::machineID(); return 0; } diff --git a/src_main/core/piinit.cpp b/src_main/core/piinit.cpp index 06828aa2..fc29d548 100644 --- a/src_main/core/piinit.cpp +++ b/src_main/core/piinit.cpp @@ -231,8 +231,8 @@ PIInit::PIInit() { GetSystemInfo(&sysinfo); sinfo->processorsCount = sysinfo.dwNumberOfProcessors; switch (sysinfo.wProcessorArchitecture) { - case PROCESSOR_ARCHITECTURE_AMD64: sinfo->architecture = PIStringAscii("x64"); break; - case PROCESSOR_ARCHITECTURE_ARM: sinfo->architecture = PIStringAscii("ARM"); break; + case PROCESSOR_ARCHITECTURE_AMD64: sinfo->architecture = PIStringAscii("x86_64"); break; + case PROCESSOR_ARCHITECTURE_ARM: sinfo->architecture = PIStringAscii("arm"); break; case PROCESSOR_ARCHITECTURE_IA64: sinfo->architecture = PIStringAscii("Intel Itanium-based"); break; case PROCESSOR_ARCHITECTURE_INTEL: sinfo->architecture = PIStringAscii("x86"); break; case PROCESSOR_ARCHITECTURE_UNKNOWN: diff --git a/src_main/core/pistring.cpp b/src_main/core/pistring.cpp index b33a3a70..c4c845c8 100755 --- a/src_main/core/pistring.cpp +++ b/src_main/core/pistring.cpp @@ -438,6 +438,7 @@ PIByteArray PIString::toCharset(const char * c) const { PIString & PIString::operator +=(const char * str) { + if (!str) return *this; int l = 0; while (str[l] != '\0') ++l; appendFromChars(str, l); @@ -446,6 +447,7 @@ PIString & PIString::operator +=(const char * str) { PIString & PIString::operator +=(const wchar_t * str) { + if (!str) return *this; //cout << "wc" << endl; /*int l = 0, sz; char * c = new char[MB_CUR_MAX]; diff --git a/src_main/io_devices/pidir.cpp b/src_main/io_devices/pidir.cpp index b5062624..7c47ccfd 100755 --- a/src_main/io_devices/pidir.cpp +++ b/src_main/io_devices/pidir.cpp @@ -396,11 +396,17 @@ PIDir PIDir::home() { delete[] rc; return PIDir(); } - PIString s(rc); - s.replaceAll("\\", PIDir::separator); + PIString hp(rc); + memset(rc, 0, 1024); + if (ExpandEnvironmentStrings((LPCTSTR)"%HOMEDRIVE%", (LPTSTR)rc, 1024) == 0) { + delete[] rc; + return PIDir(); + } + PIString hd(rc); + hp.replaceAll("\\", PIDir::separator); delete[] rc; - s.prepend(separator); - return PIDir(s); + //s.prepend(separator); + return PIDir(hd + hp); #else # ifndef ESP_PLATFORM rc = getenv("HOME"); diff --git a/src_main/io_devices/piethernet.cpp b/src_main/io_devices/piethernet.cpp index 6080447c..eb230331 100755 --- a/src_main/io_devices/piethernet.cpp +++ b/src_main/io_devices/piethernet.cpp @@ -1110,17 +1110,19 @@ PIEthernet::InterfaceList PIEthernet::interfaces() { PIStringList inl; struct ifreq ir; for (int i = 0; i < icnt; ++i) { + ci.flags = 0; PIString in = PIStringAscii(ifc.ifc_req[i].ifr_name); if (in.isEmpty()) continue; ci.name = in; strcpy(ir.ifr_name, in.dataAscii()); if (ioctl(s, SIOCGIFHWADDR, &ir) == 0) - ci.mac = macFromBytes(PIByteArray(ir.ifr_hwaddr.sa_data, 6)); + ci.mac = macFromBytes(PIByteArray(ir.ifr_hwaddr.sa_data, 6)); if (ioctl(s, SIOCGIFADDR, &ir) >= 0) ci.address = getSockAddr(&ir.ifr_addr); if (ioctl(s, SIOCGIFNETMASK, &ir) >= 0) ci.netmask = getSockAddr(&ir.ifr_addr); ioctl(s, SIOCGIFMTU, &ci.mtu); + if (ci.address == "127.0.0.1") ci.flags |= PIEthernet::ifLoopback; il << ci; } delete ifc.ifc_buf; diff --git a/src_main/system/pisysteminfo.cpp b/src_main/system/pisysteminfo.cpp index 01b6122f..59ce122f 100644 --- a/src_main/system/pisysteminfo.cpp +++ b/src_main/system/pisysteminfo.cpp @@ -18,12 +18,16 @@ */ #include "pisysteminfo.h" #include "piincludes_p.h" +#include "pidir.h" +#include "picrc.h" #ifdef ESP_PLATFORM # include "esp_system.h" # include "esp_spi_flash.h" #endif +#define SALT_SIZE 8 + PISystemInfo::PISystemInfo() { processorsCount = 1; @@ -196,3 +200,66 @@ PIVector PISystemInfo::mountInfo() { cache = ret; return ret; } + +PIString confDir() { + return +#ifdef WINDOWS + PIDir::home().path() + "/AppData/Local" +#elif ANDROID + "/mnt/sdcard" +#else + PIDir::home().path() + "/.config" +#endif + ; +} + + +PIByteArray generateSalt() { + PIByteArray ret; + piForTimes (SALT_SIZE) { + piMSleep(randomi() % 10); + randomize(); + ret << uchar(randomi() % 0x100); + } + return ret; +} + + +PIString PISystemInfo::machineKey() { + static PIString ret; + if (ret.isEmpty()) { + PISystemInfo * si = instance(); + PIByteArray salt; + PIString conf = confDir() + "/.pip_machine_salt"; + if (PIFile::isExists(conf)) { + PIFile f(conf, PIIODevice::ReadOnly); + f.open(); + salt = f.readAll(); + } + if (salt.size_s() != SALT_SIZE){ + salt = generateSalt(); + PIFile f(conf, PIIODevice::ReadWrite); + f.open(); + f.clear(); + f.write(salt); + } + ret = si->OS_name + "_" + si->architecture + "_" + si->hostname + "_" + salt.toHex(); + /*PIEthernet::InterfaceList il = PIEthernet::interfaces(); + const PIEthernet::Interface * lo = il.getByAddress("127.0.0.1"); + if (lo) + ret += lo->mac;*/ + } + return ret; +} + + +uint PISystemInfo::machineID() { + piCout << confDir(); + static uint ret = 0; + if (ret == 0) { + CRC_32 crc = standardCRC_32(); + ret = crc.calculate(machineKey().toByteArray()); + piCout << "machineID \"" << machineKey() << "\" =" << PICoutManipulators::Hex << ret; + } + return ret; +} diff --git a/src_main/system/pisysteminfo.h b/src_main/system/pisysteminfo.h index aedfe321..a2490a7f 100644 --- a/src_main/system/pisysteminfo.h +++ b/src_main/system/pisysteminfo.h @@ -43,6 +43,8 @@ public: static PIStringList mountRoots(); static PIVector mountInfo(); + static PIString machineKey(); + static uint machineID(); static PISystemInfo * instance(); diff --git a/utils/crypt_tool/main.cpp b/utils/crypt_tool/main.cpp index 50749e57..c05f108b 100644 --- a/utils/crypt_tool/main.cpp +++ b/utils/crypt_tool/main.cpp @@ -25,6 +25,7 @@ void usage() { int main (int argc, char * argv[]) { + PICrypt::hash(""); PICrypt crypt; PIByteArray bout; PICLI cli(argc, argv);