X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=src%2Fkernel%2Fkernel.cpp;h=8bd0311c246cbdd23b259fb30e221964dae41570;hb=595f80b4f2420ff252f137cacb22a7d4b6f0850d;hp=49c9314e6e1482bc6dcea88f2a0eed92a1573beb;hpb=879b59817c6e29922e46e66dc901a250c0245e91;p=vlp.git diff --git a/src/kernel/kernel.cpp b/src/kernel/kernel.cpp index 49c9314..8bd0311 100644 --- a/src/kernel/kernel.cpp +++ b/src/kernel/kernel.cpp @@ -29,7 +29,6 @@ ************************************************************/ - #include #include #include @@ -50,7 +49,8 @@ #include #include #include -#include +#include +#include #include #include @@ -62,18 +62,18 @@ #include #include +#include #include "kernel.h" #include "kernelwindow.h" +#include "lock.h" +#include "options.h" /* File resides in top directory (where are Makefiles)*/ #include "../../config.h" char CharLine[25] = "________________________"; -char myargs[5][255]; - -//QApplication *app; /** * Event invoked on program close. @@ -113,17 +113,29 @@ void QKernel::setLocked(bool locked) * Kernel program constructor. * Prepares everything to work. */ -QKernel::QKernel() +QKernel::QKernel(int argc, char **argv) { setupUi(this); - QDir q(REMOTE_PATH); - char ss[255]; + QString arg0(argv[0]); + arg0 += "/"; + homeDir = QDir(arg0); + homeDir.cdUp(); + + + int i; + for(i = 0; (i < 5) && (i < argc-1); i++) { + strcpy(myargs[i], ""); + if (i < argc) { + strcpy(myargs[i], argv[i+1]); + } + } + + QDir q(getRemoteDir()); if (!q.exists()) { - sprintf(ss, "mkdir %s", REMOTE_PATH); - system(ss); - } + q.mkpath(getRemoteDir()); + } info_messages = TRUE; wait_for_info = FALSE; @@ -132,62 +144,61 @@ QKernel::QKernel() LOCKED = FALSE; - desktop = new QTextEdit(this); - desktop->setReadOnly(TRUE); - QVBoxLayout * layout = new QVBoxLayout(); - layout->setContentsMargins (3, 0, 3, 0); - layout->addWidget(desktop); - QWidget *window = new QWidget(); - window->setLayout(layout); - setCentralWidget(window); - - resize(400, 200); Tasks = 0; freeINTid = 1; ActiveConnections = 0; strcpy(LockPasswd, ""); - LoadConfig("vlp.cfg"); + loadConfig(getConfigFilePath()); RunNetModule(); Net_Notify = new QSocketNotifier(net_sock, QSocketNotifier::Read, this); connect(Net_Notify, SIGNAL(activated(int)), this, SLOT(NetMessage())); } -/** - * Event invoked on resizing kernel application window. - * @copydoc QWidget::resizeEvent(QResizeEvent*) - */ -void QKernel::resizeEvent(QResizeEvent *ev) +QString QKernel::getConfigFilePath() { -// QFrame::resizeEvent(ev); -// if (desktop) -// desktop->setGeometry(0, bar->height(), width(), -// height() - bar->height()); + return homeDir.absoluteFilePath("vlp.cfg"); } -/** - * Displays window with information about not implemented functionality. - */ -void QKernel::n_impl() +const char * QKernel::getHomeDir() +{ + return homeDir.absolutePath().toStdString().c_str(); +} + +const char * QKernel::getRemoteDir() +{ + return homeDir.absoluteFilePath(REMOTE_PATH).toStdString().c_str(); +} + +const char * QKernel::getNetModuleSocket() { - QMessageBox::information(this, "Function info", "This function is not " - "implemented yet...", "Ok"); + return homeDir.absoluteFilePath(NPATH).toStdString().c_str(); } +const char * QKernel::getGraphModuleSocket() +{ + return homeDir.absoluteFilePath(GPATH).toStdString().c_str(); +} + +void QKernel::loadConfig(const QString & fname) +{ + loadConfig(fname.toStdString().c_str()); +} /** * Loads configuration from the given file. * @param fname Filename of the configuration file. */ -void QKernel::LoadConfig(char * fname) +void QKernel::loadConfig(const char * fname) { + fprintf(stderr, "2: %s\n", fname); config_t cfg; config_setting_t *setting; - const char *str; /* Hack for checking if file exists without using external libs.*/ + FILE * file = fopen(fname, "rt"); if (!file) { - fprintf(stderr, "Error: Cannot load configuration file %s!\n", + fprintf(stderr, "Error: Cannot load configuration file: %s!\n", fname); exit(3); } @@ -265,14 +276,6 @@ void QKernel::LoadConfig(char * fname) "Warning", fname, "progdir"); } - setting = config_lookup(&cfg, "homedir"); - if (setting) { - strncpy(HomeDir, config_setting_get_string(setting), 255); - } else { - fprintf(stderr, "%s! In file %s, '%s' was not found.\n", - "Warning", fname, "homedir"); - } - config_destroy(&cfg); fclose(file); } @@ -301,10 +304,23 @@ void QKernel::on_actionExecute_triggered() */ void QKernel::on_actionEditor_triggered() { - char cmd[255]; - sprintf(cmd, "%s/modules/logedit %s %s %s %s %s %s &", HomeDir, HomeDir, - myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]); - system(cmd); + QString program = getHomeDir(); + program += "/modules/logedit"; + + pid_t pid = fork(); + if (pid == 0) { + if (execl(program.toStdString().c_str(), + getHomeDir(), + myargs[0], + myargs[1], + myargs[2], + myargs[3], + myargs[4], + NULL + ) == -1) { + WriteMessage("Executing logedit failed!"); + } + } } /** @@ -312,10 +328,27 @@ void QKernel::on_actionEditor_triggered() */ void QKernel::on_actionHelp_triggered() { - char cmd[255]; - sprintf(cmd, "%s/modules/loghelp %s/doc %s %s %s %s %s &", HomeDir, - HomeDir, myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]); - system(cmd); + QString program = getHomeDir(); + program += "/modules/loghelp"; + + QString docDir = getHomeDir(); + docDir += "/doc"; + + pid_t pid = fork(); + if (pid == 0) { + if (execl(program.toStdString().c_str(), + docDir.toStdString().c_str(), + myargs[0], + myargs[1], + myargs[2], + myargs[3], + myargs[4], + NULL + ) == -1) { + + WriteMessage("Executing loghelp failed!"); + } + } } /** @@ -325,11 +358,34 @@ void QKernel::RunGraphModule(char *sk) { char cmd[255]; - sprintf(cmd, "%s/modules/loggraph %s %s %s %s %s %s &", HomeDir, - sk, myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]); - - if (system(cmd) != 0) - WriteMessage("Cannot connect GRAPH resources"); + QString program = getHomeDir(); + program += "/modules/loggraph"; + pid_t pid = fork(); + if (pid == 0) { + if (execl(program.toStdString().c_str(), + program.toStdString().c_str(), + sk, + myargs[0], + myargs[1], + myargs[2], + myargs[3], + myargs[4], + NULL + ) == -1) { + + WriteMessage("Executing loggraph failed!"); + WriteMessage("Exiting..."); + sleep(2); + on_actionQuit_triggered(); + } + } + else if (pid < 0) { + WriteMessage("fork(loggraph) failed!"); + WriteMessage("Exiting..."); + sleep(2); + on_actionQuit_triggered(); + exit(3); + } } /** @@ -338,39 +394,58 @@ void QKernel::RunGraphModule(char *sk) void QKernel::RunNetModule() { struct sockaddr_un svr; - int len, on; + int len; + int on; int sock; - char cmd[255]; - sprintf(cmd, "%s/modules/lognet %s %s %s %s %s %s &", HomeDir, - NPATH, myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]); + + QString program = getHomeDir(); + program += "/modules/lognet"; + + pid_t pid = fork(); + if (pid == 0) { + if (execl(program.toStdString().c_str(), + program.toStdString().c_str(), + getNetModuleSocket(), + getConfigFilePath().toStdString().c_str(), + myargs[0], + myargs[1], + myargs[2], + myargs[3], + myargs[4], + NULL + ) == -1) { + + WriteMessage("Executing lognet failed!"); + WriteMessage("Exiting..."); + sleep(2); + on_actionQuit_triggered(); + } + } + else if (pid < 0) { + WriteMessage("fork(lognet) failed!"); + WriteMessage("Exiting..."); + sleep(2); + on_actionQuit_triggered(); + exit(3); + } /* -------- socket for NET module -------- */ - unlink(NPATH); + unlink(getNetModuleSocket()); sock = socket(AF_UNIX, SOCK_STREAM, 0); bzero(&svr, sizeof(svr)); svr.sun_family = AF_UNIX; - strcpy(svr.sun_path, NPATH); + strcpy(svr.sun_path, getNetModuleSocket()); len = strlen(svr.sun_path) + sizeof(svr.sun_family); - bind(sock, (struct sockaddr*)&svr, len); + bind(sock, (struct sockaddr*)&svr, len); listen(sock, 5); - if (system(cmd) == 0) { - net_sock = accept(sock, (struct sockaddr*)0, (unsigned int*)0); - // close(sock); - if (net_sock != 0) { - WriteMessage("NETWORK successfully connected"); - fcntl(net_sock, F_SETFL, O_NONBLOCK|fcntl(net_sock, - F_GETFL, 0)); - on=1; - setsockopt(net_sock, IPPROTO_TCP, TCP_NODELAY, - (char*)&on, sizeof(on)); - } else { - WriteMessage("Cannot connect NETWORK resources"); - WriteMessage("Exiting..."); - sleep(2); - on_actionQuit_triggered(); - } - /* system OK */ + net_sock = accept(sock, (struct sockaddr*)0, (unsigned int*)0); + // close(sock); + if (net_sock != 0) { + WriteMessage("NETWORK successfully connected"); + fcntl(net_sock, F_SETFL, O_NONBLOCK|fcntl(net_sock, F_GETFL, 0)); + on = 1; + setsockopt(net_sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on)); } else { WriteMessage("Cannot connect NETWORK resources"); WriteMessage("Exiting..."); @@ -434,9 +509,11 @@ void QKernel::on_actionQuit_triggered() { MESSAGE msg; - QMessageBox::StandardButton response; - response = QMessageBox::question(this, "Close VLP", "Terminate VLP ?", - QMessageBox::Ok | QMessageBox::Cancel); + QMessageBox::StandardButton response = QMessageBox::question(this, + "Close VLP", + "Terminate VLP ?", + QMessageBox::Ok | QMessageBox::Cancel + ); if (response == QMessageBox::Cancel) { @@ -455,50 +532,6 @@ void QKernel::on_actionQuit_triggered() QApplication::instance()->quit(); } -/** - * Adds IP address to the configuration. - * Additional window is displayed to add address to the list - */ -void QKernel::AddAddress() -{ - QDialog d(this, Qt::Dialog); - QLabel lab("IP Address:", &d); - QLineEdit ed("", &d); - QPushButton ob("", &d); - QPushButton cb("", &d); - - if (connections) { - ob.setGeometry(30, 60, 80, 30); - ob.setText("Ok"); - ob.setDefault(TRUE); - lab.setGeometry(10, 10, 60, 30); - lab.setText("Address"); - ed.setGeometry(70, 10, 140, 30); - cb.setGeometry(130, 60, 80, 30); - cb.setText("Cancel"); - d.resize(240, 100); - connect(&ob, SIGNAL(clicked()), &d, SLOT(accept())); - connect(&cb, SIGNAL(clicked()), &d, SLOT(reject())); - if (d.exec()) - if (strcmp(ed.text().toAscii().data(), "") != 0) { - connections->addItem(ed.text()); - } - } -} - -/** - * Deletes current address from available connections. - */ -void QKernel::DelAddress() -{ - if (connections) { - if (connections->currentRow() != -1) { - /* TODO: Checki if this work correctly after porting */ - connections->removeItemWidget(connections->currentItem()); - } - } -} - /** * Sends message to node. * Additional window is displayed to set Node Number of node where send message, @@ -641,7 +674,7 @@ void QKernel::NetMessage() WriteMessage(CharLine); break; case VLP_REMOTE_INSTANCE: - sprintf(ss, "%s/%s", REMOTE_PATH, + sprintf(ss, "%s/%s", getRemoteDir(), msg.param.pstr); if (info_messages) { @@ -695,10 +728,8 @@ void QKernel::NetMessage() cnt = poms1.indexOf('='); if (cnt != -1) { poms2 = poms1.left(cnt); - poms1 = poms1.right( - poms1.length() - - cnt - 1); - sprintf(ss, "Node: %s Addr: %s", poms2.data(), poms1.data()); + poms1 = poms1.right(poms1.length() - cnt - 1); + sprintf(ss, "Node: %s Addr: %s", poms2.toStdString().c_str(), poms1.toStdString().c_str()); WriteMessage(ss); } } @@ -821,12 +852,10 @@ void QKernel::WriteMessage(char *msg) void QKernel::on_actionInfo_messages_triggered() { if (toolsMenu != NULL) { - actionInfo_messages->setChecked(!actionInfo_messages->isChecked()); -// actionInfo_messages->toggle(); - info_messages = actionInfo_messages->isChecked(); - fprintf(stderr, "Info is checked? %s\n", actionInfo_messages->isChecked() ? "yes" : "no"); + info_messages = !actionInfo_messages->isChecked(); + actionInfo_messages->setChecked(info_messages); + fprintf(stderr, "Info is checked? %s\n", info_messages ? "yes" : "no"); } -// menuBar()->repaint(); } /** @@ -836,135 +865,11 @@ void QKernel::on_actionInfo_messages_triggered() */ void QKernel::on_actionOptions_triggered() { - QDialog dlg(this, Qt::Dialog); - dlg.setWindowTitle("Options"); - ConnectEntry *e; - unsigned int i; - - QLineEdit* progs; - progs = new QLineEdit(progdir, &dlg); - progs->setGeometry(150, 20, 180, 30); - - QLabel* tmpQLabel; - tmpQLabel = new QLabel("Programs directory", &dlg); - tmpQLabel->setGeometry(30, 20, 120, 30); - - QFrame* tmpQFrame; - tmpQFrame = new QFrame(&dlg); - tmpQFrame->setGeometry(10, 60, 380, 30); - tmpQFrame->setFrameStyle(52); - - tmpQLabel = new QLabel("Virtual Processor properties (activated after " - "restarting VLP):", &dlg); - tmpQLabel->setGeometry(10, 80, 340, 30); - - QLineEdit *nn; - char nns[256]; - sprintf(nns, "%d", NodeNumber); - nn = new QLineEdit(nns, &dlg); - nn->setGeometry(110, 110, 40, 30); - - tmpQLabel = new QLabel("Node number:", &dlg); - tmpQLabel->setGeometry(20, 110, 90, 30); - - QRadioButton *exp, *reg; - exp = new QRadioButton("Explicit", &dlg); - exp->setGeometry(30, 170, 100, 30); - exp->setChecked(TRUE); - - reg = new QRadioButton("Registration", &dlg); - reg->setGeometry(30, 200, 100, 30); - reg->setEnabled(FALSE); - - connections = new QListWidget(&dlg); - connections->setGeometry(170, 140, 130, 100); + OptionsDialog optionsDialog(getConfigFilePath(), this); + if (optionsDialog.exec()) { + optionsDialog.saveConfig(getConfigFilePath()); - for (int i = 0; i < ConnectList.size(); i++) { - e = ConnectList.at(i); - connections->addItem(e->addr); - } - - tmpQLabel = new QLabel("Connection list:", &dlg); - tmpQLabel->setGeometry(170, 110, 100, 30); - - QPushButton *addbtn; - QPushButton *delbtn; - QPushButton *okbtn; - QPushButton *cancelbtn; - addbtn = new QPushButton("Add", &dlg); - addbtn->setGeometry(310, 150, 60, 30); - connect(addbtn, SIGNAL(clicked()), this, SLOT(AddAddress())); - - delbtn = new QPushButton("Del", &dlg); - delbtn->setGeometry(310, 200, 60, 30); - connect(delbtn, SIGNAL(clicked()), this, SLOT(DelAddress())); - - okbtn = new QPushButton("Ok", &dlg); - okbtn->setGeometry(80, 260, 100, 30); - okbtn->setDefault(TRUE); - connect(okbtn, SIGNAL(clicked()), &dlg, SLOT(accept())); - - cancelbtn = new QPushButton("Cancel", &dlg); - cancelbtn->setGeometry(210, 260, 100, 30); - connect(cancelbtn, SIGNAL(clicked()), &dlg, SLOT(reject())); - - QGroupBox* group; - group = new QGroupBox("Connection type", &dlg); - group->setGeometry(20, 150, 120, 90); - group->setAlignment(Qt::AlignLeft); - group->lower(); - - QVBoxLayout *vbox = new QVBoxLayout(); - vbox->addWidget(exp); - vbox->addWidget(reg); - vbox->addStretch(1); - group->setLayout(vbox); - - dlg.resize(400, 310); - if (dlg.exec()) { - config_t cfg; - config_setting_t *root; - config_setting_t *setting; - config_init(&cfg); - - root = config_root_setting(&cfg); - - setting = config_setting_add(root, "progdir", - CONFIG_TYPE_STRING); - config_setting_set_string(setting, progs->text().toAscii().data()); - strcpy(progdir, progs->text().toAscii().data()); - - setting = config_setting_add(root, "node_number", - CONFIG_TYPE_INT); - config_setting_set_int(setting, atoi(nn->text().toAscii().data())); - - setting = config_setting_add(root, "homedir", - CONFIG_TYPE_STRING); - config_setting_set_string(setting, HomeDir); - - setting = config_setting_add(root, "type", - CONFIG_TYPE_STRING); - if (exp->isChecked()) { - config_setting_set_string(setting, "explicit"); - - config_setting_t *hosts = NULL; - hosts = config_setting_add(root, "host", - CONFIG_TYPE_ARRAY); - for(i = 0; i < connections->count(); i++) { - setting = config_setting_add(hosts, NULL, - CONFIG_TYPE_STRING); - config_setting_set_string(setting, - connections->item(i)->text().toAscii().data()); - } - } else { - config_setting_set_string(setting, "register"); - } - - if (!config_write_file(&cfg, "vlp.cfg")) { - fprintf(stderr, "Error while writing to file: %s.\n", - "vlp.cfg"); - } - config_destroy(&cfg); + loadConfig(getConfigFilePath()); } } @@ -975,43 +880,17 @@ void QKernel::on_actionOptions_triggered() */ void QKernel::on_actionLock_console_triggered() { - QDialog d(this, Qt::Dialog); - d.setWindowTitle("Lock console"); + LockDialog lockDialog(this); - QPushButton ob("Ok", &d); - ob.setGeometry(30, 60, 80, 30); - ob.setDefault(TRUE); - connect(&ob, SIGNAL(clicked()), &d, SLOT(accept())); + if (lockDialog.exec()) { + QString password = lockDialog.getPassword(); + if (lockDialog.getPassword().size() > 0) { + strcpy(LockPasswd, password.toAscii().data()); + lockDialog.retype(); - QLabel lab("Password:", &d); - lab.setGeometry(10, 10, 60, 30); - - QLineEdit ed("", &d); - ed.setGeometry(70, 10, 140, 30); - ed.setEchoMode(QLineEdit::Password); - - QPushButton cb("Cancel", &d); - cb.setGeometry(130, 60, 80, 30); - connect(&cb, SIGNAL(clicked()), &d, SLOT(reject())); - - d.resize(240, 100); - - if (d.exec()) { - if (strcmp(ed.text().toAscii().data(), "") != 0) { - strcpy(LockPasswd, ed.text().toAscii().data()); - lab.setText("Retype:"); - ed.setText(""); - /* - * Following exec(), could produce error: - * X Error: BadWindow (invalid Window parameter) 3 - * Major opcode: 3 (X_GetWindowAttributes) - * - * This is not error in our code. Basing on: - * https://bugreports.qt-project.org/browse/QTBUG-1782 - * this happens only on Qt 4.3 - 4.4. - */ - if (d.exec()) { - if (strcmp(ed.text().toAscii().data(), LockPasswd) == 0) { + if (lockDialog.exec()) { + password = lockDialog.getPassword(); + if (password == LockPasswd) { setLocked(TRUE); WriteMessage("CONSOLE LOCKED"); } else { @@ -1019,6 +898,7 @@ void QKernel::on_actionLock_console_triggered() msg.setText("Not matching!"); msg.setButtonText(0, "Close"); msg.show(); + strcpy(LockPasswd, ""); } } else { strcpy(LockPasswd, ""); @@ -1051,7 +931,7 @@ void QKernel::on_actionUnlock_console_triggered() QPushButton cb("Cancel", &d); cb.setGeometry(130, 60, 80, 30); - connect(&cb, SIGNAL(clicked()), &d, SLOT(reject())); + connect(&cb, SIGNAL(clicked()), &d, SLOT(reject())); d.resize(240, 100); @@ -1127,7 +1007,8 @@ InterpEntry *QKernel::RunIntModule(char *ss, int r) { char a[256], b[255]; struct sockaddr_un svr; - int len, sock, i, on; + int len, sock, on; + unsigned int i; int newint=-1; char cmd[255]; FILE *cf; @@ -1171,11 +1052,15 @@ InterpEntry *QKernel::RunIntModule(char *ss, int r) strcpy(newINT->fullname, ss); sprintf(a, "%s%d", IPATH, newint); - sprintf(cmd, "%s/modules/logint %s %s", HomeDir, a, ss); - if (r) + sprintf(cmd, "%s/modules/logint %s %s", + getHomeDir(), + a, + ss); + if (r) { strcat(cmd, " r"); - sprintf(b, " %s %s %s %s %s", myargs[0], myargs[1], myargs[2], - myargs[3], myargs[4]); + } + sprintf(b, " %s %s %s %s %s", + myargs[0], myargs[1], myargs[2], myargs[3], myargs[4]); strcat(cmd, b); strcat(cmd, " &"); @@ -1345,16 +1230,10 @@ void QKernel::on_actionInfo_triggered() */ int main(int argc, char **argv) { - int i; - for(i = 0; i < 5; i++) { - strcpy(myargs[i], ""); - } - for(i = 1; i < argc; i++) { - strcpy(myargs[i - 1], argv[i]); - } + XInitThreads(); QApplication * app = new QApplication(argc, argv); - QKernel kernel; + QKernel kernel(argc, argv); kernel.show(); kernel.InitMessage();