-rw-r--r-- | pwmanager/pwmanager/blowfish.h | 11 | ||||
-rw-r--r-- | pwmanager/pwmanager/gpasmanfile.cpp | 16 | ||||
-rw-r--r-- | pwmanager/pwmanager/htmlgen.cpp | 2 | ||||
-rw-r--r-- | pwmanager/pwmanager/ipc.cpp | 7 | ||||
-rw-r--r-- | pwmanager/pwmanager/ipc.h | 5 | ||||
-rw-r--r-- | pwmanager/pwmanager/libgcryptif.h | 7 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwm.cpp | 1 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmanager.pro | 2 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmdoc.cpp | 9 | ||||
-rw-r--r-- | pwmanager/pwmanager/spinforsignal.h | 2 |
10 files changed, 50 insertions, 12 deletions
diff --git a/pwmanager/pwmanager/blowfish.h b/pwmanager/pwmanager/blowfish.h index c05de77..5129eab 100644 --- a/pwmanager/pwmanager/blowfish.h +++ b/pwmanager/pwmanager/blowfish.h @@ -3,58 +3,67 @@ * copyright (C) 2003, 2004 by Michael Buesch * * email: mbuesch@freenet.de * * * * blowfish.c - Blowfish encryption * * Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License version 2 * * as published by the Free Software Foundation. * * * ***************************************************************************/ /*************************************************************************** * copyright (C) 2004 by Ulf Schenk * This file is originaly based on version 1.0.1 of pwmanager * and was modified to run on embedded devices that run microkde * * $Id$ **************************************************************************/ #ifndef BLOWFISH_H #define BLOWFISH_H #include "pwmexception.h" - +#ifndef _WIN32_ #include <stdint.h> +#else + +#endif #include <string> using std::string; #define BLOWFISH_BLOCKSIZE 8 #define BLOWFISH_ROUNDS 16 #define CIPHER_ALGO_BLOWFISH 4 /* blowfish 128 bit key */ +#ifndef _WIN32_ typedef uint8_t byte; +#else +#define uint8_t Q_UINT8 +#define byte Q_UINT8 +#define uint32_t Q_UINT32 +#endif /** blowfish encryption algorithm. * Derived from libgcrypt-1.1.12 */ class Blowfish { struct BLOWFISH_context { uint32_t s0[256]; uint32_t s1[256]; uint32_t s2[256]; uint32_t s3[256]; uint32_t p[BLOWFISH_ROUNDS+2]; }; public: Blowfish() {} static bool selfTest(); /** set key to encrypt. if return == 1, it is a weak key. */ int bf_setkey( byte *key, unsigned int keylen ); /** encrypt inbuf and return it in outbuf. * inbuf and outbuf have to be: buf % 8 == 0 * You may check this with getPaddedLen() and pad with NULL. diff --git a/pwmanager/pwmanager/gpasmanfile.cpp b/pwmanager/pwmanager/gpasmanfile.cpp index f80bc13..ae34c83 100644 --- a/pwmanager/pwmanager/gpasmanfile.cpp +++ b/pwmanager/pwmanager/gpasmanfile.cpp @@ -23,72 +23,82 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* 2003/06/10: * modified by Michael Buesch to work together * with PwM as import/export module. */ /*************************************************************************** * copyright (C) 2004 by Ulf Schenk * This file is originaly based on version 1.0.1 of pwmanager * and was modified to run on embedded devices that run microkde * * $Id$ **************************************************************************/ #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <fcntl.h> #include <stdlib.h> +#ifndef _WIN32_ #include <unistd.h> +#else +#include <io.h> +#define S_IRUSR _S_IREAD +#define S_IWUSR _S_IWRITE +#define creat _creat +#endif #include <string.h> #include <errno.h> #include "gpasmanfile.h" #include "globalstuff.h" #define SAVE_BUFFER_LENGTH 1024 #define LOAD_BUFFER_LENGTH 2048 #ifndef S_IAMB #define S_IAMB 00777 #endif // enable/disable debug output //#define GPASMANFILE_DEBUG #undef GPASMANFILE_DEBUG - +#ifndef _WIN32_ #if defined(PWM_DEBUG) && defined(GPASMANFILE_DEBUG) # define DBG(msg,x...) do { fprintf(stderr, msg "\n" , ##x); } while (0) #else # define DBG(msg,x...) do { } while (0) #endif +#else +# define DBG +#endif #ifdef BIG_ENDIAN_HOST # define WORDS_BIGENDIAN #else # undef WORDS_BIGENDIAN #endif GpasmanFile::GpasmanFile() { } GpasmanFile::~GpasmanFile() { } int GpasmanFile::save_init(const char *filename, const char *password) { /* * returncodes: * 1 = success * 0 = can't open filedescriptor / can't create file * -1 = permissions are bad @@ -389,49 +399,49 @@ int GpasmanFile::load_entry(char *entry[4]) DBG("%s", "load_entry, ended no entry anymore"); return 2; } void GpasmanFile::load_finalize(void) { fclose(fd); free(buffer); } int GpasmanFile::check_file(const char *filename) { struct stat naamstat; if (stat(filename, &naamstat) == -1) { return (-3); } if (((naamstat.st_mode & S_IAMB) | (S_IRUSR | S_IWUSR)) != (S_IRUSR | S_IWUSR)) { DBG("%s perms are bad, they are: %ld, should be -rw------", filename, (naamstat.st_mode & (S_IREAD | S_IWRITE))); return (-1); } - +#ifndef _WIN32_ if (!S_ISREG(naamstat.st_mode)) { lstat(filename, &naamstat); if (S_ISLNK(naamstat.st_mode)) { DBG("%s is a symlink", filename); return (-2); } } - +#endif return (1); } int GpasmanFile::file_exists(const char *tfile) { struct stat naamstat; if ((stat(tfile, &naamstat) == -1) && (errno == ENOENT)) { DBG("file_exists, %s does NOT exist", tfile); return (0); } else { DBG("file_exists, %s DOES exist", tfile); return (1); } } diff --git a/pwmanager/pwmanager/htmlgen.cpp b/pwmanager/pwmanager/htmlgen.cpp index 166b987..bee8198 100644 --- a/pwmanager/pwmanager/htmlgen.cpp +++ b/pwmanager/pwmanager/htmlgen.cpp @@ -39,49 +39,49 @@ #define HTML_VALUE_CLASS "\"value\"" #define PATH_COMMENTSTYLE_CSS "pwmanager/html/htmlcomment_style.css" #if defined(PWM_DEBUG) && HTMLGEN_DEBUG != 0 #define HTML_ENDL "\n" #else // defined(PWM_DEBUG) && ... #define HTML_ENDL "" #endif // defined(PWM_DEBUG) && ... HtmlGen::HtmlGen() { useSSDummy = true; } HtmlGen::~HtmlGen() { } QString HtmlGen::escapeHtmlText(const QString &str) { QString ret; unsigned int len = str.length(), i; char c; for (i = 0; i < len; ++i) { - c = str[i]; + c = str.at(i); switch (c) { case '<': ret.append("<"); break; case '>': ret.append(">"); break; case '&': ret.append("&"); break; case '\"': ret.append("""); break; case 'ä': ret.append("ä"); break; case 'Ä': ret.append("Ä"); break; case 'ü': ret.append("ü"); break; case 'Ü': ret.append("Ü"); diff --git a/pwmanager/pwmanager/ipc.cpp b/pwmanager/pwmanager/ipc.cpp index b1d2c68..643b022 100644 --- a/pwmanager/pwmanager/ipc.cpp +++ b/pwmanager/pwmanager/ipc.cpp @@ -1,102 +1,103 @@ /*************************************************************************** * * * copyright (C) 2004 by Michael Buesch * * email: mbuesch@freenet.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License version 2 * * as published by the Free Software Foundation. * * * ***************************************************************************/ /*************************************************************************** * copyright (C) 2004 by Ulf Schenk * This file is originaly based on version 1.0.1 of pwmanager * and was modified to run on embedded devices that run microkde * * $Id$ **************************************************************************/ #include "ipc.h" #include "pwmexception.h" #include <qsocketnotifier.h> - +#ifndef _WIN32_ #include <sys/socket.h> - +#endif #ifndef PWM_EMBEDDED #include <sys/types.h> #include <stdio.h> #else #include <qsocket.h> #endif #define END_OF_LINE '\n' #define INIT_LINEBUF_LEN 64 /* byte */ #ifndef PWM_EMBEDDED Ipc::Ipc() : stream (0) , notifier (0) , rdBuf (0) { if (socketpair(AF_LOCAL, SOCK_STREAM, 0, sock)) { throw PwMException(PwMException::EX_GENERIC, "Ipc: socketpair() failed"); } rdBufSize = INIT_LINEBUF_LEN; rdBuf = static_cast<char *>(malloc(rdBufSize)); if (!rdBuf) { close(sock[0]); close(sock[1]); throw PwMException(PwMException::EX_GENERIC, "Ipc: OOM"); } stream = fdopen(sock[0], "r"); if (!stream) { close(sock[0]); close(sock[1]); free(rdBuf); throw PwMException(PwMException::EX_GENERIC, "Ipc: fdopen() failed"); } notifier = new QSocketNotifier(sock[0], QSocketNotifier::Read); connect(notifier, SIGNAL(activated(int)), this, SLOT(receiveData(int))); host = true; } #else Ipc::Ipc() : notifier (0) , rdBuf (0) { +#ifndef _WIN32_ if (socketpair(AF_LOCAL, SOCK_STREAM, 0, sock)) { qDebug("Ipc: socketpair() failed"); } - +#endif QSocket* qsock = new QSocket(); qsock->setSocket(sock[0]); rdBufSize = INIT_LINEBUF_LEN; rdBuf = (char *)(malloc(rdBufSize)); if (!rdBuf) { close(sock[0]); close(sock[1]); qDebug("Ipc: OOM"); } qsock = new QSocket(); qsock->setSocket(sock[0]); /*US stream = fdopen(sock[0], "r"); if (!stream) { close(sock[0]); close(sock[1]); free(rdBuf); qDebug("Ipc: fdopen() failed"); } */ diff --git a/pwmanager/pwmanager/ipc.h b/pwmanager/pwmanager/ipc.h index e5a496d..7bfca02 100644 --- a/pwmanager/pwmanager/ipc.h +++ b/pwmanager/pwmanager/ipc.h @@ -1,49 +1,52 @@ /*************************************************************************** * * * copyright (C) 2004 by Michael Buesch * * email: mbuesch@freenet.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License version 2 * * as published by the Free Software Foundation. * * * ***************************************************************************/ /*************************************************************************** * copyright (C) 2004 by Ulf Schenk * This file is originaly based on version 1.0.1 of pwmanager * and was modified to run on embedded devices that run microkde * * $Id$ **************************************************************************/ #ifndef __PWM_IPC_H #define __PWM_IPC_H #include <qobject.h> +#ifndef _WIN32_ #include <unistd.h> - +#else +#include <io.h> +#endif #ifndef PWM_EMBEDDED #include <stdio.h> #else #include <qsocket.h> #endif class QSocketNotifier; /** very simple interprocess communication class */ class Ipc : public QObject { Q_OBJECT public: /** create a new Ipc communication object */ Ipc(); /** create a new Ipc communication object and * connect it to "ipc" */ Ipc(const Ipc *ipc); /** destructor */ ~Ipc(); /** send data to the other socket end * (To the connected ipc object) diff --git a/pwmanager/pwmanager/libgcryptif.h b/pwmanager/pwmanager/libgcryptif.h index dffd55b..1a7b658 100644 --- a/pwmanager/pwmanager/libgcryptif.h +++ b/pwmanager/pwmanager/libgcryptif.h @@ -10,50 +10,55 @@ * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License version 2 * * as published by the Free Software Foundation. * * * ***************************************************************************/ /*************************************************************************** * copyright (C) 2004 by Ulf Schenk * This file is originaly based on version 1.1 of pwmanager * and was modified to run on embedded devices that run microkde * * $Id$ **************************************************************************/ #ifndef __LIBGCRYPTIF_H #define __LIBGCRYPTIF_H #include "pwmexception.h" //#undef CONFIG_PWMANAGER_GCRY // for debugging only. #ifdef CONFIG_PWMANAGER_GCRY #include <stddef.h> #include <sys/types.h> +#ifndef _WIN32_ #include <stdint.h> - +#else +#define uint8_t Q_UINT8 +#define byte Q_UINT8 +#define uint32_t Q_UINT32 +#endif #define STRING2KEY_SALTLEN 8 /** interface class for the libgcrypt cipher and hash algorithms * NOTE: Always allocate 1024 extra bytes for the inBuf (for padding) */ class LibGCryptIf { protected: struct STRING2KEY { int mode; int hash_algo; uint8_t salt[STRING2KEY_SALTLEN]; uint32_t count; }; struct DEK { size_t keylen; uint8_t key[32]; // this is the largest used keylen (256 bit) }; public: LibGCryptIf() { } /** is libgcrypt available? */ diff --git a/pwmanager/pwmanager/pwm.cpp b/pwmanager/pwmanager/pwm.cpp index d92c90d..1ab2b71 100644 --- a/pwmanager/pwmanager/pwm.cpp +++ b/pwmanager/pwmanager/pwm.cpp @@ -1389,48 +1389,49 @@ void PwM::whatsnew_slot() { KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" ); } void PwM::showLicense_slot() { KApplication::showLicence(); } void PwM::faq_slot() { KApplication::showFile( "PWM/Pi FAQ", "kdepim/pwmanager/pwmanagerFAQ.txt" ); } void PwM::syncHowTo_slot() { KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" ); } void PwM::createAboutData_slot() { QString version; #include <../version> +; QMessageBox::about( this, "About PwManager/Pi", "PwManager/Platform-independent\n" "(PWM/Pi) " +version + " - " + #ifdef DESKTOP_VERSION "Desktop Edition\n" #else "PDA-Edition\n" "for: Zaurus 5500 / 7x0 / 8x0\n" #endif "(c) 2004 Ulf Schenk\n" "(c) 2004 Lutz Rogowski\n" "(c) 1997-2004, The KDE PIM Team\n" "(c) Michael Buesch - main programming\nand current maintainer\nmbuesch@freenet.de\n" "Matt Scifo - mscifo@o1.com\n" "Elias Probst - elias.probst@gmx.de\n" "George Staikos - staikos@kde.org\n" "Matthew Palmer - mjp16@uow.edu.au\n" "Olivier Sessink - gpasman@nl.linux.org\n" "The libgcrypt developers -\nBlowfish and SHA1 algorithms\nftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/\n" "Troy Engel - tengel@sonic.net\n" "Wickey - wickey@gmx.at\n" "Ian MacGregor - original documentation author.\n" diff --git a/pwmanager/pwmanager/pwmanager.pro b/pwmanager/pwmanager/pwmanager.pro index 80b2519..fbc0554 100644 --- a/pwmanager/pwmanager/pwmanager.pro +++ b/pwmanager/pwmanager/pwmanager.pro @@ -1,31 +1,31 @@ TEMPLATE = app CONFIG += qt warn_off DESTDIR= ../../bin TARGET = pwmpi include( ../../variables.pri ) -INCLUDEPATH += . ../../ ../../libkdepim ../../microkde ../../microkde/kdecore ../../microkde/kdeui ../../microkde/kutils +INCLUDEPATH += . ../../ ../../libkdepim ../../microkde ../../microkde/kdecore ../../microkde/kdeui ../../microkde/kutils ../libcrypt/crypt ../libcrypt/error ../libcrypt/zlib DEFINES += PWM_EMBEDDED CONFIG_PWMANAGER_GCRY DESKTOP_VERSION #enable this setting if you want debugoutput for pwmanager #DEFINES += CONFIG_DEBUG LIBS += -L../libcrypt/ LIBS += -L../../bin/ LIBS += -lmicrokde LIBS += -lmicrokdepim LIBS += -lzlib LIBS += -lkpmicrocipher LIBS += -lkpmicroerror LIBS += -lkpmicrompi LIBS += -lstdc++ unix:{ OBJECTS_DIR = obj/unix MOC_DIR = moc/unix } win32:{ DEFINES += _WIN32_ OBJECTS_DIR = obj/win MOC_DIR = moc/win diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp index 86b6273..129bf7b 100644 --- a/pwmanager/pwmanager/pwmdoc.cpp +++ b/pwmanager/pwmanager/pwmdoc.cpp @@ -34,51 +34,52 @@ #include "kglobal.h" #endif #include <kmessagebox.h> #include <libkcal/syncdefines.h> #ifdef CONFIG_KWALLETIF # include "kwalletemu.h" #endif // CONFIG_KWALLETIF #include <qdatetime.h> #include <qsize.h> #include <qfileinfo.h> #include <qfile.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> //US#include <iostream> #include <algorithm> #include <sys/types.h> #include <sys/stat.h> +#ifndef _WIN32_ #include <unistd.h> #include <stdint.h> - +#endif #ifdef PWM_EMBEDDED #ifndef Q_LONG #define Q_LONG long #endif #ifndef Q_ULONG #define Q_ULONG unsigned long #endif #endif //PWM_EMBEDDED //TODO: reset to its normal value. #define META_CHECK_TIMER_INTERVAL 10/*300*/ /* sek */ using namespace std; void PwMDocList::add(PwMDoc *doc, const string &id) { #ifdef PWM_DEBUG // check for existance of object in debug mode only. vector<listItem>::iterator begin = docList.begin(), end = docList.end(), @@ -484,52 +485,54 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file) printDebug("PwMDoc::saveDoc(): compressDta() failed"); f.close(); ret = e_enc; goto out_moveback; } e = encrypt(&serialized, ¤tPw, &f, cryptAlgo); if (e == e_weakPw) { printDebug("PwMDoc::saveDoc(): encrypt() failed: e_weakPw"); f.close(); ret = e_weakPw; goto out_moveback; } else if (e == e_cryptNotImpl) { printDebug("PwMDoc::saveDoc(): encrypt() failed: e_cryptNotImpl"); f.close(); ret = e_cryptNotImpl; goto out_moveback; } else if (e != e_success) { printDebug("PwMDoc::saveDoc(): encrypt() failed"); f.close(); ret = e_enc; goto out_moveback; } unsetDocStatFlag(DOC_STAT_DISK_DIRTY); f.close(); +#ifndef _WIN32_ if (chmod(filename.latin1(), conf()->confGlobFilePermissions())) { printWarn(string("chmod failed: ") + strerror(errno)); } +#endif openDocList.edit(this, getTitle().latin1()); if (wasDeepLocked) { /* Do _not_ save the data with the deepLock() * call, because this will recurse * into saveDoc() */ deepLock(true, false); /* We don't check return value here, because * it won't fail. See NOTE in deepLock() */ } if (tmpFileMoved != QString::null) { // now remove the moved file. if (!QFile::remove(tmpFileMoved)) { printWarn(string("removing file ") + tmpFileMoved.latin1() + " failed!"); } } ret = e_success; printDebug(string("writing file { name: ") + filename.latin1() + " compress: " + tostr(static_cast<int>(compress)) + " cryptAlgo: " + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: " @@ -2197,104 +2200,108 @@ void PwMDoc::getEntryList(unsigned int category, QStringList *list) end = dti.dta[category].d.end(), i = begin; while (i != end) { #ifndef PWM_EMBEDDED list->push_back(i->desc.c_str()); #else list->append(i->desc.c_str()); #endif ++i; } } bool PwMDoc::execLauncher(const QString &category, unsigned int entryIndex) { unsigned int cat = 0; if (!findCategory(category, &cat)) return false; return execLauncher(cat, entryIndex); } bool PwMDoc::execLauncher(unsigned int category, unsigned int entryIndex) { +#ifndef _WIN32_ if (geteuid() == 0) { rootAlertMsgBox(); return false; } +#endif QString command(dti.dta[category].d[entryIndex].launcher.c_str()); bool wasLocked = isLocked(category, entryIndex); if (command.find("$p") != -1) { /* the user requested the password to be included * into the command. We have to ask for the password, * if it's locked. We do that by unlocking the entry */ if (!lockAt(category, entryIndex, false)) return false; } #ifndef PWM_EMBEDDED command.replace("$d", dti.dta[category].d[entryIndex].desc.c_str()); command.replace("$n", dti.dta[category].d[entryIndex].name.c_str()); command.replace("$p", dti.dta[category].d[entryIndex].pw.c_str()); command.replace("$u", dti.dta[category].d[entryIndex].url.c_str()); command.replace("$c", dti.dta[category].d[entryIndex].comment.c_str()); #else command.replace(QRegExp("$d"), dti.dta[category].d[entryIndex].desc.c_str()); command.replace(QRegExp("$n"), dti.dta[category].d[entryIndex].name.c_str()); command.replace(QRegExp("$p"), dti.dta[category].d[entryIndex].pw.c_str()); command.replace(QRegExp("$u"), dti.dta[category].d[entryIndex].url.c_str()); command.replace(QRegExp("$c"), dti.dta[category].d[entryIndex].comment.c_str()); #endif command.append(" &"); QString customXterm(conf()->confGlobXtermCommand()); if (!customXterm.isEmpty()) command = customXterm + " " + command; system(command.latin1()); lockAt(category, entryIndex, wasLocked); return true; } bool PwMDoc::goToURL(const QString &category, unsigned int entryIndex) { unsigned int cat = 0; if (!findCategory(category, &cat)) return false; return goToURL(cat, entryIndex); } bool PwMDoc::goToURL(unsigned int category, unsigned int entryIndex) { +#ifndef _WIN32_ if (geteuid() == 0) { rootAlertMsgBox(); return false; } +#endif QString url(dti.dta[category].d[entryIndex].url.c_str()); if (url.isEmpty()) return false; QString customBrowser(conf()->confGlobBrowserCommand()); if (!customBrowser.isEmpty()) { browserProc.clearArguments(); browserProc << customBrowser << url; if (browserProc.start(KProcess::DontCare)) return true; } browserProc.clearArguments(); browserProc << "konqueror" << url; if (browserProc.start(KProcess::DontCare)) return true; browserProc.clearArguments(); browserProc << "mozilla" << url; if (browserProc.start(KProcess::DontCare)) return true; browserProc.clearArguments(); browserProc << "opera" << url; diff --git a/pwmanager/pwmanager/spinforsignal.h b/pwmanager/pwmanager/spinforsignal.h index ec6103b..f3cabee 100644 --- a/pwmanager/pwmanager/spinforsignal.h +++ b/pwmanager/pwmanager/spinforsignal.h @@ -1,49 +1,51 @@ /*************************************************************************** * * * copyright (C) 2003, 2004 by Michael Buesch * * email: mbuesch@freenet.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License version 2 * * as published by the Free Software Foundation. * * * ***************************************************************************/ /*************************************************************************** * copyright (C) 2004 by Ulf Schenk * This file is originaly based on version 1.0.1 of pwmanager * and was modified to run on embedded devices that run microkde * * $Id$ **************************************************************************/ #ifndef SPINFORSIGNAL_H #define SPINFORSIGNAL_H #include <qobject.h> +#ifndef _WIN32_ #include <stdint.h> +#endif #include <string> using std::string; /** non-ui-blocking spin for a QT-signal */ class SpinForSignal : public QObject { Q_OBJECT public: SpinForSignal(); ~SpinForSignal() {} /** do spin for signal */ void spin(uint32_t *u32, string *str); /** cancel spinning */ void cancelSpin(); public slots: void u32_str_slot(uint32_t u32, const string &str); protected: volatile bool doSpin; uint32_t u32_storage; string str_storage; |