1 /**************************************************************
3 Copyright (C) 1997 Oskar Swida
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 NOTE: This software is using the free software license of
23 the QT library v.1.30 from Troll Tech AS.
24 See the file LICENSE.QT.
27 To contact the author, write:
28 e-mail: swida@aragorn.pb.bialystok.pl
30 ************************************************************/
34 //#include <qwindow.h>
62 #include <qwindowsstyle.h>
72 #include <netinet/in.h>
74 #include <libconfig.h>
75 #include "AppConfiguration.h"
80 #define REMOTE_PATH "REMOTE"
82 #define MAXINSTANCES 256
90 char CharLine[25]="________________________";
94 /* --------------- interpreter slot -----------------*/
98 int ID; // INT identifier
99 bool remote; // Am I remote ?
100 char fullname[255],shortname[255]; // Program name
102 QSocketNotifier *notify;
103 int RInstances[MAXINSTANCES]; // IDs of my remote INT modules
104 ctx_struct p_ctx; // parent INT info
106 /*++++++++++++++++++++++++++++++++++++++++++*/
108 /*----------------- connection slot -------------*/
113 ConnectEntry(char *s) {strcpy(addr,s);};
116 /* ++++++++++++++++++++++++++++++++++++++++++ */
121 /* ---------------------------------------------------------- */
122 /* KERNEL CLASS DEFINITION */
123 /* ---------------------------------------------------------- */
125 class QKernel : public QFrame
130 QMultiLineEdit *desktop;
132 QPopupMenu *p,*p1,*p2;
134 int NodeNumber,ConType;
140 virtual void resizeEvent( QResizeEvent *ev );
142 void WriteMessage(char* msg);
156 void UnlockConsole();
157 void MessageToNode();
160 void IntMessage(int);
161 void KillInterpreter();
168 virtual void closeEvent ( QCloseEvent * e );
171 QList<InterpEntry> Interpreters;
172 QList<ConnectEntry> ConnectList;
173 QListBox *connections;
174 int Tasks; // number of working interpreters
175 int ActiveConnections; // number of connected VLPs
176 bool LOCKED,synchro,wait_for_info;
178 int lockid,unlockid,qid,cwid,
179 optid,prid,mid,msgid,toolsid,hid;
182 QSocketNotifier *Net_Notify;
187 void LoadConfig(char *);
188 void RunGraphModule(char*);
190 InterpEntry *findINTbySocket(int);
191 InterpEntry *findINTbyID(int);
192 InterpEntry *RunIntModule(char *ss,int r);
193 void RemoteInstance(InterpEntry*,int);
194 void CloseInstances(InterpEntry*);
198 /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
200 void QKernel::closeEvent ( QCloseEvent * e ) {
206 QFont f("Helvetica",10,QFont::Bold);
207 QFont f1("Helvetica",10,QFont::Normal);
208 QFont f2("Times Roman",10,QFont::Normal);
214 sprintf(ss,"mkdir %s",REMOTE_PATH);
221 setCaption("Virtual LOGLAN Processor");
222 setBackgroundColor(white);
224 bar = new QMenuBar(this);
226 p = new QPopupMenu();
228 p->insertItem("Execute",this,SLOT(Run_Prog()));
229 p->insertItem("Kill",this,SLOT(KillInterpreter()));
230 prid = bar->insertItem("&Program",p);
231 p1 = new QPopupMenu();
232 p1->insertItem("Message",this,SLOT(MessageToNode()));
233 p1->insertSeparator();
234 p1->insertItem("Connect",this,SLOT(Connect()));
235 p1->insertItem("Disconnect",this,SLOT(Disconnect()));
236 p1->insertItem("Info",this,SLOT(Info()));
238 mid = bar->insertItem("&Machine",p1);
240 p2 = new QPopupMenu();
241 cwid = p2->insertItem("Editor",this,SLOT(Edit()));
242 hid = p2->insertItem("Help",this,SLOT(Help()));
243 p2->insertSeparator();
244 optid = p2->insertItem("Options",this,SLOT(SetOptions()));
245 msgid = p2->insertItem("Info messages",this,SLOT(SetMessages()));
246 p2->setItemChecked(msgid,TRUE);
247 p2->insertSeparator();
248 lockid = p2->insertItem("Lock console",this,SLOT(LockConsole()));
249 unlockid = p2->insertItem("Unlock console",this,SLOT(UnlockConsole()));
250 p2->setItemEnabled(unlockid,FALSE);
253 toolsid = bar->insertItem("&Tools",p2);
255 qid = bar->insertItem("&Quit",this,SLOT(QuitProc()));
258 desktop = new QMultiLineEdit(this,"desktop");
259 desktop->setAutoUpdate(TRUE);
260 desktop->setReadOnly(TRUE);
261 desktop->setFont(f1);
266 ActiveConnections = 0;
267 strcpy(LockPasswd,"");
268 LoadConfig("vlp.cfg");
271 Net_Notify = new QSocketNotifier(net_sock,QSocketNotifier::Read,this);
272 connect(Net_Notify,SIGNAL(activated(int)),this,SLOT(NetMessage()));
277 void QKernel::resizeEvent( QResizeEvent *ev )
279 QFrame::resizeEvent(ev);
281 desktop->setGeometry( 0,bar->height(), width(), height() - bar->height() );
287 void QKernel::n_impl()
289 QMessageBox::information(this,"Function info","This function is not implemented yet...","Ok");
293 /* ########### load configuration from file ############# */
295 void QKernel::LoadConfig(char * fname)
297 /* Hack for checking if file exists without using external libs.*/
298 FILE * file = fopen(fname, "r");
300 fprintf(stderr, "Error: Cannot load configuration file %s!\n", fname);
303 /* File exists, so file has been locked. Release it. */
306 AppConfiguration config(fname);
308 NodeNumber = config.getInt("node_number");
309 if (config.error() == TRUE) {
314 ConType = (strcmp("explicit", config.getString("type")) == 0) ? 1 : 2;
318 strcpy(host, config.getString("host"));//FIXME: buffer overflow
319 if (config.error() == FALSE) {
320 ConnectList.append(new ConnectEntry(config.getString("host")));
323 strcpy(progdir, config.getString("progdir"));//FIXME: buffer overflow
326 strcpy(HomeDir, config.getString("homedir"));//FIXME: buffer overflow
331 /* +++++++++++++++++++++++++++++++++++++++++++++++ */
334 void QKernel::Run_Prog()
337 QString s(QFileDialog::getOpenFileName(progdir,"*.log",this));
341 if (i>0) s.remove(i,4);
342 RunIntModule((char*)s.ascii(),0);
350 sprintf(cmd,"%s/modules/logedit %s %s %s %s %s %s &",HomeDir,HomeDir,
351 myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
358 sprintf(cmd,"%s/modules/loghelp %s/doc %s %s %s %s %s &",HomeDir,HomeDir,
359 myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
364 void QKernel::RunGraphModule(char *sk)
369 sprintf(cmd,"%s/modules/loggraph %s %s %s %s %s %s",HomeDir,sk,
370 myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
374 WriteMessage("Cannot connect GRAPH resources");
380 void QKernel::RunNetModule()
382 struct sockaddr_un svr;
388 sprintf(cmd,"%s/modules/lognet %s %s %s %s %s %s",HomeDir,NPATH,
389 myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
392 /* -------- socket for NET module -------- */
394 sock = socket(AF_UNIX,SOCK_STREAM,0);
395 bzero(&svr,sizeof(svr));
396 svr.sun_family = AF_UNIX;
397 strcpy(svr.sun_path,NPATH);
398 len = strlen(svr.sun_path)+sizeof(svr.sun_family);
399 bind(sock,(struct sockaddr*)&svr, len);
402 if ( system(cmd) == 0)
404 net_sock = accept(sock,(struct sockaddr*)0,(unsigned int*)0);
408 WriteMessage("NETWORK successfully connected");
409 fcntl(net_sock,F_SETFL, O_NONBLOCK|fcntl(net_sock,F_GETFL,0));
411 setsockopt(net_sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
415 WriteMessage("Cannot connect NETWORK resources");
416 WriteMessage("Exiting...");
423 WriteMessage("Cannot connect NETWORK resources");
424 WriteMessage("Exiting...");
432 void QKernel::Connect()
434 QDialog d(this,"",TRUE);
435 QLabel lab(&d,"IP Address:");
437 QPushButton ob(&d,""),cb(&d,"");
440 d.setFont(QFont("Helvetica",12,QFont::Bold));
441 ob.setGeometry( 30, 60, 80, 30 );
444 lab.setGeometry( 10, 10, 60, 30 );
445 lab.setText( "Address" );
446 ed.setGeometry( 70, 10, 140, 30 );
447 cb.setGeometry( 130, 60, 80, 30 );
448 cb.setText( "Cancel" );
449 d.resize( 240, 100 );
451 connect(&ob,SIGNAL(clicked()),&d,SLOT(accept()));
452 connect(&cb,SIGNAL(clicked()),&d,SLOT(reject()));
455 m.msg_type = MSG_NET;
456 m.param.pword[0] = NET_CONNECT_TO;
457 strcpy(m.param.pstr,ed.text());
458 write(net_sock,&m,sizeof(MESSAGE));
463 void QKernel::Disconnect()
467 if (info_messages) WriteMessage("Disconnecting from virtual machine");
468 msg.msg_type = MSG_NET;
469 msg.param.pword[0] = NET_DISCONNECT;
470 write(net_sock,&msg,sizeof(MESSAGE));
473 void QKernel::QuitProc()
477 if ( QMessageBox::question(this,"Close VLP","Terminate VLP ?",QMessageBox::Yes,QMessageBox::No,0) == QMessageBox::No ) return;
481 msg.msg_type = MSG_NET;
482 msg.param.pword[0] = NET_DISCONNECT;
483 write(net_sock,&msg,sizeof(MESSAGE));*/
488 msg.msg_type = MSG_NET;
489 msg.param.pword[0] = NET_EXIT;
490 write(net_sock,&msg,sizeof(MESSAGE));
491 // ::close(net_sock);
500 void QKernel::AddAddress()
502 QDialog d(this,"",TRUE);
503 QLabel lab(&d,"IP Address:");
505 QPushButton ob(&d,""),cb(&d,"");
509 ob.setGeometry( 30, 60, 80, 30 );
512 lab.setGeometry( 10, 10, 60, 30 );
513 lab.setText( "Address" );
514 ed.setGeometry( 70, 10, 140, 30 );
515 cb.setGeometry( 130, 60, 80, 30 );
516 cb.setText( "Cancel" );
517 d.resize( 240, 100 );
518 connect(&ob,SIGNAL(clicked()),&d,SLOT(accept()));
519 connect(&cb,SIGNAL(clicked()),&d,SLOT(reject()));
521 if (strcmp(ed.text(),"")!=0)
523 connections->insertItem(ed.text());
528 void QKernel::DelAddress()
532 if (connections->currentItem()!=-1)
533 connections->removeItem(connections->currentItem());
539 void QKernel::MessageToNode()
546 dlg = new QDialog(this,"Message",TRUE);
548 nodenr = new QLineEdit(dlg,"number");
549 nodenr->setGeometry( 90, 10, 50, 30 );
553 tmpQLabel = new QLabel( dlg, "Label_1" );
554 tmpQLabel->setGeometry( 10, 10, 77, 30 );
555 tmpQLabel->setText( "Node number:" );
557 tmpQLabel = new QLabel( dlg, "Label_2" );
558 tmpQLabel->setGeometry( 10, 50, 70, 30 );
559 tmpQLabel->setText( "Message:" );
562 msg = new QLineEdit( dlg, "LineEdit_1" );
563 msg->setGeometry( 80, 60, 330, 30 );
567 ob = new QPushButton( dlg, "PushButton_1" );
568 ob->setGeometry( 230, 10, 80, 30 );
569 ob->setText( "Send" );
570 ob->setDefault(TRUE);
571 cb = new QPushButton( dlg, "PushButton_2" );
572 cb->setGeometry( 330, 10, 80, 30 );
573 cb->setText( "Cancel" );
574 dlg->resize( 430, 110 );
575 connect(ob,SIGNAL(clicked()),dlg,SLOT(accept()));
576 connect(cb,SIGNAL(clicked()),dlg,SLOT(reject()));
577 dlg->setCaption("Send message to node");
581 m.msg_type = MSG_NET;
582 m.param.pword[0] = NET_PROPAGATE;
583 m.param.pword[1] = MSG_VLP;
584 m.param.pword[2] = NodeNumber;
585 m.param.pword[4] = atoi(nodenr->text());
586 m.param.pword[6] = VLP_WRITE;
587 strcpy(m.param.pstr,msg->text());
588 write(net_sock,&m,sizeof(MESSAGE));
592 void QKernel::KillInterpreter()
599 dlg = new QDialog(this,"Message",TRUE);
601 nodenr = new QLineEdit(dlg,"number");
602 nodenr->setGeometry( 90, 10, 50, 30 );
606 tmpQLabel = new QLabel( dlg, "Label_1" );
607 tmpQLabel->setGeometry( 10, 10, 77, 30 );
608 tmpQLabel->setText( "Interp. ID:" );
610 ob = new QPushButton( dlg, "PushButton_1" );
611 ob->setGeometry( 160, 10, 80, 30 );
612 ob->setText( "Kill" );
613 ob->setDefault(TRUE);
614 cb = new QPushButton( dlg, "PushButton_2" );
615 cb->setGeometry( 260, 10, 80, 30 );
616 cb->setText( "Cancel" );
617 dlg->resize( 360, 50 );
618 connect(ob,SIGNAL(clicked()),dlg,SLOT(accept()));
619 connect(cb,SIGNAL(clicked()),dlg,SLOT(reject()));
620 dlg->setCaption("Kill interpreter");
624 m.msg_type = MSG_INT;
625 m.param.pword[0] = INT_KILL;
626 pom = findINTbyID(atoi(nodenr->text()));
630 write(pom->sock,&m,sizeof(MESSAGE));
631 else WriteMessage("This is a remote instance of a program!");
633 else WriteMessage("Interpreter not found");
641 void QKernel::NetMessage()
648 cnt = read(net_sock,&msg,sizeof(MESSAGE));
649 if ( (cnt>0) && (msg.msg_type==MSG_NET))
651 switch(msg.param.pword[0])
653 case NET_CSWRITELN: WriteMessage(msg.param.pstr);break;
655 switch(msg.param.pword[1])
658 /* pom = find_link_by_ID(msg.param.pword[5]);
659 msg.msg_type = MSG_NET;
660 msg.param.pword[0] = NET_PROPAGATE;
661 send_int(pom,&msg);*/
664 switch(msg.param.pword[6])
667 QApplication::beep();
668 WriteMessage(CharLine);
669 WriteMessage("### Incoming Messsage ###");
670 sprintf(ss,"Mesg from Node %d: %s",msg.param.pword[2],msg.param.pstr);
672 WriteMessage(CharLine);
674 case VLP_REMOTE_INSTANCE:
675 sprintf(ss,"%s/%s",REMOTE_PATH,msg.param.pstr);
678 WriteMessage("Running program:");
681 pom = RunIntModule(ss,1);
684 pom->p_ctx.node = msg.param.pword[2];
685 pom->p_ctx.program_id = msg.param.pword[7];
686 pom->RInstances[msg.param.pword[2]] = msg.param.pword[7];
689 case VLP_CLOSE_INSTANCE:
690 msg.msg_type = MSG_INT;
691 msg.param.pword[0] = INT_CLOSE_INSTANCE;
692 pom = findINTbyID(msg.param.pword[7]);
695 write(pom->sock,&msg,sizeof(MESSAGE));
697 m1.msg_type = MSG_VLP;
698 m1.param.pword[0] = VLP_INTERPRETER_DOWN;
699 m1.param.pword[1] = pom->ID;
700 write(net_sock,&m1,sizeof(MESSAGE));
701 } else WriteMessage("Instance not found");
707 case NET_CONNECTIONS: ActiveConnections = msg.param.pword[1];
708 WriteMessage(msg.param.pstr);
709 if (!synchro) synchro=TRUE;
714 QString poms,poms1,poms2;
715 poms.sprintf("%s",msg.param.pstr);
716 while (poms.length()>0)
720 { poms1=poms.left(cnt);
721 poms=poms.right(poms.length()-cnt-1);
725 poms2=poms1.left(cnt);
726 poms1=poms1.right(poms1.length()-cnt-1);
727 sprintf(ss,"Node: %s Addr: %s",poms2.data(),poms1.data());
734 case NET_INFO_END:wait_for_info=FALSE;
735 WriteMessage(CharLine);
745 void QKernel::IntMessage(int sock)
751 cnt = read(sock,&msg,sizeof(MESSAGE));
752 e = findINTbySocket(sock);
753 if ( (cnt>0) && (e!=NULL))
755 switch (msg.msg_type)
758 if (msg.param.pword[0]==GRAPH_ALLOCATE)
760 RunGraphModule(msg.param.pstr);
764 write(net_sock,&msg,sizeof(MESSAGE));break;
766 switch(msg.param.pword[0])
768 case VLP_REMOTE_INSTANCE_PLEASE:
769 RemoteInstance(e,msg.param.pword[2]);
774 switch(msg.param.pword[0]){
780 m.msg_type = MSG_VLP;
781 m.param.pword[0] = VLP_INTERPRETER_DOWN;
782 m.param.pword[1] = e->ID;
783 write(net_sock,&m,sizeof(MESSAGE));
784 if (e->remote==0) CloseInstances(e);
787 Interpreters.remove(e);
791 sprintf(ss,"%s : End of program execution",msg.param.pstr);
797 msg.msg_type = MSG_INT;
798 msg.param.pword[0] = INT_CTX;
799 msg.param.pword[1] = NodeNumber;
800 msg.param.pword[2] = e->ID;
803 msg.param.pword[3] = e->p_ctx.node;
804 msg.param.pword[4] = e->p_ctx.program_id;
806 write(sock,&msg,sizeof(MESSAGE));
808 };break; /* switch param.pword[0] */
814 void QKernel::WriteMessage(char *msg)
818 desktop->getCursorPosition(&x,&y);
819 if (x>100) desktop->clear();
820 desktop->setReadOnly(FALSE);
821 desktop->append(msg);
822 desktop->setReadOnly(TRUE);
823 desktop->setCursorPosition(desktop->numLines(),1);
825 if (desktop->numLines()>100) desktop->clear();
828 void QKernel::SetMessages()
833 if ( p2->isItemChecked(msgid))
835 p2->setItemChecked(msgid,FALSE);
840 p2->setItemChecked(msgid,TRUE);
847 void QKernel::SetOptions()
849 QDialog dlg(this,"Options",TRUE);
857 progs = new QLineEdit( &dlg, "progs" );
858 progs->setGeometry( 150, 20, 180, 30 );
859 progs->setText(progdir);
862 tmpQLabel = new QLabel( &dlg, "Label_1" );
863 tmpQLabel->setGeometry( 30, 20, 120, 30 );
864 tmpQLabel->setText( "Programs directory" );
867 tmpQFrame = new QFrame( &dlg, "Frame_2" );
868 tmpQFrame->setGeometry( 10, 60, 380, 30 );
869 tmpQFrame->setFrameStyle( 52 );
871 tmpQLabel = new QLabel( &dlg, "Label_2" );
872 tmpQLabel->setGeometry( 10, 80, 340, 30 );
873 tmpQLabel->setText( "Virtual Processor properties (activated after restarting VLP):" );
877 nn = new QLineEdit( &dlg, "LineEdit_2" );
878 nn->setGeometry( 110, 110, 40, 30 );
879 sprintf(nns,"%d",NodeNumber);
882 tmpQLabel = new QLabel( &dlg, "Label_3" );
883 tmpQLabel->setGeometry( 20, 110, 90, 30 );
884 tmpQLabel->setText( "Node number:" );
886 QRadioButton *exp,*reg;
887 exp = new QRadioButton( &dlg, "RadioButton_3" );
888 exp->setGeometry( 30, 170, 100, 30 );
889 exp->setText( "Explicit" );
890 exp->setChecked( TRUE );
892 reg = new QRadioButton( &dlg, "RadioButton_4" );
893 reg->setGeometry( 30, 200, 100, 30 );
894 reg->setText( "Registration" );
895 reg->setEnabled(FALSE);
897 connections = new QListBox( &dlg, "ListBox_1" );
898 connections->setGeometry( 170, 140, 130, 100 );
899 e = ConnectList.first();
902 connections->insertItem(e->addr);
903 e = ConnectList.next();
906 tmpQLabel = new QLabel( &dlg, "Label_5" );
907 tmpQLabel->setGeometry( 170, 110, 100, 30 );
908 tmpQLabel->setText( "Connection list:" );
910 QPushButton* addbtn,*delbtn,*okbtn,*cancelbtn;
911 addbtn = new QPushButton( &dlg, "PushButton_1" );
912 addbtn->setGeometry( 310, 150, 60, 30 );
913 addbtn->setText( "Add" );
914 delbtn = new QPushButton( &dlg, "PushButton_2" );
915 delbtn->setGeometry( 310, 200, 60, 30 );
916 delbtn->setText( "Del" );
917 connect(addbtn,SIGNAL(clicked()),this,SLOT(AddAddress()));
918 connect(delbtn,SIGNAL(clicked()),this,SLOT(DelAddress()));
919 okbtn = new QPushButton( &dlg, "PushButton_3" );
920 okbtn->setGeometry( 80, 260, 100, 30 );
921 okbtn->setText( "Ok" );
922 okbtn->setDefault(TRUE);
923 cancelbtn = new QPushButton( &dlg, "PushButton_4" );
924 cancelbtn->setGeometry( 210, 260, 100, 30 );
925 cancelbtn->setText( "Cancel" );
926 connect(okbtn,SIGNAL(clicked()),&dlg,SLOT(accept()));
927 connect(cancelbtn,SIGNAL(clicked()),&dlg,SLOT(reject()));
929 group = new QButtonGroup( &dlg, "ButtonGroup_1" );
930 group->setGeometry( 20, 150, 120, 90 );
931 group->setTitle( "Connection type" );
932 group->setAlignment( 1 );
934 group->insert(exp,1);
935 group->insert(reg,2);
937 dlg.resize( 400, 310 );
941 vlp_file = new QFile("vlp.cfg");
942 vlp_file->open(IO_WriteOnly);
943 sprintf(line,"progdir=%s\n",progs->text().ascii());
944 vlp_file->writeBlock(line,strlen(line));
945 strcpy(progdir,progs->text());
946 sprintf(line,"node_number=%d\n",atoi(nn->text()));
947 vlp_file->writeBlock(line,strlen(line));
948 if ( exp->isChecked())
950 sprintf(line,"type=explicit\n");
951 vlp_file->writeBlock(line,strlen(line));
952 for(i=0;i<connections->count();i++)
954 sprintf(line,"host=%s\n",connections->text(i).ascii());
955 vlp_file->writeBlock(line,strlen(line));
961 sprintf(line,"type=register\n");
962 vlp_file->writeBlock(line,strlen(line));
969 void QKernel::LockConsole()
971 QDialog d(this,"Enter password",TRUE);
972 QLabel lab(&d,"Password");
974 QPushButton ob(&d,""),cb(&d,"");
976 d.setCaption("Lock console");
977 ob.setGeometry( 30, 60, 80, 30 );
980 lab.setGeometry( 10, 10, 60, 30 );
981 lab.setText( "Password:" );
982 ed.setGeometry( 70, 10, 140, 30 );
983 ed.setEchoMode(QLineEdit::Password);
984 cb.setGeometry( 130, 60, 80, 30 );
985 cb.setText( "Cancel" );
986 d.resize( 240, 100 );
987 connect(&ob,SIGNAL(clicked()),&d,SLOT(accept()));
988 connect(&cb,SIGNAL(clicked()),&d,SLOT(reject()));
991 if (strcmp(ed.text(),"")!=0)
993 strcpy(LockPasswd,ed.text());
994 lab.setText("Retype:");
998 if (strcmp(ed.text(),LockPasswd)==0)
1000 bar->setItemEnabled(qid,FALSE);
1001 bar->setItemEnabled(prid,FALSE);
1002 bar->setItemEnabled(mid,FALSE);
1003 p2->setItemEnabled(unlockid,TRUE);
1004 p2->setItemEnabled(lockid,FALSE);
1005 p2->setItemEnabled(cwid,FALSE);
1006 p2->setItemEnabled(optid,FALSE);
1008 WriteMessage("CONSOLE LOCKED");
1013 QMessageBox msg(this);
1014 msg.setText("Not matching!");
1015 msg.setButtonText(0,"Close");
1020 else strcpy(LockPasswd,"");
1024 void QKernel::UnlockConsole()
1026 QDialog d(this,"Enter password",TRUE);
1027 QLabel lab(&d,"Password");
1028 QLineEdit ed(&d,"");
1029 QPushButton ob(&d,""),cb(&d,"");
1031 ob.setGeometry( 30, 60, 80, 30 );
1033 ob.setDefault(TRUE);
1034 lab.setGeometry( 10, 10, 60, 30 );
1035 lab.setText( "Password:" );
1036 ed.setGeometry( 70, 10, 140, 30 );
1037 ed.setEchoMode(QLineEdit::Password);
1038 cb.setGeometry( 130, 60, 80, 30 );
1039 cb.setText( "Cancel" );
1040 d.resize( 240, 100 );
1041 connect(&ob,SIGNAL(clicked()),&d,SLOT(accept()));
1042 connect(&cb,SIGNAL(clicked()),&d,SLOT(reject()));
1046 if (strcmp(ed.text(),LockPasswd)==0)
1048 bar->setItemEnabled(qid,TRUE);
1049 bar->setItemEnabled(prid,TRUE);
1050 bar->setItemEnabled(mid,TRUE);
1051 p2->setItemEnabled(unlockid,FALSE);
1052 p2->setItemEnabled(lockid,TRUE);
1053 p2->setItemEnabled(cwid,TRUE);
1054 p2->setItemEnabled(optid,TRUE);
1056 WriteMessage("CONSOLE UNLOCKED");
1061 QMessageBox msg(this);
1062 msg.setText("Wrong password!");
1063 msg.setButtonText(0,"Close");
1070 void QKernel::InitMessage()
1072 WriteMessage("\n Virtual LOGLAN Processor - ver 1.9: READY \n");
1077 InterpEntry *QKernel::findINTbySocket(int _id)
1080 pom = Interpreters.first();
1083 if (pom->sock == _id) break;
1084 pom = Interpreters.next();
1089 InterpEntry *QKernel::findINTbyID(int _id)
1092 pom = Interpreters.first();
1095 if (pom->ID == _id) break;
1096 pom = Interpreters.next();
1102 /* ------------------ Connect INT module -----------------*/
1104 InterpEntry *QKernel::RunIntModule(char *ss, int r)
1107 struct sockaddr_un svr;
1113 InterpEntry *newINT;
1122 if (cf == NULL) {WriteMessage("File not found: no .ccd file");return(NULL);}
1128 if (cf == NULL) {WriteMessage("File not found: no .pcd file");return(NULL);}
1131 newINT = new InterpEntry;
1132 for(i=0;i<MAXINSTANCES;i++) newINT->RInstances[i]=-1;
1134 strcpy(b,rindex(ss,'/'));
1135 for(i=0;i<strlen(b);i++)
1139 sprintf(a,"%s : Start execution",b);
1143 newint = freeINTid; freeINTid++;
1144 newINT->ID = newint;
1145 strcpy(newINT->shortname,b);
1146 strcpy(newINT->fullname,ss);
1148 sprintf(a,"%s%d",IPATH,newint);
1149 sprintf(cmd,"%s/modules/logint %s %s",HomeDir,a,ss);
1150 if (r) strcat(cmd," r");
1151 sprintf(b," %s %s %s %s %s",myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
1156 sock = socket(AF_UNIX,SOCK_STREAM,0);
1158 bzero(&svr, sizeof(svr));
1159 svr.sun_family = AF_UNIX;
1160 strcpy(svr.sun_path,a);
1161 len = strlen(svr.sun_path)+sizeof(svr.sun_family);
1162 bind(sock,(struct sockaddr*)&svr, len);
1165 newINT->sock = accept(sock,(struct sockaddr*)0,(unsigned int *)0);
1172 fcntl(newINT->sock,F_SETFL,
1173 O_NONBLOCK|fcntl(newINT->sock,F_GETFL,0));
1175 setsockopt(newINT->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
1176 if (r) newINT->remote = 1;else newINT->remote=0;
1178 bzero(&msg,sizeof(MESSAGE));
1179 msg.msg_type = MSG_VLP;
1180 msg.param.pword[0] = VLP_REGINT;
1181 msg.param.pword[1] = newINT->ID;
1182 sprintf(msg.param.pstr,"logi%d.net",newint);
1183 write(net_sock,&msg,sizeof(MESSAGE));
1185 Interpreters.append(newINT);
1186 newINT->notify = new QSocketNotifier(newINT->sock,QSocketNotifier::Read);
1187 connect(newINT->notify,SIGNAL(activated(int)),this,SLOT(IntMessage(int)));
1188 if (info_messages) WriteMessage("INTERPRETER successfully connected");
1191 else WriteMessage("Cannot connect interpreter");
1197 /* ---------------------------------------------------------*/
1198 /* Allocate remote instance */
1200 void QKernel::RemoteInstance(InterpEntry *interp, int on)
1206 m.msg_type = MSG_NET;
1207 m.param.pword[0] = NET_NODE_EXIST;
1208 m.param.pword[1] = on;
1209 m.param.pword[2] = interp->ID;
1210 write(net_sock,&m,sizeof(MESSAGE));
1211 bzero(&m,sizeof(MESSAGE));
1212 while( (m.msg_type!=MSG_NET) && (m.param.pword[0]!=NET_NODE_EXIST) )
1213 read(net_sock,&m,sizeof(MESSAGE));
1215 if (m.param.pword[1]==1) /* means node exists */
1217 m.msg_type = MSG_NET;
1218 m.param.pword[0] = NET_TRANSMIT_CODE;
1219 m.param.pword[1] = interp->ID;
1220 m.param.pword[2] = on;
1221 strcpy(m.param.pstr,interp->fullname);
1222 write(net_sock,&m,sizeof(MESSAGE));
1224 Net_Notify->setEnabled(FALSE);
1225 while ( (m.msg_type != MSG_NET) || (m.param.pword[0]!=NET_TRANSMITTED) )
1226 read(net_sock,&m,sizeof(MESSAGE));
1229 m.msg_type = MSG_NET;
1230 m.param.pword[0] = NET_PROPAGATE;
1231 m.param.pword[1] = MSG_VLP;
1232 m.param.pword[2] = NodeNumber;
1233 m.param.pword[3] = 0;
1234 m.param.pword[4] = on;
1235 m.param.pword[5] = 0;
1236 m.param.pword[6] = VLP_REMOTE_INSTANCE;
1237 m.param.pword[7] = interp->ID;
1238 strcpy(m.param.pstr,interp->shortname);
1239 write(net_sock,&m,sizeof(MESSAGE));
1241 read(net_sock,&m,sizeof(MESSAGE));
1244 if ( (m.param.pword[0]==NET_PROPAGATE) && (m.param.pword[6] == VLP_REMOTE_INSTANCE_OK))
1246 interp->RInstances[on] = m.param.pword[7];
1249 read(net_sock,&m,sizeof(MESSAGE));
1252 Net_Notify->setEnabled(TRUE);
1254 /*bzero(&m,sizeof(MESSAGE));*/
1255 m.msg_type = MSG_VLP;
1256 m.param.pword[0] = VLP_REMOTE_INSTANCE_HERE;
1257 m.param.pword[1] = interp->RInstances[on];
1258 write(interp->sock,&m,sizeof(MESSAGE));
1260 else /* There is no such a node! */
1262 sprintf(s,"Warning: Node number %d not found!",on);
1264 WriteMessage("Allocating O-process on the local node");
1265 bzero(&m,sizeof(MESSAGE));
1266 m.msg_type = MSG_VLP;
1267 m.param.pword[0] = VLP_REMOTE_INSTANCE_HERE;
1268 m.param.pword[1] = interp->ID;
1269 write(interp->sock,&m,sizeof(MESSAGE));
1274 /*-----------------------------------------------*/
1275 /* Close all remote instances */
1277 void QKernel::CloseInstances(InterpEntry *e)
1282 if (info_messages) WriteMessage("Closing remote instances");
1283 for(i=0;i<MAXINSTANCES;i++)
1284 if (e->RInstances[i]>=0)
1286 msg.msg_type = MSG_NET;
1287 msg.param.pword[0] = NET_PROPAGATE;
1288 msg.param.pword[1] = MSG_VLP;
1289 msg.param.pword[2] = NodeNumber;
1290 msg.param.pword[4] = i;
1291 msg.param.pword[6] = VLP_CLOSE_INSTANCE;
1292 msg.param.pword[7] = e->RInstances[i];
1293 write(net_sock,&msg,sizeof(MESSAGE));
1298 void QKernel::Info()
1302 WriteMessage(CharLine);
1303 WriteMessage("### Virtual Machine Information ###");
1304 m.msg_type = MSG_NET;
1305 m.param.pword[0]=NET_GET_INFO;
1306 write(net_sock,&m,sizeof(MESSAGE));
1307 wait_for_info = TRUE;
1310 #include "kernel.moc"
1312 int main( int argc, char **argv )
1315 for(i=0;i<5;i++) strcpy(myargs[i],"");
1316 for(i=1;i<argc;i++) strcpy(myargs[i-1],argv[i]);
1318 app = new QApplication(argc,argv);
1319 app->setStyle(new QWindowsStyle());
1321 app->setMainWidget( &draw);