diff options
Diffstat (limited to 'test/test_milter_package.adb')
-rw-r--r-- | test/test_milter_package.adb | 62 |
1 files changed, 21 insertions, 41 deletions
diff --git a/test/test_milter_package.adb b/test/test_milter_package.adb index fddb5e7..6a8becc 100644 --- a/test/test_milter_package.adb +++ b/test/test_milter_package.adb @@ -13,9 +13,7 @@ with System_Log; use System_Log; with Ada.Unchecked_Deallocation; with Interfaces.C; with Ada.Exceptions; -with Ada.Directories; with Ada.Text_IO; -with GNAT.OS_Lib; package body Test_Milter_Package is @@ -31,8 +29,6 @@ package body Test_Milter_Package is procedure Free is new Ada.Unchecked_Deallocation(Message_Data, Message_Data_Pointer); - Socket_Obstructed : exception; - function Private_Data(Context : SMFICTX_Pointer) return Message_Data_Pointer is @@ -215,48 +211,21 @@ package body Test_Milter_Package is end Handle_Close; - procedure Clean_And_Set_Socket is - Socket_Name : constant String := "/var/spool/test_milter/milter_socket"; - function umask(mask : Interfaces.C.unsigned) return Interfaces.C.unsigned; - pragma import(C, umask); - mask : Interfaces.C.unsigned; -- dummy to soak up the result from umask - pragma Unreferenced(mask); - begin - -- Delete the socket file if it exists, assuming it was left behind - -- because of a crash. - if Ada.Directories.Exists(Socket_Name) then - Log(Warning, Socket_Name & " exists. Deleting it."); - -- GNAT's implementation of Ada.Directories.Delete_File calls a - -- function named Is_Regular_File and refuses to delete a socket file, - -- so GNAT.OS_Lib.Delete_File must be used instead. - -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56055 - declare - OK : Boolean; - begin - GNAT.OS_Lib.Delete_File(Socket_Name, OK); - if not OK then - raise Socket_Obstructed with - Socket_Name & " can't be created because a file with that " & - "name exists and can't be deleted."; - end if; - end; - end if; - -- Clear the permissions mask to allow the MTA to use the socket. - mask := umask(0); - -- Tell the milter library where to create the socket. - Set_Socket("unix:" & Socket_Name); - end Clean_And_Set_Socket; - - function Run return Ada.Command_Line.Exit_Status is use Ada.Exceptions; use Berkeley_Exit_Codes; use Ada.Text_IO; + + function umask(mask : Interfaces.C.unsigned) return Interfaces.C.unsigned; + pragma Import(C, umask); + Dummy : Interfaces.C.unsigned; -- to soak up the result from umask + pragma Unreferenced(Dummy); + + Socket_Name : constant String := "/var/spool/test_milter/milter_socket"; begin Log(Info, "Starting. Milter API version " & Milter_API.Binding_Version_String & ", Libmilter version " & Milter_API.Libmilter_Version_String); - Clean_And_Set_Socket; Register(Name => "test_milter/libmilter", Connected => Handle_Connection'Access, Helo => Handle_Helo'Access, @@ -270,6 +239,20 @@ package body Test_Milter_Package is End_Of_Message => Handle_End_Of_Message'Access, Aborted => Handle_Abort'Access, Closed => Handle_Close'Access); + -- Clear the permissions mask to allow the MTA to use the socket. + Dummy := umask(0); + -- Tell Libmilter where to create the socket. + Set_Socket("unix:" & Socket_Name); + -- Open the socket. Delete any existing socket, assuming it was left + -- behind because of a crash. + begin + Open_Socket(Remove_Old_Socket => True); + exception + when Milter_API.Failure => + -- Libmilter has already logged sufficient error messages. + return Cannot_Create_File; + end; + -- Hand over control to Libmilter. Milter_API.Main; return Ada.Command_Line.Success; exception @@ -279,9 +262,6 @@ package body Test_Milter_Package is when E : Milter_API.Unknown_Error => Log(Error, Exception_Message(E)); return Software_Error; - when E : Socket_Obstructed => - Log(Error, Exception_Message(E)); - return Cannot_Create_File; when E : others => Put_Line(Standard_Error, Exception_Information(E)); Log(Error, |