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>
79 #define REMOTE_PATH "REMOTE"
81 #define MAXINSTANCES 256
89 char CharLine[25]="________________________";
93 /* --------------- interpreter slot -----------------*/
97 int ID; // INT identifier
98 bool remote; // Am I remote ?
99 char fullname[255],shortname[255]; // Program name
101 QSocketNotifier *notify;
102 int RInstances[MAXINSTANCES]; // IDs of my remote INT modules
103 ctx_struct p_ctx; // parent INT info
105 /*++++++++++++++++++++++++++++++++++++++++++*/
107 /*----------------- connection slot -------------*/
112 ConnectEntry(char *s) {strcpy(addr,s);};
115 /* ++++++++++++++++++++++++++++++++++++++++++ */
120 /* ---------------------------------------------------------- */
121 /* KERNEL CLASS DEFINITION */
122 /* ---------------------------------------------------------- */
124 class QKernel : public QFrame
129 QMultiLineEdit *desktop;
131 QPopupMenu *p,*p1,*p2;
133 int NodeNumber,ConType;
139 virtual void resizeEvent( QResizeEvent *ev );
141 void WriteMessage(char* msg);
155 void UnlockConsole();
156 void MessageToNode();
159 void IntMessage(int);
160 void KillInterpreter();
167 virtual void closeEvent ( QCloseEvent * e );
170 QList<InterpEntry> Interpreters;
171 QList<ConnectEntry> ConnectList;
172 QListBox *connections;
173 int Tasks; // number of working interpreters
174 int ActiveConnections; // number of connected VLPs
175 bool LOCKED,synchro,wait_for_info;
177 int lockid,unlockid,qid,cwid,
178 optid,prid,mid,msgid,toolsid,hid;
181 QSocketNotifier *Net_Notify;
186 void LoadConfig(char *);
187 void RunGraphModule(char*);
189 InterpEntry *findINTbySocket(int);
190 InterpEntry *findINTbyID(int);
191 InterpEntry *RunIntModule(char *ss,int r);
192 void RemoteInstance(InterpEntry*,int);
193 void CloseInstances(InterpEntry*);
197 /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
199 void QKernel::closeEvent ( QCloseEvent * e ) {
205 QFont f("Helvetica",10,QFont::Bold);
206 QFont f1("Helvetica",10,QFont::Normal);
207 QFont f2("Times Roman",10,QFont::Normal);
213 sprintf(ss,"mkdir %s",REMOTE_PATH);
220 setCaption("Virtual LOGLAN Processor");
221 setBackgroundColor(white);
223 bar = new QMenuBar(this);
225 p = new QPopupMenu();
227 p->insertItem("Execute",this,SLOT(Run_Prog()));
228 p->insertItem("Kill",this,SLOT(KillInterpreter()));
229 prid = bar->insertItem("&Program",p);
230 p1 = new QPopupMenu();
231 p1->insertItem("Message",this,SLOT(MessageToNode()));
232 p1->insertSeparator();
233 p1->insertItem("Connect",this,SLOT(Connect()));
234 p1->insertItem("Disconnect",this,SLOT(Disconnect()));
235 p1->insertItem("Info",this,SLOT(Info()));
237 mid = bar->insertItem("&Machine",p1);
239 p2 = new QPopupMenu();
240 cwid = p2->insertItem("Editor",this,SLOT(Edit()));
241 hid = p2->insertItem("Help",this,SLOT(Help()));
242 p2->insertSeparator();
243 optid = p2->insertItem("Options",this,SLOT(SetOptions()));
244 msgid = p2->insertItem("Info messages",this,SLOT(SetMessages()));
245 p2->setItemChecked(msgid,TRUE);
246 p2->insertSeparator();
247 lockid = p2->insertItem("Lock console",this,SLOT(LockConsole()));
248 unlockid = p2->insertItem("Unlock console",this,SLOT(UnlockConsole()));
249 p2->setItemEnabled(unlockid,FALSE);
252 toolsid = bar->insertItem("&Tools",p2);
254 qid = bar->insertItem("&Quit",this,SLOT(QuitProc()));
257 desktop = new QMultiLineEdit(this,"desktop");
258 desktop->setAutoUpdate(TRUE);
259 desktop->setReadOnly(TRUE);
260 desktop->setFont(f1);
265 ActiveConnections = 0;
266 strcpy(LockPasswd,"");
267 LoadConfig("vlp.cfg");
270 Net_Notify = new QSocketNotifier(net_sock,QSocketNotifier::Read,this);
271 connect(Net_Notify,SIGNAL(activated(int)),this,SLOT(NetMessage()));
276 void QKernel::resizeEvent( QResizeEvent *ev )
278 QFrame::resizeEvent(ev);
280 desktop->setGeometry( 0,bar->height(), width(), height() - bar->height() );
286 void QKernel::n_impl()
288 QMessageBox::information(this,"Function info","This function is not implemented yet...","Ok");
292 /* ########### load configuration from file ############# */
294 void QKernel::LoadConfig(char * fname)
299 /* Hack for checking if file exists without using external libs.*/
300 FILE * file = fopen(fname, "r");
302 fprintf(stderr, "Error: Cannot load configuration file %s!\n", fname);
305 /* File exists, so file has been locked. Release it. */
309 /* Read the file. If there is an error, report it and exit. */
310 if(!config_read(&cfg, file))
312 fprintf(stderr, "%s! In file %s, line %d\n",
313 config_error_text(&cfg),
314 config_error_file(&cfg),
315 config_error_line(&cfg));
316 config_destroy(&cfg);
318 exit(3);/* from original code. */
321 if(!config_lookup_int(&cfg, "node_number", &NodeNumber))
323 fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
327 config_destroy(&cfg);
332 if(config_lookup_string(&cfg, "type", &str)){
333 ConType = (strcmp(str, "explicit") == 0) ? 1 : 2;
336 fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
343 if(config_lookup_string(&cfg, "host", &str)) {
344 ConnectList.append(new ConnectEntry((char*)str));
347 fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
353 if(config_lookup_string(&cfg, "progdir", &str)){
354 strncpy(progdir, str, 256);
357 fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
363 if(config_lookup_string(&cfg, "homedir", &str)){
364 strncpy(HomeDir, str, 255);
367 fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
373 config_destroy(&cfg);
376 /* +++++++++++++++++++++++++++++++++++++++++++++++ */
379 void QKernel::Run_Prog()
382 QString s(QFileDialog::getOpenFileName(progdir,"*.log",this));
386 if (i>0) s.remove(i,4);
387 RunIntModule((char*)s.ascii(),0);
395 sprintf(cmd,"%s/modules/logedit %s %s %s %s %s %s &",HomeDir,HomeDir,
396 myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
403 sprintf(cmd,"%s/modules/loghelp %s/doc %s %s %s %s %s &",HomeDir,HomeDir,
404 myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
409 void QKernel::RunGraphModule(char *sk)
414 sprintf(cmd,"%s/modules/loggraph %s %s %s %s %s %s",HomeDir,sk,
415 myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
419 WriteMessage("Cannot connect GRAPH resources");
425 void QKernel::RunNetModule()
427 struct sockaddr_un svr;
433 sprintf(cmd,"%s/modules/lognet %s %s %s %s %s %s",HomeDir,NPATH,
434 myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
437 /* -------- socket for NET module -------- */
439 sock = socket(AF_UNIX,SOCK_STREAM,0);
440 bzero(&svr,sizeof(svr));
441 svr.sun_family = AF_UNIX;
442 strcpy(svr.sun_path,NPATH);
443 len = strlen(svr.sun_path)+sizeof(svr.sun_family);
444 bind(sock,(struct sockaddr*)&svr, len);
447 if ( system(cmd) == 0)
449 net_sock = accept(sock,(struct sockaddr*)0,(unsigned int*)0);
453 WriteMessage("NETWORK successfully connected");
454 fcntl(net_sock,F_SETFL, O_NONBLOCK|fcntl(net_sock,F_GETFL,0));
456 setsockopt(net_sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
460 WriteMessage("Cannot connect NETWORK resources");
461 WriteMessage("Exiting...");
468 WriteMessage("Cannot connect NETWORK resources");
469 WriteMessage("Exiting...");
477 void QKernel::Connect()
479 QDialog d(this,"",TRUE);
480 QLabel lab(&d,"IP Address:");
482 QPushButton ob(&d,""),cb(&d,"");
485 d.setFont(QFont("Helvetica",12,QFont::Bold));
486 ob.setGeometry( 30, 60, 80, 30 );
489 lab.setGeometry( 10, 10, 60, 30 );
490 lab.setText( "Address" );
491 ed.setGeometry( 70, 10, 140, 30 );
492 cb.setGeometry( 130, 60, 80, 30 );
493 cb.setText( "Cancel" );
494 d.resize( 240, 100 );
496 connect(&ob,SIGNAL(clicked()),&d,SLOT(accept()));
497 connect(&cb,SIGNAL(clicked()),&d,SLOT(reject()));
500 m.msg_type = MSG_NET;
501 m.param.pword[0] = NET_CONNECT_TO;
502 strcpy(m.param.pstr,ed.text());
503 write(net_sock,&m,sizeof(MESSAGE));
508 void QKernel::Disconnect()
512 if (info_messages) WriteMessage("Disconnecting from virtual machine");
513 msg.msg_type = MSG_NET;
514 msg.param.pword[0] = NET_DISCONNECT;
515 write(net_sock,&msg,sizeof(MESSAGE));
518 void QKernel::QuitProc()
522 if ( QMessageBox::question(this,"Close VLP","Terminate VLP ?",QMessageBox::Yes,QMessageBox::No,0) == QMessageBox::No ) return;
526 msg.msg_type = MSG_NET;
527 msg.param.pword[0] = NET_DISCONNECT;
528 write(net_sock,&msg,sizeof(MESSAGE));*/
533 msg.msg_type = MSG_NET;
534 msg.param.pword[0] = NET_EXIT;
535 write(net_sock,&msg,sizeof(MESSAGE));
536 // ::close(net_sock);
545 void QKernel::AddAddress()
547 QDialog d(this,"",TRUE);
548 QLabel lab(&d,"IP Address:");
550 QPushButton ob(&d,""),cb(&d,"");
554 ob.setGeometry( 30, 60, 80, 30 );
557 lab.setGeometry( 10, 10, 60, 30 );
558 lab.setText( "Address" );
559 ed.setGeometry( 70, 10, 140, 30 );
560 cb.setGeometry( 130, 60, 80, 30 );
561 cb.setText( "Cancel" );
562 d.resize( 240, 100 );
563 connect(&ob,SIGNAL(clicked()),&d,SLOT(accept()));
564 connect(&cb,SIGNAL(clicked()),&d,SLOT(reject()));
566 if (strcmp(ed.text(),"")!=0)
568 connections->insertItem(ed.text());
573 void QKernel::DelAddress()
577 if (connections->currentItem()!=-1)
578 connections->removeItem(connections->currentItem());
584 void QKernel::MessageToNode()
591 dlg = new QDialog(this,"Message",TRUE);
593 nodenr = new QLineEdit(dlg,"number");
594 nodenr->setGeometry( 90, 10, 50, 30 );
598 tmpQLabel = new QLabel( dlg, "Label_1" );
599 tmpQLabel->setGeometry( 10, 10, 77, 30 );
600 tmpQLabel->setText( "Node number:" );
602 tmpQLabel = new QLabel( dlg, "Label_2" );
603 tmpQLabel->setGeometry( 10, 50, 70, 30 );
604 tmpQLabel->setText( "Message:" );
607 msg = new QLineEdit( dlg, "LineEdit_1" );
608 msg->setGeometry( 80, 60, 330, 30 );
612 ob = new QPushButton( dlg, "PushButton_1" );
613 ob->setGeometry( 230, 10, 80, 30 );
614 ob->setText( "Send" );
615 ob->setDefault(TRUE);
616 cb = new QPushButton( dlg, "PushButton_2" );
617 cb->setGeometry( 330, 10, 80, 30 );
618 cb->setText( "Cancel" );
619 dlg->resize( 430, 110 );
620 connect(ob,SIGNAL(clicked()),dlg,SLOT(accept()));
621 connect(cb,SIGNAL(clicked()),dlg,SLOT(reject()));
622 dlg->setCaption("Send message to node");
626 m.msg_type = MSG_NET;
627 m.param.pword[0] = NET_PROPAGATE;
628 m.param.pword[1] = MSG_VLP;
629 m.param.pword[2] = NodeNumber;
630 m.param.pword[4] = atoi(nodenr->text());
631 m.param.pword[6] = VLP_WRITE;
632 strcpy(m.param.pstr,msg->text());
633 write(net_sock,&m,sizeof(MESSAGE));
637 void QKernel::KillInterpreter()
644 dlg = new QDialog(this,"Message",TRUE);
646 nodenr = new QLineEdit(dlg,"number");
647 nodenr->setGeometry( 90, 10, 50, 30 );
651 tmpQLabel = new QLabel( dlg, "Label_1" );
652 tmpQLabel->setGeometry( 10, 10, 77, 30 );
653 tmpQLabel->setText( "Interp. ID:" );
655 ob = new QPushButton( dlg, "PushButton_1" );
656 ob->setGeometry( 160, 10, 80, 30 );
657 ob->setText( "Kill" );
658 ob->setDefault(TRUE);
659 cb = new QPushButton( dlg, "PushButton_2" );
660 cb->setGeometry( 260, 10, 80, 30 );
661 cb->setText( "Cancel" );
662 dlg->resize( 360, 50 );
663 connect(ob,SIGNAL(clicked()),dlg,SLOT(accept()));
664 connect(cb,SIGNAL(clicked()),dlg,SLOT(reject()));
665 dlg->setCaption("Kill interpreter");
669 m.msg_type = MSG_INT;
670 m.param.pword[0] = INT_KILL;
671 pom = findINTbyID(atoi(nodenr->text()));
675 write(pom->sock,&m,sizeof(MESSAGE));
676 else WriteMessage("This is a remote instance of a program!");
678 else WriteMessage("Interpreter not found");
686 void QKernel::NetMessage()
693 cnt = read(net_sock,&msg,sizeof(MESSAGE));
694 if ( (cnt>0) && (msg.msg_type==MSG_NET))
696 switch(msg.param.pword[0])
698 case NET_CSWRITELN: WriteMessage(msg.param.pstr);break;
700 switch(msg.param.pword[1])
703 /* pom = find_link_by_ID(msg.param.pword[5]);
704 msg.msg_type = MSG_NET;
705 msg.param.pword[0] = NET_PROPAGATE;
706 send_int(pom,&msg);*/
709 switch(msg.param.pword[6])
712 QApplication::beep();
713 WriteMessage(CharLine);
714 WriteMessage("### Incoming Messsage ###");
715 sprintf(ss,"Mesg from Node %d: %s",msg.param.pword[2],msg.param.pstr);
717 WriteMessage(CharLine);
719 case VLP_REMOTE_INSTANCE:
720 sprintf(ss,"%s/%s",REMOTE_PATH,msg.param.pstr);
723 WriteMessage("Running program:");
726 pom = RunIntModule(ss,1);
729 pom->p_ctx.node = msg.param.pword[2];
730 pom->p_ctx.program_id = msg.param.pword[7];
731 pom->RInstances[msg.param.pword[2]] = msg.param.pword[7];
734 case VLP_CLOSE_INSTANCE:
735 msg.msg_type = MSG_INT;
736 msg.param.pword[0] = INT_CLOSE_INSTANCE;
737 pom = findINTbyID(msg.param.pword[7]);
740 write(pom->sock,&msg,sizeof(MESSAGE));
742 m1.msg_type = MSG_VLP;
743 m1.param.pword[0] = VLP_INTERPRETER_DOWN;
744 m1.param.pword[1] = pom->ID;
745 write(net_sock,&m1,sizeof(MESSAGE));
746 } else WriteMessage("Instance not found");
752 case NET_CONNECTIONS: ActiveConnections = msg.param.pword[1];
753 WriteMessage(msg.param.pstr);
754 if (!synchro) synchro=TRUE;
759 QString poms,poms1,poms2;
760 poms.sprintf("%s",msg.param.pstr);
761 while (poms.length()>0)
765 { poms1=poms.left(cnt);
766 poms=poms.right(poms.length()-cnt-1);
770 poms2=poms1.left(cnt);
771 poms1=poms1.right(poms1.length()-cnt-1);
772 sprintf(ss,"Node: %s Addr: %s",poms2.data(),poms1.data());
779 case NET_INFO_END:wait_for_info=FALSE;
780 WriteMessage(CharLine);
790 void QKernel::IntMessage(int sock)
796 cnt = read(sock,&msg,sizeof(MESSAGE));
797 e = findINTbySocket(sock);
798 if ( (cnt>0) && (e!=NULL))
800 switch (msg.msg_type)
803 if (msg.param.pword[0]==GRAPH_ALLOCATE)
805 RunGraphModule(msg.param.pstr);
809 write(net_sock,&msg,sizeof(MESSAGE));break;
811 switch(msg.param.pword[0])
813 case VLP_REMOTE_INSTANCE_PLEASE:
814 RemoteInstance(e,msg.param.pword[2]);
819 switch(msg.param.pword[0]){
825 m.msg_type = MSG_VLP;
826 m.param.pword[0] = VLP_INTERPRETER_DOWN;
827 m.param.pword[1] = e->ID;
828 write(net_sock,&m,sizeof(MESSAGE));
829 if (e->remote==0) CloseInstances(e);
832 Interpreters.remove(e);
836 sprintf(ss,"%s : End of program execution",msg.param.pstr);
842 msg.msg_type = MSG_INT;
843 msg.param.pword[0] = INT_CTX;
844 msg.param.pword[1] = NodeNumber;
845 msg.param.pword[2] = e->ID;
848 msg.param.pword[3] = e->p_ctx.node;
849 msg.param.pword[4] = e->p_ctx.program_id;
851 write(sock,&msg,sizeof(MESSAGE));
853 };break; /* switch param.pword[0] */
859 void QKernel::WriteMessage(char *msg)
863 desktop->getCursorPosition(&x,&y);
864 if (x>100) desktop->clear();
865 desktop->setReadOnly(FALSE);
866 desktop->append(msg);
867 desktop->setReadOnly(TRUE);
868 desktop->setCursorPosition(desktop->numLines(),1);
870 if (desktop->numLines()>100) desktop->clear();
873 void QKernel::SetMessages()
878 if ( p2->isItemChecked(msgid))
880 p2->setItemChecked(msgid,FALSE);
885 p2->setItemChecked(msgid,TRUE);
892 void QKernel::SetOptions()
894 QDialog dlg(this,"Options",TRUE);
902 progs = new QLineEdit( &dlg, "progs" );
903 progs->setGeometry( 150, 20, 180, 30 );
904 progs->setText(progdir);
907 tmpQLabel = new QLabel( &dlg, "Label_1" );
908 tmpQLabel->setGeometry( 30, 20, 120, 30 );
909 tmpQLabel->setText( "Programs directory" );
912 tmpQFrame = new QFrame( &dlg, "Frame_2" );
913 tmpQFrame->setGeometry( 10, 60, 380, 30 );
914 tmpQFrame->setFrameStyle( 52 );
916 tmpQLabel = new QLabel( &dlg, "Label_2" );
917 tmpQLabel->setGeometry( 10, 80, 340, 30 );
918 tmpQLabel->setText( "Virtual Processor properties (activated after restarting VLP):" );
922 nn = new QLineEdit( &dlg, "LineEdit_2" );
923 nn->setGeometry( 110, 110, 40, 30 );
924 sprintf(nns,"%d",NodeNumber);
927 tmpQLabel = new QLabel( &dlg, "Label_3" );
928 tmpQLabel->setGeometry( 20, 110, 90, 30 );
929 tmpQLabel->setText( "Node number:" );
931 QRadioButton *exp,*reg;
932 exp = new QRadioButton( &dlg, "RadioButton_3" );
933 exp->setGeometry( 30, 170, 100, 30 );
934 exp->setText( "Explicit" );
935 exp->setChecked( TRUE );
937 reg = new QRadioButton( &dlg, "RadioButton_4" );
938 reg->setGeometry( 30, 200, 100, 30 );
939 reg->setText( "Registration" );
940 reg->setEnabled(FALSE);
942 connections = new QListBox( &dlg, "ListBox_1" );
943 connections->setGeometry( 170, 140, 130, 100 );
944 e = ConnectList.first();
947 connections->insertItem(e->addr);
948 e = ConnectList.next();
951 tmpQLabel = new QLabel( &dlg, "Label_5" );
952 tmpQLabel->setGeometry( 170, 110, 100, 30 );
953 tmpQLabel->setText( "Connection list:" );
955 QPushButton* addbtn,*delbtn,*okbtn,*cancelbtn;
956 addbtn = new QPushButton( &dlg, "PushButton_1" );
957 addbtn->setGeometry( 310, 150, 60, 30 );
958 addbtn->setText( "Add" );
959 delbtn = new QPushButton( &dlg, "PushButton_2" );
960 delbtn->setGeometry( 310, 200, 60, 30 );
961 delbtn->setText( "Del" );
962 connect(addbtn,SIGNAL(clicked()),this,SLOT(AddAddress()));
963 connect(delbtn,SIGNAL(clicked()),this,SLOT(DelAddress()));
964 okbtn = new QPushButton( &dlg, "PushButton_3" );
965 okbtn->setGeometry( 80, 260, 100, 30 );
966 okbtn->setText( "Ok" );
967 okbtn->setDefault(TRUE);
968 cancelbtn = new QPushButton( &dlg, "PushButton_4" );
969 cancelbtn->setGeometry( 210, 260, 100, 30 );
970 cancelbtn->setText( "Cancel" );
971 connect(okbtn,SIGNAL(clicked()),&dlg,SLOT(accept()));
972 connect(cancelbtn,SIGNAL(clicked()),&dlg,SLOT(reject()));
974 group = new QButtonGroup( &dlg, "ButtonGroup_1" );
975 group->setGeometry( 20, 150, 120, 90 );
976 group->setTitle( "Connection type" );
977 group->setAlignment( 1 );
979 group->insert(exp,1);
980 group->insert(reg,2);
982 dlg.resize( 400, 310 );
986 vlp_file = new QFile("vlp.cfg");
987 vlp_file->open(IO_WriteOnly);
988 sprintf(line,"progdir=%s\n",progs->text().ascii());
989 vlp_file->writeBlock(line,strlen(line));
990 strcpy(progdir,progs->text());
991 sprintf(line,"node_number=%d\n",atoi(nn->text()));
992 vlp_file->writeBlock(line,strlen(line));
993 if ( exp->isChecked())
995 sprintf(line,"type=explicit\n");
996 vlp_file->writeBlock(line,strlen(line));
997 for(i=0;i<connections->count();i++)
999 sprintf(line,"host=%s\n",connections->text(i).ascii());
1000 vlp_file->writeBlock(line,strlen(line));
1006 sprintf(line,"type=register\n");
1007 vlp_file->writeBlock(line,strlen(line));
1014 void QKernel::LockConsole()
1016 QDialog d(this,"Enter password",TRUE);
1017 QLabel lab(&d,"Password");
1018 QLineEdit ed(&d,"");
1019 QPushButton ob(&d,""),cb(&d,"");
1021 d.setCaption("Lock console");
1022 ob.setGeometry( 30, 60, 80, 30 );
1024 ob.setDefault(TRUE);
1025 lab.setGeometry( 10, 10, 60, 30 );
1026 lab.setText( "Password:" );
1027 ed.setGeometry( 70, 10, 140, 30 );
1028 ed.setEchoMode(QLineEdit::Password);
1029 cb.setGeometry( 130, 60, 80, 30 );
1030 cb.setText( "Cancel" );
1031 d.resize( 240, 100 );
1032 connect(&ob,SIGNAL(clicked()),&d,SLOT(accept()));
1033 connect(&cb,SIGNAL(clicked()),&d,SLOT(reject()));
1036 if (strcmp(ed.text(),"")!=0)
1038 strcpy(LockPasswd,ed.text());
1039 lab.setText("Retype:");
1043 if (strcmp(ed.text(),LockPasswd)==0)
1045 bar->setItemEnabled(qid,FALSE);
1046 bar->setItemEnabled(prid,FALSE);
1047 bar->setItemEnabled(mid,FALSE);
1048 p2->setItemEnabled(unlockid,TRUE);
1049 p2->setItemEnabled(lockid,FALSE);
1050 p2->setItemEnabled(cwid,FALSE);
1051 p2->setItemEnabled(optid,FALSE);
1053 WriteMessage("CONSOLE LOCKED");
1058 QMessageBox msg(this);
1059 msg.setText("Not matching!");
1060 msg.setButtonText(0,"Close");
1065 else strcpy(LockPasswd,"");
1069 void QKernel::UnlockConsole()
1071 QDialog d(this,"Enter password",TRUE);
1072 QLabel lab(&d,"Password");
1073 QLineEdit ed(&d,"");
1074 QPushButton ob(&d,""),cb(&d,"");
1076 ob.setGeometry( 30, 60, 80, 30 );
1078 ob.setDefault(TRUE);
1079 lab.setGeometry( 10, 10, 60, 30 );
1080 lab.setText( "Password:" );
1081 ed.setGeometry( 70, 10, 140, 30 );
1082 ed.setEchoMode(QLineEdit::Password);
1083 cb.setGeometry( 130, 60, 80, 30 );
1084 cb.setText( "Cancel" );
1085 d.resize( 240, 100 );
1086 connect(&ob,SIGNAL(clicked()),&d,SLOT(accept()));
1087 connect(&cb,SIGNAL(clicked()),&d,SLOT(reject()));
1091 if (strcmp(ed.text(),LockPasswd)==0)
1093 bar->setItemEnabled(qid,TRUE);
1094 bar->setItemEnabled(prid,TRUE);
1095 bar->setItemEnabled(mid,TRUE);
1096 p2->setItemEnabled(unlockid,FALSE);
1097 p2->setItemEnabled(lockid,TRUE);
1098 p2->setItemEnabled(cwid,TRUE);
1099 p2->setItemEnabled(optid,TRUE);
1101 WriteMessage("CONSOLE UNLOCKED");
1106 QMessageBox msg(this);
1107 msg.setText("Wrong password!");
1108 msg.setButtonText(0,"Close");
1115 void QKernel::InitMessage()
1117 WriteMessage("\n Virtual LOGLAN Processor - ver 1.9: READY \n");
1122 InterpEntry *QKernel::findINTbySocket(int _id)
1125 pom = Interpreters.first();
1128 if (pom->sock == _id) break;
1129 pom = Interpreters.next();
1134 InterpEntry *QKernel::findINTbyID(int _id)
1137 pom = Interpreters.first();
1140 if (pom->ID == _id) break;
1141 pom = Interpreters.next();
1147 /* ------------------ Connect INT module -----------------*/
1149 InterpEntry *QKernel::RunIntModule(char *ss, int r)
1152 struct sockaddr_un svr;
1158 InterpEntry *newINT;
1167 if (cf == NULL) {WriteMessage("File not found: no .ccd file");return(NULL);}
1173 if (cf == NULL) {WriteMessage("File not found: no .pcd file");return(NULL);}
1176 newINT = new InterpEntry;
1177 for(i=0;i<MAXINSTANCES;i++) newINT->RInstances[i]=-1;
1179 strcpy(b,rindex(ss,'/'));
1180 for(i=0;i<strlen(b);i++)
1184 sprintf(a,"%s : Start execution",b);
1188 newint = freeINTid; freeINTid++;
1189 newINT->ID = newint;
1190 strcpy(newINT->shortname,b);
1191 strcpy(newINT->fullname,ss);
1193 sprintf(a,"%s%d",IPATH,newint);
1194 sprintf(cmd,"%s/modules/logint %s %s",HomeDir,a,ss);
1195 if (r) strcat(cmd," r");
1196 sprintf(b," %s %s %s %s %s",myargs[0],myargs[1],myargs[2],myargs[3],myargs[4]);
1201 sock = socket(AF_UNIX,SOCK_STREAM,0);
1203 bzero(&svr, sizeof(svr));
1204 svr.sun_family = AF_UNIX;
1205 strcpy(svr.sun_path,a);
1206 len = strlen(svr.sun_path)+sizeof(svr.sun_family);
1207 bind(sock,(struct sockaddr*)&svr, len);
1210 newINT->sock = accept(sock,(struct sockaddr*)0,(unsigned int *)0);
1217 fcntl(newINT->sock,F_SETFL,
1218 O_NONBLOCK|fcntl(newINT->sock,F_GETFL,0));
1220 setsockopt(newINT->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
1221 if (r) newINT->remote = 1;else newINT->remote=0;
1223 bzero(&msg,sizeof(MESSAGE));
1224 msg.msg_type = MSG_VLP;
1225 msg.param.pword[0] = VLP_REGINT;
1226 msg.param.pword[1] = newINT->ID;
1227 sprintf(msg.param.pstr,"logi%d.net",newint);
1228 write(net_sock,&msg,sizeof(MESSAGE));
1230 Interpreters.append(newINT);
1231 newINT->notify = new QSocketNotifier(newINT->sock,QSocketNotifier::Read);
1232 connect(newINT->notify,SIGNAL(activated(int)),this,SLOT(IntMessage(int)));
1233 if (info_messages) WriteMessage("INTERPRETER successfully connected");
1236 else WriteMessage("Cannot connect interpreter");
1242 /* ---------------------------------------------------------*/
1243 /* Allocate remote instance */
1245 void QKernel::RemoteInstance(InterpEntry *interp, int on)
1251 m.msg_type = MSG_NET;
1252 m.param.pword[0] = NET_NODE_EXIST;
1253 m.param.pword[1] = on;
1254 m.param.pword[2] = interp->ID;
1255 write(net_sock,&m,sizeof(MESSAGE));
1256 bzero(&m,sizeof(MESSAGE));
1257 while( (m.msg_type!=MSG_NET) && (m.param.pword[0]!=NET_NODE_EXIST) )
1258 read(net_sock,&m,sizeof(MESSAGE));
1260 if (m.param.pword[1]==1) /* means node exists */
1262 m.msg_type = MSG_NET;
1263 m.param.pword[0] = NET_TRANSMIT_CODE;
1264 m.param.pword[1] = interp->ID;
1265 m.param.pword[2] = on;
1266 strcpy(m.param.pstr,interp->fullname);
1267 write(net_sock,&m,sizeof(MESSAGE));
1269 Net_Notify->setEnabled(FALSE);
1270 while ( (m.msg_type != MSG_NET) || (m.param.pword[0]!=NET_TRANSMITTED) )
1271 read(net_sock,&m,sizeof(MESSAGE));
1274 m.msg_type = MSG_NET;
1275 m.param.pword[0] = NET_PROPAGATE;
1276 m.param.pword[1] = MSG_VLP;
1277 m.param.pword[2] = NodeNumber;
1278 m.param.pword[3] = 0;
1279 m.param.pword[4] = on;
1280 m.param.pword[5] = 0;
1281 m.param.pword[6] = VLP_REMOTE_INSTANCE;
1282 m.param.pword[7] = interp->ID;
1283 strcpy(m.param.pstr,interp->shortname);
1284 write(net_sock,&m,sizeof(MESSAGE));
1286 read(net_sock,&m,sizeof(MESSAGE));
1289 if ( (m.param.pword[0]==NET_PROPAGATE) && (m.param.pword[6] == VLP_REMOTE_INSTANCE_OK))
1291 interp->RInstances[on] = m.param.pword[7];
1294 read(net_sock,&m,sizeof(MESSAGE));
1297 Net_Notify->setEnabled(TRUE);
1299 /*bzero(&m,sizeof(MESSAGE));*/
1300 m.msg_type = MSG_VLP;
1301 m.param.pword[0] = VLP_REMOTE_INSTANCE_HERE;
1302 m.param.pword[1] = interp->RInstances[on];
1303 write(interp->sock,&m,sizeof(MESSAGE));
1305 else /* There is no such a node! */
1307 sprintf(s,"Warning: Node number %d not found!",on);
1309 WriteMessage("Allocating O-process on the local node");
1310 bzero(&m,sizeof(MESSAGE));
1311 m.msg_type = MSG_VLP;
1312 m.param.pword[0] = VLP_REMOTE_INSTANCE_HERE;
1313 m.param.pword[1] = interp->ID;
1314 write(interp->sock,&m,sizeof(MESSAGE));
1319 /*-----------------------------------------------*/
1320 /* Close all remote instances */
1322 void QKernel::CloseInstances(InterpEntry *e)
1327 if (info_messages) WriteMessage("Closing remote instances");
1328 for(i=0;i<MAXINSTANCES;i++)
1329 if (e->RInstances[i]>=0)
1331 msg.msg_type = MSG_NET;
1332 msg.param.pword[0] = NET_PROPAGATE;
1333 msg.param.pword[1] = MSG_VLP;
1334 msg.param.pword[2] = NodeNumber;
1335 msg.param.pword[4] = i;
1336 msg.param.pword[6] = VLP_CLOSE_INSTANCE;
1337 msg.param.pword[7] = e->RInstances[i];
1338 write(net_sock,&msg,sizeof(MESSAGE));
1343 void QKernel::Info()
1347 WriteMessage(CharLine);
1348 WriteMessage("### Virtual Machine Information ###");
1349 m.msg_type = MSG_NET;
1350 m.param.pword[0]=NET_GET_INFO;
1351 write(net_sock,&m,sizeof(MESSAGE));
1352 wait_for_info = TRUE;
1355 #include "kernel.moc"
1357 int main( int argc, char **argv )
1360 for(i=0;i<5;i++) strcpy(myargs[i],"");
1361 for(i=1;i<argc;i++) strcpy(myargs[i-1],argv[i]);
1363 app = new QApplication(argc,argv);
1364 app->setStyle(new QWindowsStyle());
1366 app->setMainWidget( &draw);