add -fPIC option to the C compiler, required in f31
[vsys.git] / main.ml
diff --git a/main.ml b/main.ml
index a70a473..7f91dbf 100644 (file)
--- a/main.ml
+++ b/main.ml
@@ -15,43 +15,57 @@ let cmdspeclist =
   [
     ("-daemon",Arg.Set(daemonize), "Daemonize");
     ("-conffile",Arg.Set_string(Globals.conffile), "Config file");
+    ("-logfile",Arg.Set_string(Globals.log_filepath), "Log file");
     ("-backend",Arg.Set_string(Globals.backend), "Backend directory");
-    ("-frontend",Arg.Tuple[Arg.String(fun s->cur_dir:=s);Arg.String(fun s->cur_slice:=s;input_file_list:=(!cur_dir,!cur_slice)::!input_file_list)], "frontendN,slicenameN");
-    ("-nochroot",Arg.Set(Globals.nochroot), "Run in non-chroot environment")
+    ("-frontend",Arg.Tuple[Arg.String(fun s->cur_dir:=s);
+                           Arg.String(fun s->cur_slice:=s;
+                                             input_file_list:=(!cur_dir,!cur_slice)::!input_file_list)], 
+     "frontendN,slicenameN");
+    ("-nochroot",Arg.Set(Globals.nochroot), "Run in non-chroot environment");
+    ("-failsafe",Arg.Set(Globals.failsafe), "Never crash. Be stupid, but never crash. Use at your own risk.");
   ]
 
-let cont = ref true
+let sighup_handle s =
+  print "Received sighup. Running GC major pass";
+  Gc.major ()
 
 let _ =
-  printf "Vsys v%s\n" Globals.vsys_version;flush stdout;
   Arg.parse cmdspeclist (fun x->()) "Usage: vsys <list of mount points>";  
+  Globals.logfd:=open_out_gen [Open_append;Open_creat] 0o644 !log_filepath;
   if (!Globals.backend == "") then
-      printf "Try vsys --help\n"
+    printf "Try vsys --help\n"
   else
     begin
+      logprint "Starting Vsys v%s\n" Globals.vsys_version;
       if (!daemonize) then
         begin
-          printf "Daemonizing\n";flush Pervasives.stdout;
-        let child = Unix.fork () in
-          if (child <> 0) then
-            begin
+          print "Daemonizing\n";
+          let child = Unix.fork () in
+            if (child <> 0) then
+              begin
                 let pidfile = open_out !Globals.pid_filepath in
                   fprintf pidfile "%d" child;
-                    close_out pidfile;
-                    exit(0)
-            end
-          end;
+                  close_out pidfile;
+                  exit(0)
+              end
+        end;
 
-            Dirwatcher.initialize ();
-            Directfifowatcher.initialize ();
+      Dirwatcher.initialize ();
+      Directfifowatcher.initialize ();
 
-            if (!Globals.conffile <> "") then
-              begin
-              let frontends = Conffile.read_frontends !Globals.conffile in
-                input_file_list:=List.concat [!input_file_list;frontends]
-              end;
+      if (!Globals.conffile <> "") then
+        begin
+          let frontends = Conffile.read_frontends !Globals.conffile in
+            input_file_list:=List.concat [!input_file_list;frontends]
+        end;
+
+      Sys.set_signal Sys.sigusr1 (Sys.Signal_handle sighup_handle);
 
-            let felst = List.map (fun lst->let (x,y)=lst in printf "Slice %s (%s)\n" x y;flush logfd;new frontendHandler lst) !input_file_list in
-                let _ = new backendHandler !Globals.backend felst in
-                 Fdwatcher.start_watch ()
+      let felst = List.map 
+                    (fun lst->let (x,y)=lst in 
+                       logprint "Slice %s (%s)\n" x y;
+                       new frontendHandler lst) 
+                    !input_file_list in
+      let _ = new backendHandler !Globals.backend felst in
+        Fdwatcher.start_watch ()
     end