#include <sys/stat.h>
#include <string.h>
#include <qlist.h>
+#include <qfile.h>
+#include <qstring.h>
+#include <qstringlist.h>
#include <unistd.h>
#define REMOTE_PATH "REMOTE"
void check_links();
void get_message(NETlink*);
void conn_info(int);
+
+ void doitall(); // 2010
};
void NETMOD::load_config(char *fname)
{
- FILE *f;
- char line1[80],*line2;
- int k=0,on;
+ QFile f(fname);
+ QString line;
+ QString val;
+ int br=0,on,k=0;
NETlink *pomlink;
- f = fopen(fname,"r");
- if (f!=NULL)
+ if (!f.exists())
{
- while (!feof(f))
-{
- fscanf(f,"%s\n",line1);
- line2 = strtok(line1,"=");
- if (line2==NULL) { write_at_console("Bad config file\n");exit(1);}
-
- if (strcmp(line2,"node_number")==0)
- {
- line2 = strtok(NULL,"=");
- MyNode = atoi(line2);
- }
- else
- if (strcmp(line2,"host")==0)
- {
- line2 = strtok(NULL,"=");if (line2==NULL) {exit(1);}
- k++;
+ write_at_console("Cannot load configuration file!");sleep(2);exit(3);
+ }
+ f.open(IO_ReadOnly);
+ br = f.readLine(line,256);
+ while (br>0)
+ {
+ QStringList l = QStringList::split("=",line,FALSE);
+ QStringList::Iterator it = l.begin();
+ line = *it;
+ ++it;
+ val = *it;
+ val = val.stripWhiteSpace();
+ if (line == "node_number") {MyNode = val.toInt();};
+ if (line == "host" ) {
+ k++;
pomlink = new NETlink;
- strcpy(pomlink->addr,line2);
+ strcpy(pomlink->addr,val.ascii());
pomlink->connected = FALSE;
pomlink->sock = socket(AF_INET, SOCK_STREAM, 0);
- fcntl(pomlink->sock, F_SETFL,O_NONBLOCK | fcntl(pomlink->sock,
- F_GETFL,0));
+ fcntl(pomlink->sock, F_SETFL,O_NONBLOCK | fcntl(pomlink->sock,F_GETFL,0));
on=1;
setsockopt(pomlink->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
Links.append(pomlink);
- to_connect++;
-
- }
- else
- if (strcmp(line2,"type")==0)
- {
- }
-
- } /* feof */
-
- fclose(f);
- if (k==0) all_connected=TRUE;
+ to_connect++;
+ };
+ br = f.readLine(line,256);
}
- if (MyNode==-1) {write_at_console("Node number must be specified");exit(1);};
+ f.close();
+ if (k==0) all_connected=TRUE;
+ if (MyNode==-1) {write_at_console("Node number must be specified");exit(1);};
}
{
if ( pomlink->node_number==n )
{
- m.param.pword[1] = 1;break;
+ m.param.pword[1] = 1;
+ strcpy(m.param.pstr,pomlink->addr);
+ break;
}
pomlink = Links.next();
}
switch(msg.param.pword[0])
{
case NET_CCD_START:
+
lnk->code_transmit = TRUE;
sprintf(pomstr,"%s/%s",REMOTE_PATH,msg.param.pstr);
strcat(pomstr,".ccd");
close(psock);
fclose(lnk->CodeFile);
}
+
break;
case NET_PCD_START:
+
lnk->code_transmit = TRUE;
sprintf(pomstr,"%s/%s",REMOTE_PATH,msg.param.pstr);
strcat(pomstr,".pcd");
close(psock);
fclose(lnk->CodeFile);
}
+
break;
case NET_CONNECT:
+
sprintf(pomstr,"Node: %d Addr: %s",msg.param.pword[1],
lnk->addr);
lnk->node_number = msg.param.pword[1];
send_accept_info(lnk);
break;
case NET_ACCEPT:
+
sprintf(pomstr,"Node: %d Addr: %s",msg.param.pword[1],
lnk->addr);
lnk->node_number = msg.param.pword[1];
write_at_console(pomstr);
break;
case NET_DISCONNECT:
+
sprintf(pomstr,"Node: %d disconnected",msg.param.pword[1]);
write_at_console(pomstr);
::close(lnk->sock);
delete(lnk);
break;
case NET_PROPAGATE:
+
if (msg.param.pword[1] == MSG_VLP) send_to_kernel(&msg);
else if (msg.param.pword[1] == MSG_INT) send_to_int(&msg);
break;
}
+
+/****************************** 2010 ********************************************/
+void NETMOD::doitall() {
+ unsigned int sz;
+ int nsock,max=0,on, nr, si, sj;
+ struct sockaddr_in svr;
+ fd_set rset;
+ NETlink *pomlink;
+ INTlink *pomlink2;
+ struct sockaddr_un svr2;
+ MESSAGE msg;
+
+
+ FD_ZERO(&rset);
+ FD_SET(listen_sock,&rset);
+ max = listen_sock;
+ FD_SET(kernel_sock,&rset);
+ if (max<kernel_sock) { max=kernel_sock;}
+ pomlink2 = Interpreters.first();
+ while (pomlink2!=NULL)
+ {
+ FD_SET(pomlink2->sock,&rset);
+ if (max<pomlink2->sock) max=pomlink2->sock;
+ pomlink2=Interpreters.next();
+ }
+ pomlink = Links.first();
+ while (pomlink!=NULL)
+ {
+ if (pomlink->connected)
+ {
+ FD_SET(pomlink->sock,&rset);
+ if (max<pomlink->sock) max=pomlink->sock;
+ }
+ pomlink=Links.next();
+ }
+
+ // odczyt
+ if (select(max+1,&rset,0,0,NULL) > 0) {
+ // accept connection
+ if (FD_ISSET(listen_sock,&rset))
+ {
+ /* accept connection on listen socket */
+ sz = sizeof(svr);
+ bzero(&svr, sizeof(svr));
+ nsock = accept(listen_sock, (struct sockaddr*)&svr, &sz);
+ if (nsock>0)
+ {
+ pomlink = new NETlink;
+ strcpy(pomlink->addr,inet_ntoa(svr.sin_addr));
+ pomlink->sock = nsock;
+ pomlink->connected = TRUE;
+ fcntl(pomlink->sock, F_SETFL,O_NONBLOCK | fcntl(pomlink->sock,F_GETFL,0));
+ on=1;
+ setsockopt(pomlink->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
+ Links.append(pomlink);
+ } /* nsock > 0 */
+ } /* ISSET */
+
+ // get internal message
+ /* Check request sockets */
+ pomlink2 = Interpreters.first();
+ while (pomlink2!=NULL)
+ {
+ if (FD_ISSET(pomlink2->sock,&rset))
+ {
+ nr = read(pomlink2->sock,&msg,sizeof(MESSAGE));
+ if (nr>0)
+ {
+ if (msg.msg_type == MSG_NET)
+ switch(msg.param.pword[0])
+ {
+ case NET_PROPAGATE:propagate_msg(&msg); break;
+ case NET_NODE_EXIST:check_node(msg.param.pword[1],pomlink2->sock);break;
+ case NET_GET_INFO: conn_info(pomlink2->sock);break;
+ case NET_NODES_NUM: msg.param.pword[0]=NET_NODES_NUM_RESPONSE;
+ msg.param.pword[1]=Links.count();
+ write(pomlink2->sock,&msg,sizeof(MESSAGE));
+ break;
+ }/* switch */
+ }
+ } /* ISSET */
+ pomlink2=Interpreters.next();
+ } // while
+ /* Check internal socket */
+ if (FD_ISSET(kernel_sock,&rset))
+ {
+ nr = read(kernel_sock, &msg, sizeof(MESSAGE));
+ if (nr>0)
+ {
+ if (msg.msg_type == MSG_NET)
+ {
+ switch(msg.param.pword[0])
+ {
+ case NET_TRANSMIT_CODE:
+
+ transmit_file(msg.param.pword[2],msg.param.pstr,msg.param.pword[1]);
+
+ break;
+ case NET_EXIT: { disconnect_seq();exit_sequence();}
+ break;
+ case NET_GET_INFO: conn_info(kernel_sock);break;
+ case NET_PROPAGATE:propagate_msg(&msg);break;
+ case NET_DISCONNECT:disconnect_seq();
+ break;
+ case NET_NODE_EXIST: check_node(msg.param.pword[1],kernel_sock);break;
+ case NET_CONNECT_TO: connect_seq(msg.param.pstr);
+ } /* end switch */
+ } /* MSG_NET */
+ if (msg.msg_type == MSG_VLP)
+ switch(msg.param.pword[0])
+ {
+ case VLP_REGINT:
+ {
+
+ pomlink2 = new INTlink;
+ pomlink2->sock = socket(AF_UNIX,SOCK_STREAM,0);
+ bzero(&svr2,sizeof(svr2));
+ svr2.sun_family = AF_UNIX;
+ strcpy(svr2.sun_path,msg.param.pstr);
+ si = strlen(svr2.sun_path)+sizeof(svr2.sun_family);
+ sj = connect(pomlink2->sock,(struct sockaddr*)&svr2,si);
+ if (sj==0)
+ fcntl(pomlink2->sock,F_SETFL, O_NONBLOCK|fcntl(pomlink2->sock,F_GETFL,0));
+ int on=1;
+ setsockopt(pomlink2->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
+ pomlink2->ID = msg.param.pword[1];
+ pomlink2->connected=TRUE;
+ Interpreters.append(pomlink2);
+
+ };break;
+ case VLP_INTERPRETER_DOWN:
+ {
+
+ pomlink2 = findINTlink(msg.param.pword[1]);
+ if (pomlink2!=NULL)
+ {
+ close(pomlink2->sock);
+ Interpreters.remove(pomlink2);
+ }
+ };break;
+ } /* MSg_VLP */
+ } // nr > 0
+ }/* ISSET */
+
+ // get remote message
+
+ pomlink=Links.first();
+ while (pomlink!=NULL)
+ {
+ if (FD_ISSET(pomlink->sock,&rset)) get_message(pomlink);
+ pomlink=Links.next();
+ }
+ } // select
+
+
+}
+/****************************** END 2010 ********************************************/
+
+
+
void NETMOD::propagate_msg(MESSAGE *msg)
{
char ss[255];
{
while(1)
{
- accept_connection();
+ /*accept_connection();
get_internal();
- remote_messages();
+ remote_messages(); */
+ // 2010
+ doitall();
}
}