4 #include <sys/socket.h>
6 #include <netinet/in.h>
11 #include <sys/types.h>
19 #include <QtCore/qlist.h>
20 #include <QtCore/qfile.h>
21 #include <QtCore/qstring.h>
22 #include <QtCore/qstringlist.h>
23 #include <QtCore/QDir>
26 #include <libconfig.h>
28 #define REMOTE_PATH "REMOTE"
32 #define CODEPORT1 3800
34 #define FILE_BUFFER_SIZE 2048
38 /*************** Interpreter slot ********************/
53 /********************* Network slot ********************/
74 for(i = 0; i < 5; i++)
79 code_transmit = FALSE;
82 /*********************** NET Module *****************************/
94 /* List of the Interpeter slots */
95 QList<INTlink*> Interpreters;
96 /* List of the Network slots */
97 QList<NETlink*> Links;
99 NETMOD(int argc, char ** argv);
101 void load_config(const char*);
102 void write_at_console(char*);
103 void send_to_kernel(MESSAGE*);
104 void sock_reopen(NETlink*);
105 void send_connect_info(NETlink*);
106 void send_accept_info(NETlink*);
107 void send_to_node(NETlink*, MESSAGE*);
108 void send_to_int(MESSAGE*);
109 void send_code_ack(NETlink*);
110 void send_to_all(MESSAGE *);
112 NETlink *findNETlink(int node);
113 INTlink *findINTlink(int id);
114 void transmit_file(int ton, char *fname, int fromINT);
115 void propagate_msg(MESSAGE *msg);
116 void check_node(int, int);
119 void exit_sequence();
120 void disconnect_seq();
121 void connect_seq(char*);
122 void accept_connection();
124 void remote_messages();
126 void get_message(NETlink*);
133 NETMOD::NETMOD(int argc, char ** argv)
135 QString kernelSocket(argv[1]);
136 QString configFile(argv[2]);
141 struct sockaddr_in svr;
142 struct sockaddr_un svr1;
147 Interpreters.clear();
149 bzero(&svr, sizeof(svr));
150 listen_sock = socket(AF_INET, SOCK_STREAM, 0);
151 svr.sin_family = AF_INET;
152 svr.sin_addr.s_addr = INADDR_ANY;
153 svr.sin_port = htons(LOGPORT);
154 bind(listen_sock, (struct sockaddr*)&svr, sizeof(svr));
155 listen(listen_sock,5);
156 fcntl(listen_sock, F_SETFL, O_NONBLOCK | fcntl(listen_sock, F_GETFL, 0));
159 all_connected = FALSE;
161 load_config(configFile.toStdString().c_str());
163 kernel_sock = socket(AF_UNIX, SOCK_STREAM, 0);
164 bzero(&svr1, sizeof(svr1));
165 svr1.sun_family = AF_UNIX;
166 strcpy(svr1.sun_path, kernelSocket.toStdString().c_str());
167 strcpy(kername, kernelSocket.toStdString().c_str());
168 len = strlen(svr1.sun_path) + sizeof(svr1.sun_family);
169 i = connect(kernel_sock, (struct sockaddr*)&svr1, len);
171 fcntl(kernel_sock, F_SETFL, O_NONBLOCK|fcntl(kernel_sock, F_GETFL, 0));
173 setsockopt(kernel_sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on));
174 m.msg_type = MSG_NET;
175 m.param.pword[0] = NET_NODE;
176 m.param.pword[1] = MyNode;
179 /* if (regme) regme_sequence();*/
181 if (to_connect > 0) {
182 write_at_console("Connecting remote VLPs...");
183 while (!all_connected) {
187 sprintf(s, "Local node number %d", MyNode);
191 /*##################### Load configuration ##########################*/
193 void NETMOD::load_config(const char *fname)
196 config_setting_t *setting;
203 /* Hack for checking if file exists without using external libs.*/
204 FILE * file = fopen(fname, "rt");
206 fprintf(stderr, "[Error]/Lognet: Cannot load configuration file %s!\n", fname);
207 write_at_console("Cannot load configuration file!");
212 /* Read the file. If there is an error, report it and exit. */
213 if (!config_read(&cfg, file)) {
214 fprintf(stderr, "%s: In file %s, line %d\n",
215 config_error_text(&cfg),
216 config_error_file(&cfg),
217 config_error_line(&cfg));
218 config_destroy(&cfg);
220 /* from original code. */
224 setting = config_lookup(&cfg, "node_number");
226 MyNode = config_setting_get_int(setting);
229 if (!setting || MyNode == -1) {
230 fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
231 "Error", fname, "node_number");
232 write_at_console("Node number must be specified");
233 config_destroy(&cfg);
238 setting = config_lookup(&cfg, "host");
241 pomlink = new NETlink;
243 switch(config_setting_type(setting)) {
244 /* TODO: Deprecated. Made for back compatibility. */
245 case CONFIG_TYPE_STRING:
246 strncpy(pomlink->addr,
247 config_setting_get_string(setting), 255);
249 case CONFIG_TYPE_ARRAY:
250 strncpy(pomlink->addr,
251 config_setting_get_string_elem(setting, 0), 255);
254 fprintf(stderr, "%s! In file %s, bad entry type for %s."
255 " Will not be read.\n",
256 "Fatal error", fname, "host");
257 config_destroy(&cfg);
261 pomlink->connected = FALSE;
262 pomlink->sock = socket(AF_INET, SOCK_STREAM, 0);
263 fcntl(pomlink->sock, F_SETFL,O_NONBLOCK |
264 fcntl(pomlink->sock, F_GETFL, 0));
266 setsockopt(pomlink->sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on,
268 Links.append(pomlink);
271 fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
272 "Warning", fname, "host");
275 config_destroy(&cfg);
279 all_connected = TRUE;
283 void NETMOD::write_at_console(char *s)
287 msg.msg_type = MSG_NET;
288 msg.param.pword[0] = NET_CSWRITELN;
289 strcpy(msg.param.pstr, s);
290 send_to_kernel(&msg);
294 * Sends message to kernel
295 * @param msg Message to send.
297 void NETMOD::send_to_kernel(MESSAGE *msg)
299 write(kernel_sock, msg, sizeof(MESSAGE));
303 * Sends message to given node
304 * @param lnk Interpreter link.
305 * @param msg Message to send.
307 void NETMOD::send_to_node(NETlink *lnk, MESSAGE *msg)
309 msg->msg_type = MSG_NET;
310 /* msg2netmsg(msg);*/
312 write(lnk->sock, msg, sizeof(MESSAGE));
317 * Sends message to interpreter
318 * @param msg Message to send.
320 void NETMOD::send_to_int(MESSAGE *msg)
324 pomlink = findINTlink(msg->param.pword[5]);
325 if (pomlink != NULL) {
326 write(pomlink->sock, msg, sizeof(MESSAGE));
330 void NETMOD::accept_connection()
335 struct sockaddr_in svr;
338 struct timeval tout = {0, 0};
343 FD_SET(listen_sock, &rset);
345 if (select(listen_sock + 1, &rset, &wset, 0, (struct timeval *)&tout) >
347 if (FD_ISSET(listen_sock,&rset)) {
348 /* accept connection on listen socket */
350 bzero(&svr, sizeof(svr));
351 nsock = accept(listen_sock, (struct sockaddr*)&svr,
356 /* i<0 someone wants to connect us */
357 pomlink = new NETlink;
358 strcpy(pomlink->addr, inet_ntoa(svr.sin_addr));
359 pomlink->sock = nsock;
360 pomlink->connected = TRUE;
361 fcntl(pomlink->sock, F_SETFL, O_NONBLOCK |
362 fcntl(pomlink->sock, F_GETFL,0));
364 setsockopt(pomlink->sock, IPPROTO_TCP,
365 TCP_NODELAY, (char*)&on, sizeof(on));
366 Links.append(pomlink);
373 void NETMOD::check_node(int n, int sc)
378 m.msg_type = MSG_NET;
379 m.param.pword[0] = NET_NODE_EXIST;
381 pomlink = Links.first();
382 m.param.pword[1] = 0;
383 while (pomlink != NULL) {
384 if (pomlink->node_number == n) {
385 m.param.pword[1] = 1;
386 strcpy(m.param.pstr, pomlink->addr);
389 pomlink = Links.takeFirst();
391 write(sc, &m, sizeof(MESSAGE));
396 * Internal message from kernel or INT
398 void NETMOD::get_internal()
407 struct timeval tout= {0, 0};
409 struct sockaddr_un svr;
413 FD_SET(kernel_sock, &readset);
416 pomlink = Interpreters.first();
417 while (pomlink != NULL) {
418 FD_SET(pomlink->sock, &readset);
419 if (nrset < pomlink->sock) {
420 nrset = pomlink->sock;
422 pomlink = Interpreters.takeFirst();
425 if (select(nrset + 1, &readset, &writeset, 0, (struct timeval *)&tout) >
428 /* Check request sockets */
429 pomlink = Interpreters.first();
430 while (pomlink != NULL) {
431 if (FD_ISSET(pomlink->sock, &readset)) {
432 nr = read(pomlink->sock, &msg, sizeof(MESSAGE));
434 if (msg.msg_type == MSG_NET) {
435 switch(msg.param.pword[0]) {
440 check_node(msg.param.pword[1], pomlink->sock);
443 conn_info(pomlink->sock);
446 msg.param.pword[0] = NET_NODES_NUM_RESPONSE;
447 msg.param.pword[1] = Links.count();
448 write(pomlink->sock, &msg, sizeof(MESSAGE));
454 pomlink=Interpreters.takeFirst();
457 /* Check internal socket */
458 if (FD_ISSET(kernel_sock,&readset)) {
459 nr = read(kernel_sock, &msg, sizeof(MESSAGE));
461 if (msg.msg_type == MSG_NET) {
462 switch(msg.param.pword[0]) {
463 case NET_TRANSMIT_CODE:
464 transmit_file(msg.param.pword[2],
473 conn_info(kernel_sock);
482 check_node(msg.param.pword[1], kernel_sock);
485 connect_seq(msg.param.pstr);
489 if (msg.msg_type == MSG_VLP) {
490 switch(msg.param.pword[0]) {
492 pomlink = new INTlink;
493 pomlink->sock = socket(AF_UNIX, SOCK_STREAM, 0);
494 bzero(&svr,sizeof(svr));
495 svr.sun_family = AF_UNIX;
496 strcpy(svr.sun_path, msg.param.pstr);
497 si = strlen(svr.sun_path) + sizeof(svr.sun_family);
498 sj = connect(pomlink->sock, (struct sockaddr*)&svr, si);
500 fcntl(pomlink->sock, F_SETFL, O_NONBLOCK | fcntl(pomlink->sock, F_GETFL, 0));
502 setsockopt(pomlink->sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on));
503 pomlink->ID = msg.param.pword[1];
504 pomlink->connected=TRUE;
505 Interpreters.append(pomlink);
508 case VLP_INTERPRETER_DOWN: {
509 pomlink = findINTlink(msg.param.pword[1]);
510 if (pomlink != NULL) {
511 close(pomlink->sock);
512 Interpreters.removeOne(pomlink);
524 void NETMOD::get_message(NETlink *lnk)
534 struct sockaddr_in svr;
535 unsigned char buffer[FILE_BUFFER_SIZE];
538 if (lnk->connected) {
539 nr = read(lnk->sock, &msg, sizeof(MESSAGE));
541 /* netmsg2msg(&msg); */
542 if (msg.msg_type == MSG_NET) {
543 switch(msg.param.pword[0]) {
545 lnk->code_transmit = TRUE;
546 sprintf(pomstr, "%s/%s", REMOTE_PATH, msg.param.pstr);
547 strcat(pomstr,".ccd");
548 lnk->CodeFile = fopen(pomstr, "wb");
549 if (lnk->CodeFile == NULL) {
550 write_at_console("Cannot open file\n");
551 lnk->code_transmit = FALSE;
553 lnk->CodeSize = msg.param.pword[1];
554 psock = socket(AF_INET, SOCK_STREAM, 0);
555 bzero(&svr, sizeof(svr));
556 svr.sin_family = AF_INET;
557 svr.sin_port = htons(CODEPORT);
558 svr.sin_addr.s_addr = inet_addr(lnk->addr);
559 j = connect(psock, (struct sockaddr*)&svr, sizeof(svr));
561 /*fcntl(psock, F_SETFL,O_NONBLOCK | fcntl(psock, F_GETFL,0));*/
563 while (sz < lnk->CodeSize) {
564 rd = read(psock, &buffer, sizeof(buffer));
565 rdbt = fwrite(&buffer, sizeof(unsigned char), rd, lnk->CodeFile);
569 fclose(lnk->CodeFile);
573 lnk->code_transmit = TRUE;
574 sprintf(pomstr, "%s/%s", REMOTE_PATH, msg.param.pstr);
575 strcat(pomstr, ".pcd");
576 lnk->CodeFile = fopen(pomstr, "wb");
577 if (lnk->CodeFile == NULL) {
578 write_at_console("Cannot open file\n");
579 lnk->code_transmit = FALSE;
581 lnk->CodeSize = msg.param.pword[1];
582 psock = socket(AF_INET, SOCK_STREAM, 0);
583 bzero(&svr, sizeof(svr));
584 svr.sin_family = AF_INET;
585 svr.sin_port = htons(CODEPORT1);
586 svr.sin_addr.s_addr = inet_addr(lnk->addr);
587 j = connect(psock, (struct sockaddr*)&svr, sizeof(svr));
589 /*fcntl(psock, F_SETFL,O_NONBLOCK | fcntl(psock, F_GETFL,0));*/
591 while (sz < lnk->CodeSize) {
592 rd = read(psock, &proto, sizeof(proto));
593 rdbt = fwrite(&proto, sizeof(unsigned char), rd, lnk->CodeFile);
597 fclose(lnk->CodeFile);
601 sprintf(pomstr, "Node: %d Addr: %s",
602 msg.param.pword[1], lnk->addr);
603 lnk->node_number = msg.param.pword[1];
604 write_at_console(pomstr);
605 send_accept_info(lnk);
608 sprintf(pomstr, "Node: %d Addr: %s",
609 msg.param.pword[1], lnk->addr);
610 lnk->node_number = msg.param.pword[1];
611 write_at_console(pomstr);
614 sprintf(pomstr,"Node: %d disconnected",
616 write_at_console(pomstr);
618 Links.removeOne(lnk);
622 if (msg.param.pword[1] == MSG_VLP) {
623 send_to_kernel(&msg);
624 } else if (msg.param.pword[1] == MSG_INT) {
637 void NETMOD::remote_messages()
641 struct timeval tout={0, 0};
648 pomlink = Links.first();
649 while (pomlink != NULL) {
650 if (pomlink->connected) {
651 FD_SET(pomlink->sock, &rset);
652 if (max < pomlink->sock){
656 pomlink=Links.takeFirst();
659 if (select(max + 1, &rset, &wset, 0, (struct timeval *)&tout) > 0) {
660 pomlink=Links.first();
661 while (pomlink!=NULL) {
662 if (FD_ISSET(pomlink->sock,&rset)) {
663 get_message(pomlink);
665 pomlink=Links.takeFirst();
670 /******************************2010********************************************/
671 void NETMOD::doitall() {
673 int nsock,max = 0, on, nr, si, sj;
674 struct sockaddr_in svr;
678 struct sockaddr_un svr2;
682 FD_SET(listen_sock, &rset);
684 FD_SET(kernel_sock, &rset);
685 if (max < kernel_sock) {
688 pomlink2 = Interpreters.first();
689 while (pomlink2 != NULL) {
690 FD_SET(pomlink2->sock, &rset);
691 if (max < pomlink2->sock) {
694 pomlink2 = Interpreters.takeFirst();
696 pomlink = Links.first();
697 while (pomlink != NULL) {
698 if (pomlink->connected) {
699 FD_SET(pomlink->sock, &rset);
700 if (max < pomlink->sock) {
704 pomlink=Links.takeFirst();
708 if (select(max + 1, &rset, 0, 0, NULL) > 0) {
709 /* accept connection */
710 if (FD_ISSET(listen_sock,&rset)) {
711 /* accept connection on listen socket */
713 bzero(&svr, sizeof(svr));
714 nsock = accept(listen_sock, (struct sockaddr*)&svr, &sz);
716 pomlink = new NETlink;
717 strcpy(pomlink->addr, inet_ntoa(svr.sin_addr));
718 pomlink->sock = nsock;
719 pomlink->connected = TRUE;
720 fcntl(pomlink->sock, F_SETFL,O_NONBLOCK |
721 fcntl(pomlink->sock, F_GETFL, 0));
723 setsockopt(pomlink->sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on));
724 Links.append(pomlink);
728 /* get internal message*/
729 /* Check request sockets */
730 pomlink2 = Interpreters.first();
731 while (pomlink2 != NULL) {
732 if (FD_ISSET(pomlink2->sock,&rset)) {
733 nr = read(pomlink2->sock, &msg, sizeof(MESSAGE));
735 if (msg.msg_type == MSG_NET) {
736 switch(msg.param.pword[0]) {
741 check_node(msg.param.pword[1], pomlink2->sock);
744 conn_info(pomlink2->sock);
747 msg.param.pword[0] = NET_NODES_NUM_RESPONSE;
748 msg.param.pword[1] = Links.count();
749 write(pomlink2->sock, &msg, sizeof(MESSAGE));
755 pomlink2 = Interpreters.takeFirst();
758 /* Check internal socket */
759 if (FD_ISSET(kernel_sock, &rset)) {
760 nr = read(kernel_sock, &msg, sizeof(MESSAGE));
762 if (msg.msg_type == MSG_NET) {
763 switch(msg.param.pword[0]) {
764 case NET_TRANSMIT_CODE:
765 transmit_file(msg.param.pword[2], msg.param.pstr, msg.param.pword[1]);
772 conn_info(kernel_sock);
781 check_node(msg.param.pword[1], kernel_sock);
784 connect_seq(msg.param.pstr);
787 if (msg.msg_type == MSG_VLP) {
788 switch(msg.param.pword[0]) {
790 pomlink2 = new INTlink;
791 pomlink2->sock = socket(AF_UNIX, SOCK_STREAM, 0);
792 bzero(&svr2, sizeof(svr2));
793 svr2.sun_family = AF_UNIX;
794 strcpy(svr2.sun_path, msg.param.pstr);
795 si = strlen(svr2.sun_path) + sizeof(svr2.sun_family);
796 sj = connect(pomlink2->sock,(struct sockaddr*)&svr2, si);
798 fcntl(pomlink2->sock,F_SETFL, O_NONBLOCK | fcntl(pomlink2->sock, F_GETFL, 0));
800 setsockopt(pomlink2->sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on));
801 pomlink2->ID = msg.param.pword[1];
802 pomlink2->connected = TRUE;
803 Interpreters.append(pomlink2);
806 case VLP_INTERPRETER_DOWN: {
807 pomlink2 = findINTlink(msg.param.pword[1]);
808 if (pomlink2 != NULL) {
809 close(pomlink2->sock);
810 Interpreters.removeOne(pomlink2);
819 /* get remote message*/
821 pomlink=Links.first();
822 while (pomlink != NULL) {
823 if (FD_ISSET(pomlink->sock, &rset))
824 get_message(pomlink);
825 pomlink=Links.takeFirst();
829 /****************************** END 2010 **************************************/
833 void NETMOD::propagate_msg(MESSAGE *msg)
838 pomlink = findNETlink(msg->param.pword[4]);
839 if ((pomlink != NULL) && (pomlink->connected))
840 send_to_node(pomlink, msg);
842 if (msg->param.pword[1] == MSG_INT) {
845 sprintf(ss, "Not connected to Node %d",
846 msg->param.pword[4]);
847 write_at_console(ss);
852 void NETMOD::connect_seq(char *a)
855 struct sockaddr_in svr;
859 while (pom != NULL) {
860 if (strcmp(pom->addr, a) == 0)
862 pom = Links.takeFirst();
865 strcpy(pom->addr, a);
866 pom->connected = FALSE;
867 pom->sock = socket(AF_INET, SOCK_STREAM, 0);
868 bzero(&svr, sizeof(svr));
869 svr.sin_family = AF_INET;
870 svr.sin_port = htons(LOGPORT);
871 svr.sin_addr.s_addr = inet_addr(pom->addr);
872 j = connect(pom->sock, (struct sockaddr*)&svr, sizeof(svr));
874 pom->connected = TRUE;
875 fcntl(pom->sock, F_SETFL, O_NONBLOCK | fcntl(pom->sock, F_GETFL,
878 setsockopt(pom->sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on,
880 send_connect_info(pom);
883 write_at_console("Connection failed");
887 void NETMOD::check_links()
890 struct sockaddr_in svr;
893 /* connect to all other nodes */
894 if (!all_connected) {
895 pomlink = Links.first();
896 while (pomlink != NULL) {
897 if (!(pomlink->connected)) {
898 bzero(&svr, sizeof(svr));
899 svr.sin_family = AF_INET;
900 svr.sin_port = htons(LOGPORT);
901 svr.sin_addr.s_addr = inet_addr(pomlink->addr);
903 j = connect(pomlink->sock,
904 (struct sockaddr*)&svr, sizeof(svr));
906 pomlink->connected = TRUE;
907 fcntl(pomlink->sock, F_SETFL, O_NONBLOCK
908 | fcntl(pomlink->sock, F_GETFL,
910 send_connect_info(pomlink);
912 if (errno == ECONNREFUSED) {
913 sock_reopen(pomlink);
915 } /* not connected */
916 pomlink = Links.takeFirst();
919 all_connected = TRUE;
920 pomlink = Links.first();
921 while(pomlink != NULL) {
922 if (pomlink->connected == FALSE) {
923 all_connected = FALSE;
926 pomlink = Links.takeFirst();
930 void NETMOD::sock_reopen(NETlink *lnk)
935 lnk->sock = socket(AF_INET, SOCK_STREAM, 0);
936 fcntl(lnk->sock, F_SETFL,O_NONBLOCK | fcntl(lnk->sock, F_GETFL, 0));
937 setsockopt(lnk->sock, IPPROTO_TCP,TCP_NODELAY, (char*)&on, sizeof(on));
940 /***************** Acknowledges **************************/
942 void NETMOD::send_connect_info(NETlink *lnk)
946 m.param.pword[0] = NET_CONNECT;
947 m.param.pword[1] = MyNode;
948 m.msg_type = MSG_NET;
951 write(lnk->sock, &m, sizeof(MESSAGE));
954 void NETMOD::send_accept_info(NETlink *lnk)
958 m.param.pword[0] = NET_ACCEPT;
959 m.param.pword[1] = MyNode;
960 m.msg_type = MSG_NET;
963 write(lnk->sock, &m, sizeof(MESSAGE));
966 void NETMOD::send_code_ack(NETlink *lnk)
970 m.param.pword[0] = NET_CODESTREAM_OK;
971 m.msg_type = MSG_NET;
974 write(lnk->sock, &m, sizeof(MESSAGE));
977 void NETMOD::send_to_all(MESSAGE *msg)
980 pomlink = Links.first();
981 while (pomlink != NULL) {
982 write(pomlink->sock, msg, sizeof(MESSAGE));
983 pomlink = Links.takeFirst();
1000 void NETMOD::exit_sequence()
1004 ::close(kernel_sock);
1005 ::close(listen_sock);
1007 pomlink = Links.first();
1008 while (pomlink != NULL) {
1009 ::close(pomlink->sock);
1010 pomlink = Links.takeFirst();
1015 void NETMOD::disconnect_seq()
1020 bzero(&m, sizeof(MESSAGE));
1021 m.msg_type = MSG_NET;
1022 m.param.pword[0] = NET_DISCONNECT;
1023 m.param.pword[1] = MyNode;
1027 send_to_node(p, &m);
1028 p=Links.takeFirst();
1033 p = Links.takeFirst();
1038 NETlink * NETMOD::findNETlink(int node)
1041 pomlink = Links.first();
1042 while(pomlink != NULL) {
1043 if (pomlink->node_number == node)
1046 pomlink = Links.takeFirst();
1051 INTlink * NETMOD::findINTlink(int id)
1054 pomlink = Interpreters.first();
1055 while(pomlink != NULL) {
1056 if (pomlink->ID == id)
1058 pomlink = Interpreters.takeFirst();
1065 * Sending code to a remote node
1067 void NETMOD::transmit_file(int ton, char *fname, int fromINT)
1073 unsigned char buffer[FILE_BUFFER_SIZE];
1078 struct sockaddr_in svr;
1082 /***************** CCD FILE */
1085 f = fopen(fn, "rb");
1087 fseek(f, 0, SEEK_END);
1088 msg.param.pword[1] = ftell(f);
1090 f = fopen(fn, "rb");
1092 strcpy(b, rindex(fname, '/'));
1093 for(i = 0; i < strlen(b); i++)
1096 msg.param.pword[0] = NET_CCD_START;
1097 strcpy(msg.param.pstr, b);
1099 outlink = findNETlink(ton);
1100 if (outlink == NULL)
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(CODEPORT);
1107 bind(sock, (struct sockaddr*)&svr, sizeof(svr));
1109 send_to_node(outlink, &msg);
1113 FD_SET(sock, &rset);
1114 if (select(sock + 1, &rset, &wset, 0, 0))
1115 if (FD_ISSET(sock,&rset))
1116 tsock = accept(sock, (struct sockaddr*)&svr,
1121 i = fread(&buffer, 1, sizeof(buffer), f);
1122 write(tsock, &buffer, i);
1125 FD_SET(tsock, &wset);
1126 select(tsock + 1, &rset, &wset, 0, 0);
1133 sprintf(b, "Cannot open file to send %s\n", fname);
1134 write_at_console(b);
1138 /**************** PCD FILE */
1144 fseek(f, 0, SEEK_END);
1145 msg.param.pword[1] = ftell(f);
1147 f = fopen(fn, "rb");
1149 strcpy(b, rindex(fname, '/'));
1150 for(i = 0; i < strlen(b); i++)
1152 msg.param.pword[0] = NET_PCD_START;
1153 strcpy(msg.param.pstr, b);
1155 outlink = findNETlink(ton);
1156 if (outlink == NULL)
1158 bzero(&svr, sizeof(svr));
1159 sock = socket(AF_INET, SOCK_STREAM, 0);
1160 svr.sin_family = AF_INET;
1161 svr.sin_addr.s_addr = INADDR_ANY;
1162 svr.sin_port = htons(CODEPORT1);
1163 bind(sock, (struct sockaddr*)&svr, sizeof(svr));
1165 send_to_node(outlink, &msg);
1169 FD_SET(sock, &rset);
1170 if (select(sock + 1, &rset, &wset, 0, 0))
1171 if (FD_ISSET(sock, &rset))
1172 tsock = accept(sock, (struct sockaddr*)&svr,
1177 i = fread(&proto, 1, sizeof(proto), f);
1178 write(tsock, &proto, i);
1181 FD_SET(tsock, &wset);
1182 select(tsock + 1, &rset, &wset, 0, 0);
1189 sprintf(b, "Cannot open file to send %s\n", fname);
1190 write_at_console(b);
1193 msg.msg_type = MSG_NET;
1194 msg.param.pword[0] = NET_TRANSMITTED;
1195 msg.param.pword[1] = fromINT;
1196 send_to_kernel(&msg);
1199 void NETMOD::conn_info(int sk)
1206 m.msg_type = MSG_NET;
1207 m.param.pword[0] = NET_INFO;
1208 strcpy(m.param.pstr, "");
1209 pom = Links.first();
1210 while (pom != NULL) {
1211 sprintf(poms, "%d=%s;", pom->node_number, pom->addr);
1212 strcat(m.param.pstr, poms);
1215 m.param.pword[1] = 12;
1216 write(sk, &m, sizeof(MESSAGE));
1219 pom = Links.takeFirst();
1222 m.param.pword[1] = k;
1223 write(sk, &m, sizeof(MESSAGE));
1225 m.msg_type = MSG_NET;
1226 m.param.pword[0] = NET_INFO_END;
1227 write(sk, &m, sizeof(MESSAGE));
1231 * argv0 = program current path
1232 * argv1 = socket path
1233 * argv2 = config path
1235 int main(int argc, char **argv)
1241 fprintf(stderr, "lognet: Net module path: %s\n", argv[0]);
1242 fprintf(stderr, "lognet: Kernel socket: %s\n", argv[1]);
1243 fprintf(stderr, "lognet: Configuration file: %s\n", argv[2]);
1245 NETMOD netter(argc, argv);