[MAJOR] rework of the server FSM

srv_state has been removed from HTTP state machines, and states
have been split in either TCP states or analyzers. For instance,
the TARPIT state has just become a simple analyzer.

New flags have been added to the struct buffer to compensate this.
The high-level stream processors sometimes need to force a disconnection
without touching a file-descriptor (eg: report an error). But if
they touched BF_SHUTW or BF_SHUTR, the file descriptor would not
be closed. Thus, the two SHUT?_NOW flags have been added so that
an application can request a forced close which the stream interface
will be forced to obey.

During this change, a new BF_HIJACK flag was added. It will
be used for data generation, eg during a stats dump. It
prevents the producer on a buffer from sending data into it.

  BF_SHUTR_NOW  /* the producer must shut down for reads ASAP  */
  BF_SHUTW_NOW  /* the consumer must shut down for writes ASAP */
  BF_HIJACK     /* the producer is temporarily replaced        */

BF_SHUTW_NOW has precedence over BF_HIJACK. BF_HIJACK has
precedence over BF_MAY_FORWARD (so that it does not need it).

New functions buffer_shutr_now(), buffer_shutw_now(), buffer_abort()
are provided to manipulate BF_SHUT* flags.

A new type "stream_interface" has been added to describe both
sides of a buffer. A stream interface has states and error
reporting. The session now has two stream interfaces (one per
side). Each buffer has stream_interface pointers to both
consumer and producer sides.

The server-side file descriptor has moved to its stream interface,
so that even the buffer has access to it.

process_srv() has been split into three parts :
  - tcp_get_connection() obtains a connection to the server
  - tcp_connection_failed() tests if a previously attempted
    connection has succeeded or not.
  - process_srv_data() only manages the data phase, and in
    this sense should be roughly equivalent to process_cli.

Little code has been removed, and a lot of old code has been
left in comments for now.
diff --git a/include/proto/buffers.h b/include/proto/buffers.h
index 4ceedc0..3b5e2bd 100644
--- a/include/proto/buffers.h
+++ b/include/proto/buffers.h
@@ -47,6 +47,7 @@
 {
 	buf->l = buf->total = 0;
 	buf->analysers = 0;
+	buf->cons = NULL;
 	buf->flags = BF_EMPTY;
 	buf->r = buf->lr = buf->w = buf->data;
 	buf->rlim = buf->data + BUFSIZE;
@@ -89,6 +90,24 @@
 	buf->flags |= BF_SHUTW;
 }
 
+/* marks the buffer as "shutdown" ASAP for reads */
+static inline void buffer_shutr_now(struct buffer *buf)
+{
+	buf->flags |= BF_SHUTR_NOW;
+}
+
+/* marks the buffer as "shutdown" ASAP for writes */
+static inline void buffer_shutw_now(struct buffer *buf)
+{
+	buf->flags |= BF_SHUTW_NOW;
+}
+
+/* marks the buffer as "shutdown" ASAP in both directions */
+static inline void buffer_abort(struct buffer *buf)
+{
+	buf->flags |= BF_SHUTR_NOW | BF_SHUTW_NOW;
+}
+
 /* returns the maximum number of bytes writable at once in this buffer */
 static inline int buffer_max(const struct buffer *buf)
 {
diff --git a/include/proto/proto_http.h b/include/proto/proto_http.h
index fc1e01d..17f302d 100644
--- a/include/proto/proto_http.h
+++ b/include/proto/proto_http.h
@@ -60,7 +60,8 @@
 int event_accept(int fd);
 void process_session(struct task *t, int *next);
 int process_cli(struct session *t);
-int process_srv(struct session *t);
+int process_srv_data(struct session *t);
+int process_srv_conn(struct session *t);
 int process_request(struct session *t);
 int process_response(struct session *t);
 
diff --git a/include/proto/stream_sock.h b/include/proto/stream_sock.h
index 5619e60..d57ddf5 100644
--- a/include/proto/stream_sock.h
+++ b/include/proto/stream_sock.h
@@ -2,7 +2,7 @@
   include/proto/stream_sock.h
   This file contains client-side definitions.
 
-  Copyright (C) 2000-2006 Willy Tarreau - w@1wt.eu
+  Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
   
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -27,6 +27,7 @@
 #include <sys/types.h>
 
 #include <common/config.h>
+#include <types/stream_interface.h>
 
 
 /* main event functions used to move data between sockets and buffers */