Update to the newest upstream version.
[vlp.git] / net / lognet.cpp
index 2fd8348c350a65c88c051fad1288484ae5fea9f9..decd822abfb2ddcb652ccafe82a6509035e35f06 100644 (file)
@@ -17,6 +17,9 @@
 #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"
@@ -120,6 +123,8 @@ public:
  void check_links();
  void get_message(NETlink*);
  void conn_info(int);
+
+ void doitall(); // 2010
 };
 
 
@@ -178,53 +183,44 @@ NETMOD::NETMOD(char *kernel_name)
 
 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);};
 }
 
 
@@ -316,7 +312,9 @@ void NETMOD::check_node(int n, int sc)
  {
   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();
  }
@@ -465,6 +463,7 @@ if (lnk->connected)
         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");
@@ -491,9 +490,11 @@ if (lnk->connected)
                        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");
@@ -520,9 +521,11 @@ if (lnk->connected)
                        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];
@@ -530,12 +533,14 @@ if (lnk->connected)
                      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);
@@ -543,6 +548,7 @@ if (lnk->connected)
                     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;            
@@ -590,6 +596,166 @@ void NETMOD::remote_messages()
 
 }
 
+
+/******************************    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];
@@ -760,9 +926,11 @@ void NETMOD::run()
 {
   while(1)
  {
-  accept_connection();
+  /*accept_connection();
   get_internal();
-  remote_messages(); 
+  remote_messages(); */
+  // 2010
+  doitall();
  }
 }