Removed system function invocations and placed forked execl instead
[vlp.git] / src / net / lognet.cpp
index 7a93bc0661b919dd188ef21523117900918aaadd..58e481380fc0e502142b6985a60bf1e5bb375e2c 100644 (file)
 #include <signal.h>
 #include <sys/stat.h>
 #include <string.h>
-#include <qlist.h>
-#include <qfile.h>
-#include <qstring.h>
-#include <qstringlist.h>
+#include <QtCore/qlist.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qstring.h>
+#include <QtCore/qstringlist.h>
+#include <QtCore/QDir>
 #include <unistd.h>
 
 #include <libconfig.h>
@@ -91,13 +92,13 @@ public:
        char kername[256];
 
        /* List of the Interpeter slots */
-       QList<INTlink> Interpreters;
+       QList<INTlink*> Interpreters;
        /* List of the Network slots */ 
-       QList<NETlink> Links;
+       QList<NETlink*> Links;
 
-       NETMOD(char*);
+       NETMOD(int argc, char ** argv);
 
-       void load_config(char*);    
+       void load_config(const char*);
        void write_at_console(char*);
        void send_to_kernel(MESSAGE*);
        void sock_reopen(NETlink*);
@@ -129,8 +130,11 @@ public:
        void doitall();
 };
 
-NETMOD::NETMOD(char *kernel_name)
+NETMOD::NETMOD(int argc, char ** argv)
 {
+       QString kernelSocket(argv[1]);
+       QString configFile(argv[2]);
+
        int i;
        int len;
        int on;
@@ -142,32 +146,31 @@ NETMOD::NETMOD(char *kernel_name)
        Links.clear();
        Interpreters.clear();
 
-       bzero(&svr, sizeof(svr)); 
+       bzero(&svr, sizeof(svr));
        listen_sock = socket(AF_INET, SOCK_STREAM, 0);
        svr.sin_family = AF_INET;
        svr.sin_addr.s_addr = INADDR_ANY;
        svr.sin_port = htons(LOGPORT);
        bind(listen_sock, (struct sockaddr*)&svr, sizeof(svr));
        listen(listen_sock,5);
-       fcntl(listen_sock, F_SETFL, O_NONBLOCK | fcntl(listen_sock, F_GETFL, 
-                                                                       0));
+       fcntl(listen_sock, F_SETFL, O_NONBLOCK | fcntl(listen_sock, F_GETFL, 0));
 
        to_connect = 0;
        all_connected = FALSE;
-       load_config("vlp.cfg");
+
+       load_config(configFile.toStdString().c_str());
 
        kernel_sock = socket(AF_UNIX, SOCK_STREAM, 0);
        bzero(&svr1, sizeof(svr1));
        svr1.sun_family = AF_UNIX;
-       strcpy(svr1.sun_path, kernel_name);
-       strcpy(kername, kernel_name);
+       strcpy(svr1.sun_path, kernelSocket.toStdString().c_str());
+       strcpy(kername, kernelSocket.toStdString().c_str());
        len = strlen(svr1.sun_path) + sizeof(svr1.sun_family);
        i = connect(kernel_sock, (struct sockaddr*)&svr1, len);
        if (i == 0)
-       fcntl(kernel_sock, F_SETFL, O_NONBLOCK|fcntl(kernel_sock, F_GETFL, 0));
+               fcntl(kernel_sock, F_SETFL, O_NONBLOCK|fcntl(kernel_sock, F_GETFL, 0));
        on = 1;
-       setsockopt(kernel_sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on,
-                                                               sizeof(on));
+       setsockopt(kernel_sock, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on));
        m.msg_type = MSG_NET;
        m.param.pword[0] = NET_NODE;
        m.param.pword[1] = MyNode;
@@ -187,7 +190,7 @@ NETMOD::NETMOD(char *kernel_name)
 
 /*#####################  Load configuration ##########################*/
 
-void NETMOD::load_config(char *fname)
+void NETMOD::load_config(const char *fname)
 {
        config_t cfg;
        config_setting_t *setting;
@@ -200,8 +203,7 @@ void NETMOD::load_config(char *fname)
        /* Hack for checking if file exists without using external libs.*/
        FILE * file = fopen(fname, "rt");
        if (!file) {
-               fprintf(stderr, "Error: Cannot load configuration file %s!\n",
-                                                                       fname);
+               fprintf(stderr, "[Error]/Lognet: Cannot load configuration file %s!\n", fname);
                write_at_console("Cannot load configuration file!");
                fclose(file);
                exit(3);
@@ -246,8 +248,7 @@ void NETMOD::load_config(char *fname)
                        break;
                case CONFIG_TYPE_ARRAY:
                        strncpy(pomlink->addr,
-                               config_setting_get_string_elem(setting, 0),
-                                                                       255);
+                               config_setting_get_string_elem(setting, 0), 255);
                        break;
                default:
                        fprintf(stderr, "%s! In file %s, bad entry type for %s."
@@ -385,7 +386,7 @@ void NETMOD::check_node(int n, int sc)
                        strcpy(m.param.pstr, pomlink->addr);
                        break;
                }
-               pomlink = Links.next();
+               pomlink = Links.takeFirst();
        }
        write(sc, &m, sizeof(MESSAGE));
 }
@@ -403,7 +404,7 @@ void NETMOD::get_internal()
        int sj;
        fd_set readset;
        fd_set writeset;
-       struct timeval tout={0, 0};
+       struct timeval tout= {0, 0};
        INTlink *pomlink;
        struct sockaddr_un svr;
 
@@ -418,7 +419,7 @@ void NETMOD::get_internal()
                if (nrset < pomlink->sock) {
                        nrset = pomlink->sock;
                }
-               pomlink = Interpreters.next();
+               pomlink = Interpreters.takeFirst();
        }
 
        if (select(nrset + 1, &readset, &writeset, 0, (struct timeval *)&tout) >
@@ -450,7 +451,7 @@ void NETMOD::get_internal()
                                        }
                                }
                        } /* ISSET */
-                       pomlink=Interpreters.next();
+                       pomlink=Interpreters.takeFirst();
                } // while
 
                /* Check internal socket */
@@ -508,7 +509,7 @@ void NETMOD::get_internal()
                                                pomlink = findINTlink(msg.param.pword[1]);
                                                if (pomlink != NULL) {
                                                        close(pomlink->sock);
-                                                       Interpreters.remove(pomlink);
+                                                       Interpreters.removeOne(pomlink);
                                                }
                                                };
                                                break;
@@ -614,7 +615,7 @@ void NETMOD::get_message(NETlink *lnk)
                                                msg.param.pword[1]);
                                        write_at_console(pomstr);
                                        ::close(lnk->sock);
-                                       Links.remove(lnk);
+                                       Links.removeOne(lnk);
                                        delete lnk;
                                        break;
                                case NET_PROPAGATE:
@@ -652,7 +653,7 @@ void NETMOD::remote_messages()
                                max = pomlink->sock;
                        }
                }
-               pomlink=Links.next();
+               pomlink=Links.takeFirst();
        }
 
        if (select(max + 1, &rset, &wset, 0, (struct timeval *)&tout) > 0) {
@@ -661,7 +662,7 @@ void NETMOD::remote_messages()
                        if (FD_ISSET(pomlink->sock,&rset)) {
                                get_message(pomlink);
                        }
-                       pomlink=Links.next();
+                       pomlink=Links.takeFirst();
                }
        }
 }
@@ -690,7 +691,7 @@ void NETMOD::doitall() {
                if (max < pomlink2->sock) {
                        max=pomlink2->sock;
                }
-               pomlink2 = Interpreters.next();
+               pomlink2 = Interpreters.takeFirst();
        }
        pomlink = Links.first();
        while (pomlink != NULL) {
@@ -700,7 +701,7 @@ void NETMOD::doitall() {
                                max = pomlink->sock;
                        }
                }
-               pomlink=Links.next();
+               pomlink=Links.takeFirst();
        }
 
        /* odczyt */
@@ -751,7 +752,7 @@ void NETMOD::doitall() {
                                        }
                                }
                        }/* ISSET */
-                       pomlink2 = Interpreters.next();
+                       pomlink2 = Interpreters.takeFirst();
                }/* while */
 
                /* Check internal socket */
@@ -806,7 +807,7 @@ void NETMOD::doitall() {
                                                pomlink2 = findINTlink(msg.param.pword[1]);
                                                if (pomlink2 != NULL) {
                                                        close(pomlink2->sock);
-                                                       Interpreters.remove(pomlink2);
+                                                       Interpreters.removeOne(pomlink2);
                                                }
                                                };
                                                break;
@@ -821,7 +822,7 @@ void NETMOD::doitall() {
                while (pomlink != NULL) {
                        if (FD_ISSET(pomlink->sock, &rset))
                                get_message(pomlink);
-                       pomlink=Links.next();
+                       pomlink=Links.takeFirst();
                }
        } // select 
 }
@@ -858,7 +859,7 @@ void NETMOD::connect_seq(char *a)
        while (pom != NULL) {
                if (strcmp(pom->addr, a) == 0)
                        return;
-               pom = Links.next();
+               pom = Links.takeFirst();
        }
        pom = new NETlink;
        strcpy(pom->addr, a);
@@ -912,7 +913,7 @@ void NETMOD::check_links()
                                        sock_reopen(pomlink);
                                }
                        } /* not connected */
-                       pomlink = Links.next();
+                       pomlink = Links.takeFirst();
                } /* while */
        } /* if */
        all_connected = TRUE;
@@ -922,7 +923,7 @@ void NETMOD::check_links()
                        all_connected = FALSE;
                        break;
                }
-               pomlink = Links.next();
+               pomlink = Links.takeFirst();
        }
 }
 
@@ -979,7 +980,7 @@ void NETMOD::send_to_all(MESSAGE *msg)
        pomlink = Links.first();
        while (pomlink != NULL) {
                write(pomlink->sock, msg, sizeof(MESSAGE));
-               pomlink = Links.next();
+               pomlink = Links.takeFirst();
        }
 }
 
@@ -1006,7 +1007,7 @@ void NETMOD::exit_sequence()
        pomlink = Links.first();
        while (pomlink != NULL) {
                ::close(pomlink->sock);
-               pomlink = Links.next();
+               pomlink = Links.takeFirst();
        }
        exit(0);
 }
@@ -1024,12 +1025,12 @@ void NETMOD::disconnect_seq()
        p = Links.first();
        while(p != NULL) {
                send_to_node(p, &m);
-               p=Links.next();
+               p=Links.takeFirst();
        }
        p = Links.first();
        while(p != NULL) {
                ::close(p->sock);
-               p = Links.next();
+               p = Links.takeFirst();
        }
        Links.clear();
 }
@@ -1042,7 +1043,7 @@ NETlink * NETMOD::findNETlink(int node)
                if (pomlink->node_number == node)
                        return pomlink;
 
-               pomlink = Links.next();
+               pomlink = Links.takeFirst();
        } 
        return pomlink;
 }
@@ -1054,7 +1055,7 @@ INTlink * NETMOD::findINTlink(int id)
        while(pomlink != NULL) {
                if (pomlink->ID == id)
                        return pomlink;
-               pomlink = Interpreters.next();
+               pomlink = Interpreters.takeFirst();
        }
        return pomlink;
 }
@@ -1215,7 +1216,7 @@ void NETMOD::conn_info(int sk)
                        write(sk, &m, sizeof(MESSAGE));
                        k = 0;
                }
-               pom = Links.next();
+               pom = Links.takeFirst();
        }
        if (k > 0) {
                m.param.pword[1] = k;
@@ -1226,9 +1227,22 @@ void NETMOD::conn_info(int sk)
        write(sk, &m, sizeof(MESSAGE));
 }
 
+/**
+ * argv0 = program current path
+ * argv1 = socket path
+ * argv2 = config path
+ */
 int main(int argc, char **argv)
 {
-       NETMOD netter(argv[1]);
+       if (argc < 3) {
+               return 1;
+       }
+
+       fprintf(stderr, "lognet: Net module path: %s\n", argv[0]);
+       fprintf(stderr, "lognet: Kernel socket: %s\n", argv[1]);
+       fprintf(stderr, "lognet: Configuration file: %s\n", argv[2]);
+
+       NETMOD netter(argc, argv);
        netter.run();
        return 0;
 }