Index: trunk/Makefile.in
===================================================================
--- trunk/Makefile.in	(revision 108)
+++ trunk/Makefile.in	(revision 109)
@@ -1688,3 +1688,3 @@
 sh_async.o: $(srcsrc)/sh_async.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_calls.h $(srcinc)/sh_error.h 
 sh_processcheck.o: $(srcsrc)/sh_processcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_extern.h $(srcinc)/sh_calls.h $(srcinc)/CuTest.h 
-sh_portcheck.o: $(srcsrc)/sh_portcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_mem.h $(srcinc)/sh_utils.h $(srcinc)/sh_modules.h $(srcinc)/CuTest.h 
+sh_portcheck.o: $(srcsrc)/sh_portcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_mem.h $(srcinc)/sh_calls.h $(srcinc)/sh_utils.h $(srcinc)/sh_modules.h $(srcinc)/CuTest.h 
Index: trunk/depend.dep
===================================================================
--- trunk/depend.dep	(revision 108)
+++ trunk/depend.dep	(revision 109)
@@ -62,3 +62,3 @@
 sh_async.o: $(srcsrc)/sh_async.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_calls.h $(srcinc)/sh_error.h 
 sh_processcheck.o: $(srcsrc)/sh_processcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_modules.h $(srcinc)/sh_processcheck.h $(srcinc)/sh_utils.h $(srcinc)/sh_error.h $(srcinc)/sh_extern.h $(srcinc)/sh_calls.h $(srcinc)/CuTest.h 
-sh_portcheck.o: $(srcsrc)/sh_portcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_mem.h $(srcinc)/sh_utils.h $(srcinc)/sh_modules.h $(srcinc)/CuTest.h 
+sh_portcheck.o: $(srcsrc)/sh_portcheck.c Makefile config_xor.h $(srcinc)/samhain.h $(srcinc)/sh_error.h $(srcinc)/sh_mem.h $(srcinc)/sh_calls.h $(srcinc)/sh_utils.h $(srcinc)/sh_modules.h $(srcinc)/CuTest.h 
Index: trunk/depend.sum
===================================================================
--- trunk/depend.sum	(revision 108)
+++ trunk/depend.sum	(revision 109)
@@ -1,1 +1,1 @@
-3139738957
+4114523250
Index: trunk/src/sh_portcheck.c
===================================================================
--- trunk/src/sh_portcheck.c	(revision 108)
+++ trunk/src/sh_portcheck.c	(revision 109)
@@ -39,4 +39,5 @@
 #include <errno.h>
 #include <unistd.h>
+#include <fcntl.h>
 
 #define PORTCHK_VERSION "1.0"
@@ -110,4 +111,5 @@
 #include "sh_error.h"
 #include "sh_mem.h"
+#include "sh_calls.h"
 #include "sh_utils.h"
 #include "sh_modules.h"
@@ -676,4 +678,5 @@
   /* struct in_addr     haddr; */
   int                retval;
+  int                flags;
   char             * p;
 #ifndef TEST_ONLY
@@ -728,4 +731,49 @@
 	fprintf(stderr, _("check port: %5d on %15s open %s\n"), 
 		port, inet_ntoa(haddr), p);
+
+#if !defined(O_NONBLOCK)
+#if defined(O_NDELAY)
+#define O_NONBLOCK  O_NDELAY
+#else
+#define O_NONBLOCK  0
+#endif
+#endif
+
+      /* prepare to close connection gracefully
+       */
+      if      (port == 22)  /* ssh */
+	{
+	  flags = retry_fcntl(FIL__, __LINE__, fd, F_GETFL, 0);
+	  retry_fcntl(FIL__, __LINE__, fd, F_SETFL, flags | O_NONBLOCK);
+	  write (fd, _("SSH-2.0-Foobar"), 14);
+	  write (fd, "\r\n", 2);
+	}
+      else if (port == 25)  /* smtp */
+	{
+	  flags = retry_fcntl(FIL__, __LINE__, fd, F_GETFL, 0);
+	  retry_fcntl(FIL__, __LINE__, fd, F_SETFL, flags | O_NONBLOCK);
+	  write (fd, _("QUIT"), 4);
+	  write (fd, "\r\n", 2);
+	}
+      else if (port == 79)  /* finger */
+	{
+	  flags = retry_fcntl(FIL__, __LINE__, fd, F_GETFL, 0);
+	  retry_fcntl(FIL__, __LINE__, fd, F_SETFL, flags | O_NONBLOCK);
+	  write (fd, "\r\n", 2);
+	}
+      else if (port == 110) /* pop3 */
+	{
+	  flags = retry_fcntl(FIL__, __LINE__, fd, F_GETFL, 0);
+	  retry_fcntl(FIL__, __LINE__, fd, F_SETFL, flags | O_NONBLOCK);
+	  write (fd, _("QUIT"), 4);
+	  write (fd, "\r\n", 2);
+	}
+      else if (port == 143) /* imap */
+	{
+	  flags = retry_fcntl(FIL__, __LINE__, fd, F_GETFL, 0);
+	  retry_fcntl(FIL__, __LINE__, fd, F_SETFL, flags | O_NONBLOCK);
+	  write (fd, _("A01 LOGOUT"), 10);
+	  write (fd, "\r\n", 2);
+	}
      }
   close (fd);
