Catch CTRL-C event in user mode
[mgsmtp.git] / MgSMTP.pas
index 08eaa2ac4650858c3ad2cffc348cfa2c3ed7d103..1cee11968ec66ea4e05e193e5620f9e3193102da 100644 (file)
@@ -1,6 +1,6 @@
 {
    MegaBrutal's SMTP Server (MgSMTP)
-   Copyright (C) 2010-2014 MegaBrutal
+   Copyright (C) 2010-2016 MegaBrutal
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
@@ -49,7 +49,7 @@ const
      document what bugfix/feature are you testing with the actual build.
      This will be logged to help you differentiate outputs of subsequent
      builds in your logs. If left empty, it won't be added to the logs. }
-   DEVCOMMENT  =  'Release Candidate 1';
+   DEVCOMMENT  =  'Catch CTRL-C in user mode';
 
 var
 
@@ -130,6 +130,16 @@ begin
    end;
 end;
 
+function ConsoleCtrlHandler(Signal: dword): longbool; stdcall;
+{ Handle CTRL-C event in user mode. }
+begin
+   if Signal = CTRL_C_EVENT then begin
+      Out.writeln('Caught CTRL-C signal.');
+      Stopping:= true;
+   end;
+   Result:= true;
+end;
+
 procedure Service(Argc: dword; Argv: pointer); stdcall;
 var ProposedExitCode: integer;
 begin
@@ -302,13 +312,14 @@ begin
       else begin
          if Cmdline.IsPresent('USERMODE') then begin
             Out.writeln('Starting MgSMTP in user mode...');
+            SetConsoleCtrlHandler(ConsoleCtrlHandler, true);
             Service(0, nil);
          end
          else begin
             Out.writeln('Trying to contact Service Control Manager...');
             Out.writeln('(If you see this message on console, you tried to');
             Out.writeln('start up the program incorrectly. Your current');
-            Out.writeln('attempt will fail, or it may hang under Wine.');
+            Out.writeln('attempt will fail, or it may hang under Wine.)');
             Out.writeln;
             ServiceMode:= true;
             if not StartServiceCtrlDispatcher(ServiceTable) then begin