diff options
| -rw-r--r-- | system_log.adb | 39 | ||||
| -rw-r--r-- | test/test_system_log.adb | 6 | 
2 files changed, 28 insertions, 17 deletions
| diff --git a/system_log.adb b/system_log.adb index 2755501..e77c95d 100644 --- a/system_log.adb +++ b/system_log.adb @@ -1,5 +1,5 @@  -- System_Log, a binding to the Unix syslog functions --- Copyright 2009 - 2013 B. Persson, Bjorn@Rombobeorn.se +-- Copyright 2009 - 2017 B. Persson, Bjorn@Rombobeorn.se  --  -- This library is free software: you can redistribute it and/or modify it  -- under the terms of the GNU General Public License version 3, as published @@ -7,12 +7,13 @@  with Interfaces.C.Strings; use Interfaces.C; use Interfaces.C.Strings; -with Ada.Unchecked_Conversion;  package body System_Log is -   Facility_Numbers : constant array(Log_Facility) of int := +   subtype Facility_Number is int range 0 .. 23 * 8; + +   Facility_Numbers : constant array(Log_Facility) of Facility_Number :=        (Kernel   =>  0 * 8,   -- LOG_KERN         User     =>  1 * 8,   -- LOG_USER         Mail     =>  2 * 8,   -- LOG_MAIL @@ -33,7 +34,9 @@ package body System_Log is         Local6   => 22 * 8,   -- LOG_LOCAL6         Local7   => 23 * 8);  -- LOG_LOCAL7 -   Level_Numbers : constant array(Log_Level) of int := +   subtype Level_Number is Natural range 0 .. 7; + +   Level_Numbers : constant array(Log_Level) of Level_Number :=        (Emergency => 0,   -- LOG_EMERG         Alert     => 1,   -- LOG_ALERT         Critical  => 2,   -- LOG_CRIT @@ -98,17 +101,21 @@ package body System_Log is        function setlogmask(mask : int) return int;        pragma Import(C, setlogmask, "setlogmask"); -      Bits : constant := Log_Level'Pos(Log_Level'Last) + 1; -      type Mask is range 0 .. 2 ** Bits - 1; -      for Mask'Size use Bits; -      function To_Mask is new Ada.Unchecked_Conversion(Source => Log_Levels, -                                                       Target => Mask); -      function To_Levels is new Ada.Unchecked_Conversion(Source => Mask, -                                                         Target => Log_Levels); +      New_Mask : int := 0; +      Old_Mask : unsigned;     begin -      -- Convert the input array of Boolean to a number, pass that to -      -- setlogmask, and convert the output in the other direction. -      Old_Levels := To_Levels(Mask(setlogmask(int(To_Mask(New_Levels))))); +      -- Convert the input array of Boolean to a number. +      for L in Log_Levels'Range loop +         if New_Levels(L) then +            New_Mask := New_Mask + 2 ** Level_Numbers(L); +         end if; +      end loop; +      -- Pass that number to setlogmask and get the previous mask back. +      Old_Mask := unsigned(setlogmask(New_Mask)); +      -- Convert the output number to an array of Boolean. +      for L in Log_Levels'Range loop +         Old_Levels(L) := (Old_Mask and 2 ** Level_Numbers(L)) /= 0; +      end loop;     end Set_Log_Levels; @@ -131,7 +138,7 @@ package body System_Log is     procedure Log(Level : in Log_Level; Message : in String) is     begin -      syslog(Level_Numbers(Level), Simple_Format, To_C(Message)); +      syslog(int(Level_Numbers(Level)), Simple_Format, To_C(Message));     end Log; @@ -140,7 +147,7 @@ package body System_Log is                   Message  : in String)     is     begin -      syslog(Facility_Numbers(Facility) + Level_Numbers(Level), +      syslog(Facility_Numbers(Facility) + int(Level_Numbers(Level)),               Simple_Format, To_C(Message));     end Log; diff --git a/test/test_system_log.adb b/test/test_system_log.adb index 319c039..5a0a053 100644 --- a/test/test_system_log.adb +++ b/test/test_system_log.adb @@ -1,5 +1,5 @@  -- This is a simple test program for testing System_Log. --- Copyright 2012 B. Persson, Bjorn@Rombobeorn.se +-- Copyright 2009 - 2017 B. Persson, Bjorn@Rombobeorn.se  --  -- This program is free software: you can redistribute it and/or modify it  -- under the terms of the GNU General Public License version 3, as published @@ -14,4 +14,8 @@ begin              Include_PID => True);     Log(Info, "This is a test message on the info level.");     Log(Debug, "This is a test message on the debug level."); +   Set_Log_Threshold(Info); +   Log(Debug, "This test message is below the threshold and shouldn't be seen."); +   Log(Info, "This test message is above the threshold and should be seen."); +   Log(Local5, Info, "This is a test message logged as the Local5 facility.");  end Test_System_Log; |