Fixes: vlp-17.
[vlp.git] / src / kernel / kernel.cpp
index 7ca1ec2de9a4a0d652cf3e81891d554c954b6119..e747d1e97083c559f5b94b84b3f4a581fa31030e 100644 (file)
 #include <unistd.h>
 #include <fcntl.h>
 
-#include "../head/genint1.h"
-#include "../head/comm.h"
+#include "genint1.h"
+#include "comm.h"
 #include "socu.h"
 #include <netinet/in.h>
 
+#include <libconfig.h>
+
 #define GPATH "loggr"
 #define IPATH "logi"
 #define NPATH "logn"
@@ -181,7 +183,7 @@ private:
   bool info_messages;
   
 
-  void LoadConfig();
+  void LoadConfig(char *);
   void RunGraphModule(char*);
   void RunNetModule();
   InterpEntry *findINTbySocket(int);
@@ -262,7 +264,7 @@ QKernel::QKernel()
  freeINTid = 1;
  ActiveConnections = 0;
  strcpy(LockPasswd,"");
- LoadConfig();
+ LoadConfig("vlp.cfg");
  RunNetModule();
 
  Net_Notify = new QSocketNotifier(net_sock,QSocketNotifier::Read,this);
@@ -289,36 +291,108 @@ void QKernel::n_impl()
 
 /* ###########     load configuration from file  ############# */
 
-void QKernel::LoadConfig()
+void QKernel::LoadConfig(char * fname)
 {
-QFile f("vlp.cfg");
- QString line;
- QString val;
- int br=0;
+  config_t cfg;
+  config_setting_t *setting;
+  const char *str;
+
+  /* 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);
+    exit(3);
+  }
+  /* File exists, so file has been locked. Release it. */
+  
+  config_init(&cfg);
+  
+  /* Read the file. If there is an error, report it and exit. */
+  if(!config_read(&cfg, file))
+  {
+    fprintf(stderr, "%s! In file %s, line %d\n",
+        config_error_text(&cfg),
+        config_error_file(&cfg),
+        config_error_line(&cfg));
+    config_destroy(&cfg);
+    fclose(file);
+    exit(3);/* from original code. */
+  }
 
- if (!f.exists())
- {
-  WriteMessage("Cannot load configuration file!");sleep(2);exit(3);
+  setting = config_lookup(&cfg, "node_number");
 if(setting) {
+    NodeNumber = config_setting_get_int(setting);
   }
- 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") {NodeNumber = val.toInt();};
-  if (line == "type") {if (val=="explicit") ConType=1; else
-                               ConType = 2; };
-  if (line == "host" ) {ConnectList.append(new ConnectEntry((char*)val.ascii()));};
-  if (line == "progdir") { strcpy(progdir,val.ascii());};
-  if (line == "homedir") { strcpy(HomeDir,val.ascii());};
-  br = f.readLine(line,256);
- }
- f.close();
+  else {
+    fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
+        "Warning",
+        fname,
+        "node_number");
+    config_destroy(&cfg);
+    fclose(file);
+    exit(3);
+  }
+  
+  setting = config_lookup(&cfg, "type");
+  if(setting) {
+    ConType = (strcmp(config_setting_get_string(setting), "explicit") == 0) ? 1 : 2;
+  }
+  else {
+    fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
+        "Warning",
+        fname,
+        "type");
+  }
+  
+  setting = config_lookup(&cfg, "host");
+  if(setting) {
+    switch(config_setting_type(setting)) {
+      case CONFIG_TYPE_STRING:/* TODO: Deprecated. Made for back compatibility. */
+        ConnectList.append(new ConnectEntry((char*)config_setting_get_string(setting)));
+        break;
+      case CONFIG_TYPE_ARRAY:
+        for (int i = 0; i < config_setting_length(setting); i++) {
+          ConnectList.append(new ConnectEntry((char*)config_setting_get_string_elem(setting, i)));
+        }
+        break;
+      default:
+        fprintf(stderr, "%s! In file %s, bad entry type for %s. Will not be read.\n",
+        "Error",
+        fname,
+        "host");
+    }
+  }
+  else {
+    fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
+        "Warning",
+        fname,
+        "host");
+  }
+  
+  setting = config_lookup(&cfg, "progdir");
+  if(setting){
+    strncpy(progdir, config_setting_get_string(setting), 256);
+  }
+  else {
+    fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
+        "Warning",
+        fname,
+        "progdir");
+  }
+  
+  setting = config_lookup(&cfg, "homedir");
+  if(setting) {
+    strncpy(HomeDir, config_setting_get_string(setting), 255);
+  }
+  else {
+    fprintf(stderr, "%s! In file %s, '%s' was not found.\n",
+        "Warning",
+        fname,
+        "homedir");
+  }
+  
+  config_destroy(&cfg);
+  fclose(file);
 }
 /* +++++++++++++++++++++++++++++++++++++++++++++++ */
 
@@ -839,9 +913,7 @@ void QKernel::SetMessages()
 void QKernel::SetOptions()
 {
   QDialog dlg(this,"Options",TRUE);
-  QFile *vlp_file;
   ConnectEntry *e;
-  char line[256];
   unsigned int i;
 
 
@@ -929,31 +1001,43 @@ void QKernel::SetOptions()
        dlg.resize( 400, 310 );
         if (dlg.exec())
    {
-    unlink("vlp.cfg");
-    vlp_file = new QFile("vlp.cfg");
-    vlp_file->open(IO_WriteOnly);
-    sprintf(line,"progdir=%s\n",progs->text().ascii());
-    vlp_file->writeBlock(line,strlen(line));
-    strcpy(progdir,progs->text());  
-    sprintf(line,"node_number=%d\n",atoi(nn->text()));
-    vlp_file->writeBlock(line,strlen(line));
+
+    config_t cfg;
+    config_setting_t *root, *setting;
+    config_init(&cfg);
+
+    root = config_root_setting(&cfg);
+    
+    setting = config_setting_add(root, "progdir", CONFIG_TYPE_STRING);
+    config_setting_set_string(setting, progs->text().ascii());
+    strcpy(progdir,progs->text());
+
+    setting = config_setting_add(root, "node_number", CONFIG_TYPE_INT);
+    config_setting_set_int(setting, atoi(nn->text()));
+    
+    setting = config_setting_add(root, "homedir", CONFIG_TYPE_STRING);
+    config_setting_set_string(setting, HomeDir);
+    
+    setting = config_setting_add(root, "type", CONFIG_TYPE_STRING);
     if ( exp->isChecked())
     {
-    sprintf(line,"type=explicit\n");
-    vlp_file->writeBlock(line,strlen(line));
-    for(i=0;i<connections->count();i++)
-     {
-      sprintf(line,"host=%s\n",connections->text(i).ascii());
-      vlp_file->writeBlock(line,strlen(line));
-     }
+      config_setting_set_string(setting, "explicit");
+      
+      config_setting_t *hosts = NULL;
+      hosts = config_setting_add(root, "host", CONFIG_TYPE_ARRAY);
+      for(i=0;i<connections->count();i++) {
+        setting = config_setting_add(hosts, NULL, CONFIG_TYPE_STRING);
+        config_setting_set_string(setting, connections->text(i).ascii());
+      }
+    }
+    else {
+      config_setting_set_string(setting, "register");
+    }
     
+    if(!config_write_file(&cfg, "vlp.cfg")) {
+      fprintf(stderr, "Error while writing to file: %s.\n", "vlp.cfg");
     }
-     else
-    { 
-    sprintf(line,"type=register\n");
-    vlp_file->writeBlock(line,strlen(line));
-    } 
-    vlp_file->close();
+    config_destroy(&cfg);
     };
 }