************************************************************/
-
#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <QtGui/QTextEdit>
#include <qcursor.h>
#include <QtCore/QSocketNotifier>
#include <QtGui/QCloseEvent>
-#include <qdir.h>
+#include <QtCore/QDir>
+#include <QtCore/QProcess>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <libconfig.h>
+#include <X11/Xlib.h>
#include "kernel.h"
-#include "kernelwindow.h"
+#include "ui/kernelwindow.h"
#include "lock.h"
#include "options.h"
+#include "kill_interpreter_dialog.h"
+#include "connect_dialog.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.
* 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;
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()));
}
-/**
- * Displays window with information about not implemented functionality.
- */
-void QKernel::n_impl()
+QString QKernel::getConfigFilePath()
{
- QMessageBox::information(this, "Function info", "This function is not "
- "implemented yet...", "Ok");
+ return homeDir.absoluteFilePath("vlp.cfg");
}
+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()
+{
+ 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);
}
"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);
}
if (i > 0)
s.remove(i, 4);
+ // @TODO: if no interpreter is running will result in killing app
RunIntModule((char*)s.toAscii().data(), 0);
}
}
*/
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!");
+ }
+ }
}
/**
*/
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!");
+ }
+ }
}
/**
{
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);
+ }
}
/**
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...");
*/
void QKernel::on_actionConnect_triggered()
{
- QDialog d(this, Qt::Dialog);
- QLabel lab("IP Address:", &d);
- QLineEdit ed("", &d);
- QPushButton ob("", &d);
- QPushButton cb("", &d);
MESSAGE m;
- 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()) {
+ ConnectDialog dialog(this);
+ dialog.setWindowTitle("IP Address:");
+
+ if (dialog.exec()) {
m.msg_type = MSG_NET;
m.param.pword[0] = NET_CONNECT_TO;
- strcpy(m.param.pstr, ed.text().toAscii().data());
- write(net_sock, &m, sizeof(MESSAGE));
+ strcpy(m.param.pstr, dialog.getAddress().toStdString().c_str());
+ write(net_sock, &m, sizeof(MESSAGE));
}
}
*/
void QKernel::on_actionKill_triggered()
{
- QDialog *dlg;
- QLineEdit *nodenr;
- MESSAGE m;
- InterpEntry *pom;
+ KillInterpreterDialog dialog(this);
+ dialog.setWindowTitle("Kill interpreter");
- dlg = new QDialog(this, Qt::Dialog);
- dlg->setWindowTitle("Kill interpreter");
-
- nodenr = new QLineEdit("", dlg);
- nodenr->setGeometry(90, 10, 50, 30);
-
- QLabel * tmpQLabel = new QLabel("Interp. ID:", dlg);
- tmpQLabel->setGeometry(10, 10, 77, 30);
-
- QPushButton * ob = new QPushButton("Kill", dlg);
- ob->setGeometry( 160, 10, 80, 30);
- ob->setDefault(TRUE);
-
- QPushButton * cb = new QPushButton("Cancel", dlg);
- cb->setGeometry(260, 10, 80, 30);
- dlg->resize(360, 50);
-
- connect(ob, SIGNAL(clicked()), dlg, SLOT(accept()));
- connect(cb, SIGNAL(clicked()), dlg, SLOT(reject()));
+ MESSAGE m;
+ InterpEntry *interpreter;
- if (dlg->exec()) {
+ if (dialog.exec()) {
m.msg_type = MSG_INT;
m.param.pword[0] = INT_KILL;
- pom = findINTbyID(atoi(nodenr->text().toAscii().data()));
- if (pom != NULL) {
- if (!(pom->remote))
- write(pom->sock, &m, sizeof(MESSAGE));
+ interpreter = findINTbyID(dialog.getInterpreterId());
+ if (interpreter != NULL) {
+ if (!(interpreter->remote))
+ write(interpreter->sock, &m, sizeof(MESSAGE));
else
- WriteMessage("This is a remote instance of "
- "a program!");
+ WriteMessage("This is a remote instance of a program!");
}
else {
WriteMessage("Interpreter not found");
WriteMessage(CharLine);
break;
case VLP_REMOTE_INSTANCE:
- sprintf(ss, "%s/%s", REMOTE_PATH,
+ sprintf(ss, "%s/%s", getRemoteDir(),
msg.param.pstr);
if (info_messages) {
void QKernel::on_actionInfo_messages_triggered()
{
if (toolsMenu != NULL) {
- info_messages = !actionInfo_messages->isChecked();
+ info_messages = actionInfo_messages->isChecked();
actionInfo_messages->setChecked(info_messages);
- fprintf(stderr, "Info is checked? %s\n", info_messages ? "yes" : "no");
}
}
*/
void QKernel::on_actionOptions_triggered()
{
- OptionsDialog optionsDialog(this);
+ OptionsDialog optionsDialog(getConfigFilePath(), this);
if (optionsDialog.exec()) {
- optionsDialog.saveConfig("vlp.cfg");
- LoadConfig("vlp.cfg");
+ optionsDialog.saveConfig(getConfigFilePath());
+
+ loadConfig(getConfigFilePath());
}
}
if (lockDialog.exec()) {
QString password = lockDialog.getPassword();
if (lockDialog.getPassword().size() > 0) {
- strcpy(LockPasswd, password.toAscii().data());
+ strcpy(LockPasswd, password.toStdString().c_str());
lockDialog.retype();
if (lockDialog.exec()) {
*/
void QKernel::on_actionUnlock_console_triggered()
{
- QDialog d(this, Qt::Dialog);
- d.setWindowTitle("Enter password");
-
- QLabel lab("Password:", &d);
- lab.setGeometry(10, 10, 60, 30);
-
- QLineEdit ed("", &d);
- ed.setGeometry(70, 10, 140, 30);
- ed.setEchoMode(QLineEdit::Password);
-
- QPushButton ob("Ok", &d);
- ob.setGeometry(30, 60, 80, 30);
- ob.setDefault(TRUE);
- connect(&ob, SIGNAL(clicked()), &d, SLOT(accept()));
-
- QPushButton cb("Cancel", &d);
- cb.setGeometry(130, 60, 80, 30);
- connect(&cb, SIGNAL(clicked()), &d, SLOT(reject()));
-
- d.resize(240, 100);
+ LockDialog lockDialog(this);
- if (d.exec()) {
- if (strcmp(ed.text().toAscii().data(), LockPasswd) == 0) {
+ if (lockDialog.exec()) {
+ QString password = lockDialog.getPassword();
+ if (strcmp(password.toStdString().c_str(), LockPasswd) == 0) {
setLocked(FALSE);
WriteMessage("CONSOLE UNLOCKED");
} else {
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, " &");
*/
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();