diff -urN monit-4.7.org/l.l monit-4.7/l.l
--- monit-4.7.org/l.l	2006-01-09 06:36:30.000000000 +0900
+++ monit-4.7/l.l	2006-02-22 17:55:12.000000000 +0900
@@ -201,6 +201,7 @@
 rdate             { return RDATE; }
 rsync             { return RSYNC; }
 tns               { return TNS; }
+pgsql             { return PGSQL; }
 mode              { return MODE; }
 active            { return ACTIVE; }
 passive           { return PASSIVE; }
diff -urN monit-4.7.org/protocols/pgsql.c monit-4.7/protocols/pgsql.c
--- monit-4.7.org/protocols/pgsql.c	1970-01-01 09:00:00.000000000 +0900
+++ monit-4.7/protocols/pgsql.c	2006-02-22 18:55:51.000000000 +0900
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C), 2000-2006 by the monit project group.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <config.h>
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "protocol.h"
+
+/**
+ *  PostgreSQL test.
+ *
+ *  @author Tatsuya Nonogaki, <http://www.asahi-net.or.jp/~aa4t-nngk/>
+ *
+ *  @version \$Id: pgsql.c,v 0.4 2006/02/22 18:55:00 $
+ *
+ *  @file
+ */
+int check_pgsql(Socket_T s) {
+
+  unsigned char buf[STRLEN];
+
+  unsigned char requestLogin[33] = {
+    0x00,                              /** Length */
+    0x00,
+    0x00,
+    0x21,
+
+    0x00,                              /** ProtoVer 3.0 */
+    0x03,
+    0x00,
+    0x00,
+
+    0x75, 0x73, 0x65, 0x72, 0x00,      /** user */
+    0x72, 0x6f, 0x6f, 0x74, 0x00,      /** root */
+
+    0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x00,  /** database */
+    0x72, 0x6f, 0x6f, 0x74, 0x00,                          /** root */
+
+    0x00
+  };
+
+  /** Doing this is too suspicious maybe.
+   * Type Q, Length 20 and QUERY select 1 as a; */
+  /**
+  unsigned char requestQuery[20] = {
+    0x51,
+
+    0x00,
+    0x00,
+    0x00,
+    0x13,
+
+    0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20,
+    0x31, 0x20, 0x61, 0x73, 0x20, 0x61, 0x3b,
+
+    0x00
+  };
+  */
+
+  unsigned char requestTerm[5] = {
+    0x58,                              /** Type X */
+
+    0x00,                              /** Length */
+    0x00,
+    0x00,
+    0x04
+  };
+
+  unsigned char responseAuthOk[9] = {
+    0x52,                              /** Type R */
+
+    0x00,                              /** Length */
+    0x00,
+    0x00,
+    0x08,
+
+    0x00,                              /** OK code 0 */
+    0x00,
+    0x00,
+    0x00
+  };
+
+  ASSERT(s);
+
+  if(socket_write(s, (unsigned char *)requestLogin, sizeof(requestLogin)) <= 0) {
+    log("PGSQL: error sending data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /** Nine-byte is enough to hold Auth-Ok */
+  if(socket_read(s, buf, 9) <= 0) {
+    log("PGSQL: error receiving data -- %s\n", STRERROR);
+    return FALSE;
+  }
+
+  /** If server insists on auth error it is working anyway */
+  if(*buf=='E') {
+    return TRUE;
+  }
+
+  /** Successful connection */
+  if(!memcmp((unsigned char *)buf, (unsigned char *)responseAuthOk, 9)) {
+    /** This is where suspicious people can do SELECT query that I dont */
+    socket_write(s, (unsigned char *)requestTerm, sizeof(requestTerm));
+    return TRUE;
+  }
+
+  /** The last possibility must be that server is demanding password */
+  if(*buf=='R') {
+    return TRUE;
+  }
+
+  log("PGSQL: unknown error\n");
+  return FALSE;
+}
+
diff -urN monit-4.7.org/protocols/protocol.c monit-4.7/protocols/protocol.c
--- monit-4.7.org/protocols/protocol.c	2006-01-09 06:36:31.000000000 +0900
+++ monit-4.7/protocols/protocol.c	2006-02-22 17:55:12.000000000 +0900
@@ -54,6 +54,7 @@
 static Protocol_T myrdate= NULL;
 static Protocol_T myrsync= NULL;
 static Protocol_T mytns= NULL;
+static Protocol_T mypgsql= NULL;
 
 
 /**
@@ -93,6 +94,7 @@
   FREE(myrdate);
   FREE(myrsync);
   FREE(mytns);
+  FREE(mypgsql);
 
 }
 
@@ -296,3 +298,13 @@
   return mytns;
 }
 
+
+void *create_pgsql() {
+  if(mypgsql == NULL) {
+    NEW(mypgsql);
+    mypgsql->name= "PGSQL";
+    mypgsql->check= check_pgsql;
+  }
+  return mypgsql;
+}
+
diff -urN monit-4.7.org/protocols/protocol.h monit-4.7/protocols/protocol.h
--- monit-4.7.org/protocols/protocol.h	2006-01-09 06:36:32.000000000 +0900
+++ monit-4.7/protocols/protocol.h	2006-02-22 17:55:12.000000000 +0900
@@ -47,6 +47,7 @@
 #define P_DNS            18
 #define P_POSTFIXPOLICY  19
 #define P_TNS            20
+#define P_PGSQL          21
 
 void  gc_protocols();
 
@@ -71,6 +72,7 @@
 void* create_rdate();
 void* create_rsync();
 void* create_tns();
+void* create_pgsql();
 
 /* "Package" locale Protocol routines */
 int check_apache_status(Socket_T);
@@ -93,6 +95,7 @@
 int check_rdate(Socket_T);
 int check_rsync(Socket_T);
 int check_tns(Socket_T);
+int check_pgsql(Socket_T);
 
 
 #endif
diff -urN monit-4.7.org/p.y monit-4.7/p.y
--- monit-4.7.org/p.y	2006-01-09 06:36:31.000000000 +0900
+++ monit-4.7/p.y	2006-02-22 17:55:12.000000000 +0900
@@ -253,7 +253,7 @@
 %token ALERT MAILFORMAT UNIXSOCKET SIGNATURE
 %token TIMEOUT RESTART CHECKSUM EXPECT EVERY 
 %token DEFAULT HTTP APACHESTATUS FTP SMTP POP IMAP NNTP NTP3 MYSQL DNS
-%token SSH DWP LDAP2 LDAP3 RDATE RSYNC TNS POSTFIXPOLICY
+%token SSH DWP LDAP2 LDAP3 RDATE RSYNC TNS PGSQL POSTFIXPOLICY
 %token <string> STRING PATH MAILADDR MAILFROM MAILSUBJECT
 %token <string> MAILBODY SERVICENAME STRINGNAME
 %token <number> NUMBER PERCENT LOGLIMIT CLOSELIMIT DNSLIMIT KEEPALIVELIMIT 
@@ -923,6 +923,9 @@
                 | PROTOCOL TNS {
                     portset.protocol= addprotocol(P_TNS);
                   }
+                | PROTOCOL PGSQL {
+                    portset.protocol= addprotocol(P_PGSQL);
+                  }
                 | sendexpectlist {
                     portset.protocol= addprotocol(P_GENERIC);
                   }
@@ -2428,6 +2431,7 @@
   case P_RDATE:         return create_rdate();
   case P_RSYNC:         return create_rsync();
   case P_TNS:           return create_tns();
+  case P_PGSQL:         return create_pgsql();
   }
 
   return create_default();
