4 #include <sys/socket.h>
6 #include <netinet/in.h>
11 #include <sys/types.h>
22 #include <qstringlist.h>
25 #include <libconfig.h>
26 #include "AppConfiguration.h"
28 #define REMOTE_PATH "REMOTE"
32 #define CODEPORT1 3800
34 #define FILE_BUFFER_SIZE 2048
38 // ************** Interpreter slot *******************
55 // ******************** Network slot ********************
60 bool connected,code_transmit;
77 for(i=0;i<5;i++) aliases[i]=-1;
86 //********************** NET Module ****************************
91 int kernel_sock,listen_sock;
92 bool all_connected,local_mode;
93 int to_connect,MyNode;
97 QList<INTlink> Interpreters; // List of the Interpeter slots
98 QList<NETlink> Links; // List of the Network slots
102 void load_config(char*);
103 void write_at_console(char*);
104 void send_to_kernel(MESSAGE*);
105 void sock_reopen(NETlink*);
106 void send_connect_info(NETlink*);
107 void send_accept_info(NETlink*);
108 void send_to_node(NETlink*,MESSAGE*);
109 void send_to_int(MESSAGE*);
110 void send_code_ack(NETlink*);
111 void send_to_all(MESSAGE *);
113 NETlink *findNETlink(int node);
114 INTlink *findINTlink(int id);
115 void transmit_file(int ton, char *fname, int fromINT);
116 void propagate_msg(MESSAGE *msg);
117 void check_node(int,int);
120 void exit_sequence();
121 void disconnect_seq();
122 void connect_seq(char*);
123 void accept_connection();
125 void remote_messages();
127 void get_message(NETlink*);
130 void doitall(); // 2010
134 NETMOD::NETMOD(char *kernel_name)
137 struct sockaddr_in svr;
138 struct sockaddr_un svr1;
144 Interpreters.clear();
146 bzero(&svr, sizeof(svr));
147 listen_sock = socket(AF_INET, SOCK_STREAM, 0);
148 svr.sin_family = AF_INET;
149 svr.sin_addr.s_addr = INADDR_ANY;
150 svr.sin_port = htons(LOGPORT);
151 bind(listen_sock, (struct sockaddr*)&svr, sizeof(svr));
152 listen(listen_sock,5);
153 fcntl(listen_sock, F_SETFL,O_NONBLOCK | fcntl(listen_sock, F_GETFL,0));
157 load_config("vlp.cfg");
159 kernel_sock = socket(AF_UNIX,SOCK_STREAM,0);
160 bzero(&svr1,sizeof(svr1));
161 svr1.sun_family = AF_UNIX;
162 strcpy(svr1.sun_path,kernel_name);
163 strcpy(kername,kernel_name);
164 len = strlen(svr1.sun_path)+sizeof(svr1.sun_family);
165 i = connect(kernel_sock,(struct sockaddr*)&svr1,len);
167 fcntl(kernel_sock,F_SETFL, O_NONBLOCK|fcntl(kernel_sock,F_GETFL,0));
169 setsockopt(kernel_sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
170 m.msg_type = MSG_NET;
171 m.param.pword[0] = NET_NODE;
172 m.param.pword[1] = MyNode;
175 // if (regme) regme_sequence();
178 write_at_console("Connecting remote VLPs...");
179 while (!all_connected) check_links();
181 sprintf(s,"Local node number %d",MyNode);
185 // ##################### Load configuration ##########################
187 void NETMOD::load_config(char *fname)
193 /* Hack for checking if file exists without using external libs.*/
194 FILE * file = fopen(fname, "r");
196 fprintf(stderr, "Error: Cannot load configuration file %s!\n", fname);
197 write_at_console("Cannot load configuration file!");
200 /* File exists, so file has been locked. Release it. */
203 AppConfiguration config(fname);
205 MyNode = config.getInt("node_number");
206 if (config.error() == TRUE) {
207 write_at_console("Node number must be specified");
213 strcpy(host, config.getString("host"));
214 if(config.error() == FALSE)
217 pomlink = new NETlink;
218 strcpy(pomlink->addr, host);
219 pomlink->connected = FALSE;
220 pomlink->sock = socket(AF_INET, SOCK_STREAM, 0);
221 fcntl(pomlink->sock, F_SETFL,O_NONBLOCK | fcntl(pomlink->sock,F_GETFL,0));
223 setsockopt(pomlink->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
224 Links.append(pomlink);
229 if (k==0) all_connected=TRUE;
234 void NETMOD::write_at_console(char *s)
238 msg.msg_type = MSG_NET;
239 msg.param.pword[0] = NET_CSWRITELN;
240 strcpy(msg.param.pstr,s);
241 send_to_kernel(&msg);
244 void NETMOD::send_to_kernel(MESSAGE *msg)
246 write(kernel_sock,msg,sizeof(MESSAGE));
249 void NETMOD::send_to_node(NETlink *lnk, MESSAGE *msg)
251 msg->msg_type = MSG_NET;
254 write(lnk->sock,msg,sizeof(MESSAGE));
257 void NETMOD::send_to_int(MESSAGE *msg)
261 pomlink = findINTlink(msg->param.pword[5]);
262 if (pomlink!=NULL) write(pomlink->sock,msg,sizeof(MESSAGE));
267 void NETMOD::accept_connection()
271 struct sockaddr_in svr;
273 struct timeval tout = {0,0};
276 FD_ZERO(&rset);FD_ZERO(&wset);
277 FD_SET(listen_sock,&rset);
279 if (select(listen_sock+1,&rset,&wset,0,(struct timeval *)&tout)>0)
280 if (FD_ISSET(listen_sock,&rset))
283 /* accept connection on listen socket */
285 bzero(&svr, sizeof(svr));
286 nsock = accept(listen_sock, (struct sockaddr*)&svr, &sz);
291 /* i<0 someone wants to connect us */
293 pomlink = new NETlink;
294 strcpy(pomlink->addr,inet_ntoa(svr.sin_addr));
295 pomlink->sock = nsock;
296 pomlink->connected = TRUE;
297 fcntl(pomlink->sock, F_SETFL,O_NONBLOCK | fcntl(pomlink->sock,
300 setsockopt(pomlink->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
301 Links.append(pomlink);
307 void NETMOD::check_node(int n, int sc)
312 m.msg_type = MSG_NET;
313 m.param.pword[0] = NET_NODE_EXIST;
315 pomlink = Links.first();
316 m.param.pword[1] = 0;
317 while (pomlink!=NULL)
319 if ( pomlink->node_number==n )
321 m.param.pword[1] = 1;
322 strcpy(m.param.pstr,pomlink->addr);
325 pomlink = Links.next();
327 write(sc,&m,sizeof(MESSAGE));
331 // ************* Internal message from kernel or INT *******************
333 void NETMOD::get_internal()
338 fd_set readset,writeset;
339 struct timeval tout={0,0};
341 struct sockaddr_un svr;
345 FD_ZERO(&readset);FD_ZERO(&writeset);
346 FD_SET(kernel_sock,&readset);
349 pomlink = Interpreters.first();
350 while (pomlink!=NULL)
352 FD_SET(pomlink->sock,&readset);
353 if (nrset<pomlink->sock) nrset=pomlink->sock;
354 pomlink=Interpreters.next();
357 if (select(nrset+1,&readset,&writeset,0,(struct timeval *)&tout)>0)
360 /* Check request sockets */
361 pomlink = Interpreters.first();
362 while (pomlink!=NULL)
364 if (FD_ISSET(pomlink->sock,&readset))
366 nr = read(pomlink->sock,&msg,sizeof(MESSAGE));
369 if (msg.msg_type == MSG_NET)
370 switch(msg.param.pword[0])
372 case NET_PROPAGATE:propagate_msg(&msg);break;
373 case NET_NODE_EXIST:check_node(msg.param.pword[1],pomlink->sock);break;
374 case NET_GET_INFO: conn_info(pomlink->sock);break;
375 case NET_NODES_NUM: msg.param.pword[0]=NET_NODES_NUM_RESPONSE;
376 msg.param.pword[1]=Links.count();
377 write(pomlink->sock,&msg,sizeof(MESSAGE));
382 pomlink=Interpreters.next();
385 /* Check internal socket */
386 if (FD_ISSET(kernel_sock,&readset))
388 nr = read(kernel_sock, &msg, sizeof(MESSAGE));
391 if (msg.msg_type == MSG_NET)
393 switch(msg.param.pword[0])
395 case NET_TRANSMIT_CODE:
396 transmit_file(msg.param.pword[2],msg.param.pstr,msg.param.pword[1]);
398 case NET_EXIT: { disconnect_seq();exit_sequence();}
400 case NET_GET_INFO: conn_info(kernel_sock);break;
401 case NET_PROPAGATE:propagate_msg(&msg);break;
402 case NET_DISCONNECT:disconnect_seq();
404 case NET_NODE_EXIST: check_node(msg.param.pword[1],kernel_sock);break;
405 case NET_CONNECT_TO: connect_seq(msg.param.pstr);
410 if (msg.msg_type == MSG_VLP)
411 switch(msg.param.pword[0])
415 pomlink = new INTlink;
416 pomlink->sock = socket(AF_UNIX,SOCK_STREAM,0);
417 bzero(&svr,sizeof(svr));
418 svr.sun_family = AF_UNIX;
419 strcpy(svr.sun_path,msg.param.pstr);
420 si = strlen(svr.sun_path)+sizeof(svr.sun_family);
421 sj = connect(pomlink->sock,(struct sockaddr*)&svr,si);
423 fcntl(pomlink->sock,F_SETFL, O_NONBLOCK|
424 fcntl(pomlink->sock,F_GETFL,0));
426 setsockopt(pomlink->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
427 pomlink->ID = msg.param.pword[1];
428 pomlink->connected=TRUE;
429 Interpreters.append(pomlink);
432 case VLP_INTERPRETER_DOWN:
434 pomlink = findINTlink(msg.param.pword[1]);
437 close(pomlink->sock);
438 Interpreters.remove(pomlink);
451 void NETMOD::get_message(NETlink *lnk)
456 int rdbt,rd,sz,j,psock;
457 struct sockaddr_in svr;
458 unsigned char buffer[FILE_BUFFER_SIZE];
463 nr = read(lnk->sock,&msg, sizeof(MESSAGE));
467 if (msg.msg_type == MSG_NET)
469 switch(msg.param.pword[0])
473 lnk->code_transmit = TRUE;
474 sprintf(pomstr,"%s/%s",REMOTE_PATH,msg.param.pstr);
475 strcat(pomstr,".ccd");
476 lnk->CodeFile = fopen(pomstr,"wb");
477 if ( lnk->CodeFile == NULL) { write_at_console("Cannot open file\n");
478 lnk->code_transmit=FALSE;}
479 lnk->CodeSize=msg.param.pword[1];
480 psock = socket(AF_INET, SOCK_STREAM, 0);
481 bzero(&svr, sizeof(svr));
482 svr.sin_family = AF_INET;
483 svr.sin_port = htons(CODEPORT);
484 svr.sin_addr.s_addr = inet_addr(lnk->addr);
485 j = connect(psock, (struct sockaddr*)&svr, sizeof(svr));
488 //fcntl(psock, F_SETFL,O_NONBLOCK | fcntl(psock, F_GETFL,0));
490 while (sz<lnk->CodeSize)
492 rd = read(psock,&buffer,sizeof(buffer));
493 rdbt = fwrite(&buffer,sizeof(unsigned char),rd,lnk->CodeFile);
497 fclose(lnk->CodeFile);
504 lnk->code_transmit = TRUE;
505 sprintf(pomstr,"%s/%s",REMOTE_PATH,msg.param.pstr);
506 strcat(pomstr,".pcd");
507 lnk->CodeFile = fopen(pomstr,"wb");
508 if ( lnk->CodeFile == NULL) { write_at_console("Cannot open file\n");
509 lnk->code_transmit=FALSE;}
510 lnk->CodeSize=msg.param.pword[1];
511 psock = socket(AF_INET, SOCK_STREAM, 0);
512 bzero(&svr, sizeof(svr));
513 svr.sin_family = AF_INET;
514 svr.sin_port = htons(CODEPORT1);
515 svr.sin_addr.s_addr = inet_addr(lnk->addr);
516 j = connect(psock, (struct sockaddr*)&svr, sizeof(svr));
519 //fcntl(psock, F_SETFL,O_NONBLOCK | fcntl(psock, F_GETFL,0));
521 while (sz<lnk->CodeSize)
523 rd = read(psock,&proto,sizeof(proto));
524 rdbt = fwrite(&proto,sizeof(unsigned char),rd,lnk->CodeFile);
528 fclose(lnk->CodeFile);
535 sprintf(pomstr,"Node: %d Addr: %s",msg.param.pword[1],
537 lnk->node_number = msg.param.pword[1];
538 write_at_console(pomstr);
539 send_accept_info(lnk);
543 sprintf(pomstr,"Node: %d Addr: %s",msg.param.pword[1],
545 lnk->node_number = msg.param.pword[1];
546 write_at_console(pomstr);
550 sprintf(pomstr,"Node: %d disconnected",msg.param.pword[1]);
551 write_at_console(pomstr);
558 if (msg.param.pword[1] == MSG_VLP) send_to_kernel(&msg);
559 else if (msg.param.pword[1] == MSG_INT) send_to_int(&msg);
572 void NETMOD::remote_messages()
576 struct timeval tout={0,0};
579 FD_ZERO(&rset);FD_ZERO(&wset);
582 pomlink = Links.first();
583 while (pomlink!=NULL)
585 if (pomlink->connected)
587 FD_SET(pomlink->sock,&rset);
588 if (max<pomlink->sock) max=pomlink->sock;
590 pomlink=Links.next();
593 if (select(max+1,&rset,&wset,0,(struct timeval *)&tout)>0)
595 pomlink=Links.first();
596 while (pomlink!=NULL)
598 if (FD_ISSET(pomlink->sock,&rset)) get_message(pomlink);
599 pomlink=Links.next();
606 /****************************** 2010 ********************************************/
607 void NETMOD::doitall() {
609 int nsock,max=0,on, nr, si, sj;
610 struct sockaddr_in svr;
614 struct sockaddr_un svr2;
619 FD_SET(listen_sock,&rset);
621 FD_SET(kernel_sock,&rset);
622 if (max<kernel_sock) { max=kernel_sock;}
623 pomlink2 = Interpreters.first();
624 while (pomlink2!=NULL)
626 FD_SET(pomlink2->sock,&rset);
627 if (max<pomlink2->sock) max=pomlink2->sock;
628 pomlink2=Interpreters.next();
630 pomlink = Links.first();
631 while (pomlink!=NULL)
633 if (pomlink->connected)
635 FD_SET(pomlink->sock,&rset);
636 if (max<pomlink->sock) max=pomlink->sock;
638 pomlink=Links.next();
642 if (select(max+1,&rset,0,0,NULL) > 0) {
644 if (FD_ISSET(listen_sock,&rset))
646 /* accept connection on listen socket */
648 bzero(&svr, sizeof(svr));
649 nsock = accept(listen_sock, (struct sockaddr*)&svr, &sz);
652 pomlink = new NETlink;
653 strcpy(pomlink->addr,inet_ntoa(svr.sin_addr));
654 pomlink->sock = nsock;
655 pomlink->connected = TRUE;
656 fcntl(pomlink->sock, F_SETFL,O_NONBLOCK | fcntl(pomlink->sock,F_GETFL,0));
658 setsockopt(pomlink->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
659 Links.append(pomlink);
663 // get internal message
664 /* Check request sockets */
665 pomlink2 = Interpreters.first();
666 while (pomlink2!=NULL)
668 if (FD_ISSET(pomlink2->sock,&rset))
670 nr = read(pomlink2->sock,&msg,sizeof(MESSAGE));
673 if (msg.msg_type == MSG_NET)
674 switch(msg.param.pword[0])
676 case NET_PROPAGATE:propagate_msg(&msg); break;
677 case NET_NODE_EXIST:check_node(msg.param.pword[1],pomlink2->sock);break;
678 case NET_GET_INFO: conn_info(pomlink2->sock);break;
679 case NET_NODES_NUM: msg.param.pword[0]=NET_NODES_NUM_RESPONSE;
680 msg.param.pword[1]=Links.count();
681 write(pomlink2->sock,&msg,sizeof(MESSAGE));
686 pomlink2=Interpreters.next();
688 /* Check internal socket */
689 if (FD_ISSET(kernel_sock,&rset))
691 nr = read(kernel_sock, &msg, sizeof(MESSAGE));
694 if (msg.msg_type == MSG_NET)
696 switch(msg.param.pword[0])
698 case NET_TRANSMIT_CODE:
700 transmit_file(msg.param.pword[2],msg.param.pstr,msg.param.pword[1]);
703 case NET_EXIT: { disconnect_seq();exit_sequence();}
705 case NET_GET_INFO: conn_info(kernel_sock);break;
706 case NET_PROPAGATE:propagate_msg(&msg);break;
707 case NET_DISCONNECT:disconnect_seq();
709 case NET_NODE_EXIST: check_node(msg.param.pword[1],kernel_sock);break;
710 case NET_CONNECT_TO: connect_seq(msg.param.pstr);
713 if (msg.msg_type == MSG_VLP)
714 switch(msg.param.pword[0])
719 pomlink2 = new INTlink;
720 pomlink2->sock = socket(AF_UNIX,SOCK_STREAM,0);
721 bzero(&svr2,sizeof(svr2));
722 svr2.sun_family = AF_UNIX;
723 strcpy(svr2.sun_path,msg.param.pstr);
724 si = strlen(svr2.sun_path)+sizeof(svr2.sun_family);
725 sj = connect(pomlink2->sock,(struct sockaddr*)&svr2,si);
727 fcntl(pomlink2->sock,F_SETFL, O_NONBLOCK|fcntl(pomlink2->sock,F_GETFL,0));
729 setsockopt(pomlink2->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
730 pomlink2->ID = msg.param.pword[1];
731 pomlink2->connected=TRUE;
732 Interpreters.append(pomlink2);
735 case VLP_INTERPRETER_DOWN:
738 pomlink2 = findINTlink(msg.param.pword[1]);
741 close(pomlink2->sock);
742 Interpreters.remove(pomlink2);
749 // get remote message
751 pomlink=Links.first();
752 while (pomlink!=NULL)
754 if (FD_ISSET(pomlink->sock,&rset)) get_message(pomlink);
755 pomlink=Links.next();
761 /****************************** END 2010 ********************************************/
765 void NETMOD::propagate_msg(MESSAGE *msg)
770 pomlink = findNETlink(msg->param.pword[4]);
771 if ((pomlink!=NULL)&&(pomlink->connected))
772 send_to_node(pomlink,msg);
774 if (msg->param.pword[1]==MSG_INT)
780 sprintf(ss,"Not connected to Node %d",msg->param.pword[4]);
781 write_at_console(ss);
788 void NETMOD::connect_seq(char *a)
791 struct sockaddr_in svr;
798 if (strcmp(pom->addr,a)==0) return;
803 pom->connected = FALSE;
804 pom->sock = socket(AF_INET, SOCK_STREAM, 0);
805 bzero(&svr, sizeof(svr));
806 svr.sin_family = AF_INET;
807 svr.sin_port = htons(LOGPORT);
808 svr.sin_addr.s_addr = inet_addr(pom->addr);
809 j = connect(pom->sock, (struct sockaddr*)&svr, sizeof(svr));
811 { pom->connected = TRUE;
812 fcntl(pom->sock, F_SETFL,O_NONBLOCK | fcntl(pom->sock,
815 setsockopt(pom->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
816 send_connect_info(pom);
819 else write_at_console("Connection failed");
822 void NETMOD::check_links()
826 struct sockaddr_in svr;
829 /* connect to all other nodes */
832 pomlink=Links.first();
833 while (pomlink!=NULL)
835 if ( !(pomlink->connected) )
837 bzero(&svr, sizeof(svr));
838 svr.sin_family = AF_INET;
839 svr.sin_port = htons(LOGPORT);
840 svr.sin_addr.s_addr = inet_addr(pomlink->addr);
842 j = connect(pomlink->sock, (struct sockaddr*)&svr, sizeof(svr));
844 { pomlink->connected = TRUE;
845 fcntl(pomlink->sock, F_SETFL,O_NONBLOCK | fcntl(pomlink->sock,
847 send_connect_info(pomlink);
850 if (errno == ECONNREFUSED)
851 sock_reopen(pomlink);
853 pomlink=Links.next();
858 pomlink=Links.first();
861 if (pomlink->connected==FALSE) {all_connected=FALSE;break;}
862 pomlink=Links.next();
867 void NETMOD::sock_reopen(NETlink *lnk)
872 lnk->sock = socket(AF_INET, SOCK_STREAM, 0);
873 fcntl(lnk->sock, F_SETFL,O_NONBLOCK | fcntl(lnk->sock,
875 setsockopt(lnk->sock,IPPROTO_TCP,TCP_NODELAY,(char*)&on,sizeof(on));
879 // **************** Acknowledges *************************
881 void NETMOD::send_connect_info(NETlink *lnk)
885 m.param.pword[0] = NET_CONNECT;
886 m.param.pword[1] = MyNode;
887 m.msg_type = MSG_NET;
890 write(lnk->sock,&m,sizeof(MESSAGE));
893 void NETMOD::send_accept_info(NETlink *lnk)
897 m.param.pword[0] = NET_ACCEPT;
898 m.param.pword[1] = MyNode;
899 m.msg_type = MSG_NET;
902 write(lnk->sock,&m,sizeof(MESSAGE));
905 void NETMOD::send_code_ack(NETlink *lnk)
909 m.param.pword[0] = NET_CODESTREAM_OK;
910 m.msg_type = MSG_NET;
913 write(lnk->sock,&m,sizeof(MESSAGE));
917 void NETMOD::send_to_all(MESSAGE *msg)
920 pomlink=Links.first();
921 while (pomlink!=NULL)
923 write(pomlink->sock,msg,sizeof(MESSAGE));
924 pomlink=Links.next();
935 /*accept_connection();
937 remote_messages(); */
943 void NETMOD::exit_sequence()
947 ::close(kernel_sock);
948 ::close(listen_sock);
950 pomlink = Links.first();
951 while (pomlink!=NULL)
953 ::close(pomlink->sock);
954 pomlink=Links.next();
959 void NETMOD::disconnect_seq()
964 bzero(&m,sizeof(MESSAGE));
965 m.msg_type = MSG_NET;
966 m.param.pword[0] = NET_DISCONNECT;
967 m.param.pword[1] = MyNode;
984 NETlink *NETMOD::findNETlink(int node)
987 pomlink=Links.first();
990 if (pomlink->node_number == node) return(pomlink);
991 pomlink=Links.next();
996 INTlink *NETMOD::findINTlink(int id)
999 pomlink=Interpreters.first();
1000 while(pomlink!=NULL)
1002 if (pomlink->ID == id) return(pomlink);
1003 pomlink=Interpreters.next();
1009 /* ---------------- Sending code to a remote node -------------- */
1011 void NETMOD::transmit_file(int ton, char *fname, int fromINT)
1017 unsigned char buffer[FILE_BUFFER_SIZE];
1022 struct sockaddr_in svr;
1026 // **************** CCD FILE
1033 fseek(f,0,SEEK_END);
1034 msg.param.pword[1] = ftell(f);
1038 strcpy(b,rindex(fname,'/'));
1039 for(i=0;i<strlen(b);i++)
1041 msg.param.pword[0] = NET_CCD_START;
1042 strcpy(msg.param.pstr,b);
1044 outlink = findNETlink(ton);
1045 if (outlink==NULL) exit(1);
1046 bzero(&svr,sizeof(svr));
1047 sock = socket(AF_INET,SOCK_STREAM,0);
1048 svr.sin_family = AF_INET;
1049 svr.sin_addr.s_addr = INADDR_ANY;
1050 svr.sin_port = htons(CODEPORT);
1051 bind(sock, (struct sockaddr*)&svr, sizeof(svr));
1053 send_to_node(outlink, &msg);
1055 FD_ZERO(&rset);FD_ZERO(&wset);
1057 if (select(sock+1,&rset,&wset,0,0))
1058 if (FD_ISSET(sock,&rset))
1059 tsock = accept(sock, (struct sockaddr*)&svr,&sz );
1065 i = fread(&buffer,1,sizeof(buffer),f);
1066 write(tsock,&buffer,i);
1067 FD_ZERO(&rset);FD_ZERO(&wset);
1068 FD_SET(tsock,&wset);
1069 select(tsock+1,&rset,&wset,0,0);
1077 sprintf(b,"Cannot open file to send %s\n",fname);
1078 write_at_console(b);
1082 // *************** PCD FILE
1089 fseek(f,0,SEEK_END);
1090 msg.param.pword[1] = ftell(f);
1094 strcpy(b,rindex(fname,'/'));
1095 for(i=0;i<strlen(b);i++)
1097 msg.param.pword[0] = NET_PCD_START;
1098 strcpy(msg.param.pstr,b);
1100 outlink = findNETlink(ton);
1101 if (outlink==NULL) exit(1);
1102 bzero(&svr,sizeof(svr));
1103 sock = socket(AF_INET,SOCK_STREAM,0);
1104 svr.sin_family = AF_INET;
1105 svr.sin_addr.s_addr = INADDR_ANY;
1106 svr.sin_port = htons(CODEPORT1);
1107 bind(sock, (struct sockaddr*)&svr, sizeof(svr));
1109 send_to_node(outlink, &msg);
1111 FD_ZERO(&rset);FD_ZERO(&wset);
1113 if (select(sock+1,&rset,&wset,0,0))
1114 if (FD_ISSET(sock,&rset))
1115 tsock = accept(sock, (struct sockaddr*)&svr,&sz );
1121 i = fread(&proto,1,sizeof(proto),f);
1122 write(tsock,&proto,i);
1123 FD_ZERO(&rset);FD_ZERO(&wset);
1124 FD_SET(tsock,&wset);
1125 select(tsock+1,&rset,&wset,0,0);
1133 sprintf(b,"Cannot open file to send %s\n",fname);
1134 write_at_console(b);
1138 msg.msg_type = MSG_NET;
1139 msg.param.pword[0] = NET_TRANSMITTED;
1140 msg.param.pword[1] = fromINT;
1141 send_to_kernel(&msg);
1148 void NETMOD::conn_info(int sk)
1155 m.msg_type = MSG_NET;
1156 m.param.pword[0] = NET_INFO;
1157 strcpy(m.param.pstr,"");
1161 sprintf(poms,"%d=%s;",pom->node_number,pom->addr);
1162 strcat(m.param.pstr,poms);
1166 m.param.pword[1]=12;
1167 write(sk,&m,sizeof(MESSAGE));
1175 write(sk,&m,sizeof(MESSAGE));
1177 m.msg_type = MSG_NET;
1178 m.param.pword[0] = NET_INFO_END;
1179 write(sk,&m,sizeof(MESSAGE));
1182 int main(int argc,char **argv)
1184 NETMOD netter(argv[1]);