Expose SSL_set_shutdown and SSL_get_shutdown on Connection
diff --git a/ChangeLog b/ChangeLog
index 098bd72..a1981d2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-02-21  Jean-Paul Calderone  <exarkun@twistedmatrix.com>
+
+	* src/ssl/connection.c: Expose SSL_get_shutdown and
+	  SSL_set_shutdown. (patch from James Knight)
+	* src/ssl/ssl.c: Expose SSL_SENT_SHUTDOWN and SSL_RECEIVED_SHUTDOWN.
+	  (patch from James Knight)
+
 2008-02-19  Jean-Paul Calderone  <exarkun@twistedmatrix.com>
 
 	* src/ssl/context.c: Expose SSL_CTX_add_extra_chain_cert.
diff --git a/doc/html/callbacks.html b/doc/html/callbacks.html
index b1cad1a..740caf2 100644
--- a/doc/html/callbacks.html
+++ b/doc/html/callbacks.html
@@ -55,7 +55,7 @@
 Python threads to be able to do other things. The real trouble is if you've
 released the thread lock to do a potentially blocking operation, and the
 operation calls a callback. Then we must take the thread lock back<A NAME="tex2html6"
-  HREF="#foot921"><SUP>5</SUP></A>.
+  HREF="#foot934"><SUP>5</SUP></A>.
 </EM></EM></EM>
 <P>
 <EM><EM><EM>There are two solutions to the first problem, both of which are necessary. The
@@ -83,7 +83,7 @@
 <P>
 <BR><HR><H4>Footnotes</H4>
 <DL>
-<DT><A NAME="foot921">... back</A><A
+<DT><A NAME="foot934">... back</A><A
  href="callbacks.html#tex2html6"><SUP>5</SUP></A></DT>
 <DD>I'm
 not sure why this is necessary, but otherwise I get a segmentation violation on
diff --git a/doc/html/intro.html b/doc/html/intro.html
index 59655f6..e57f6f2 100644
--- a/doc/html/intro.html
+++ b/doc/html/intro.html
@@ -60,9 +60,9 @@
 unfortunately its error handling system does not seem to be finished,
 especially for non-blocking I/O.  I think that much of the reason for this
 is that M2Crypto<A NAME="tex2html1"
-  HREF="#foot881"><SUP>1</SUP></A> is
+  HREF="#foot894"><SUP>1</SUP></A> is
 developed using SWIG<A NAME="tex2html2"
-  HREF="#foot882"><SUP>2</SUP></A>.  This
+  HREF="#foot895"><SUP>2</SUP></A>.  This
 makes it awkward to create functions that e.g. can return both an integer and
 NULL since (as far as I know) you basically write C functions and SWIG makes
 wrapper functions that parses the Python argument list and calls your C
@@ -71,12 +71,12 @@
 <P>
 <BR><HR><H4>Footnotes</H4>
 <DL>
-<DT><A NAME="foot881">... M2Crypto</A><A
+<DT><A NAME="foot894">... M2Crypto</A><A
  href="intro.html#tex2html1"><SUP>1</SUP></A></DT>
 <DD>See <a class="url" href="http://www.post1.com/home/ngps/m2/">http://www.post1.com/home/ngps/m2/</a>
 
 </DD>
-<DT><A NAME="foot882">... SWIG</A><A
+<DT><A NAME="foot895">... SWIG</A><A
  href="intro.html#tex2html2"><SUP>2</SUP></A></DT>
 <DD>See <a class="url" href="http://swig.sourceforge.net/">http://swig.sourceforge.net/</a>
 
diff --git a/doc/html/openssl-connection.html b/doc/html/openssl-connection.html
index fbc2313..fed4d52 100644
--- a/doc/html/openssl-connection.html
+++ b/doc/html/openssl-connection.html
@@ -205,23 +205,35 @@
 readable/writeable.
 </dl>
 <P>
-<dl><dt><b><a name='l2h-164'><tt class='method'>sock_shutdown</tt></a></b>(<var>how</var>)
+<dl><dt><b><a name='l2h-164'><tt class='method'>get_shutdown</tt></a></b>()
+<dd>
+Get the shutdown state of the Connection.  Returns a bitvector of either or
+both of <var>SENT_SHUTDOWN</var> and <var>RECEIVED_SHUTDOWN</var>.
+</dl>
+<P>
+<dl><dt><b><a name='l2h-165'><tt class='method'>set_shutdown</tt></a></b>(<var>state</var>)
+<dd>
+Set the shutdown state of the Connection.  <var>state</var> is a bitvector of
+either or both of <var>SENT_SHUTDOWN</var> and <var>RECEIVED_SHUTDOWN</var>.
+</dl>
+<P>
+<dl><dt><b><a name='l2h-166'><tt class='method'>sock_shutdown</tt></a></b>(<var>how</var>)
 <dd>
 Call the <tt class="method">shutdown</tt> method of the underlying socket.
 </dl>
 <P>
-<dl><dt><b><a name='l2h-165'><tt class='method'>state_string</tt></a></b>()
+<dl><dt><b><a name='l2h-167'><tt class='method'>state_string</tt></a></b>()
 <dd>
 Retrieve a verbose string detailing the state of the Connection.
 </dl>
 <P>
-<dl><dt><b><a name='l2h-166'><tt class='method'>want_read</tt></a></b>()
+<dl><dt><b><a name='l2h-168'><tt class='method'>want_read</tt></a></b>()
 <dd>
 Checks if more data has to be read from the transport layer to complete an
 operation.
 </dl>
 <P>
-<dl><dt><b><a name='l2h-167'><tt class='method'>want_write</tt></a></b>()
+<dl><dt><b><a name='l2h-169'><tt class='method'>want_write</tt></a></b>()
 <dd>
 Checks if there is data to write to the transport layer to complete an
 operation.
diff --git a/doc/html/openssl-rand.html b/doc/html/openssl-rand.html
index c958d15..8390880 100644
--- a/doc/html/openssl-rand.html
+++ b/doc/html/openssl-rand.html
@@ -59,14 +59,14 @@
 <dd>
 Mix bytes from <var>string</var> into the PRNG state. The <var>entropy</var> argument is
 (the lower bound of) an estimate of how much randomness is contained in
-<var>string</var>, measured in bytes. For more information, see e.g. <a class="rfc" name="rfcref-1784"
+<var>string</var>, measured in bytes. For more information, see e.g. <a class="rfc" name="rfcref-1801"
 href="http://www.ietf.org/rfc/rfc1750.txt">RFC 1750</a>.
 </dl>
 <P>
 <dl><dt><b><a name='l2h-83'><tt class='function'>egd</tt></a></b>(<var>path</var><big>[</big><var>, bytes</var><big>]</big>)
 <dd>
 Query the Entropy Gathering Daemon<A NAME="tex2html3"
-  HREF="#foot903"><SUP>3</SUP></A> on socket <var>path</var> for <var>bytes</var>
+  HREF="#foot916"><SUP>3</SUP></A> on socket <var>path</var> for <var>bytes</var>
 bytes of random data and and uses <tt class="function">add</tt> to seed the PRNG. The default
 value of <var>bytes</var> is 255.
 </dl>
@@ -102,7 +102,7 @@
 <P>
 <BR><HR><H4>Footnotes</H4>
 <DL>
-<DT><A NAME="foot903">... Daemon</A><A
+<DT><A NAME="foot916">... Daemon</A><A
  href="openssl-rand.html#tex2html3"><SUP>3</SUP></A></DT>
 <DD>See
 <a class="url" href="http://www.lothar.com/tech/crypto/">http://www.lothar.com/tech/crypto/</a>
diff --git a/doc/html/openssl-ssl.html b/doc/html/openssl-ssl.html
index 1d9ff6a..62e3f16 100644
--- a/doc/html/openssl-ssl.html
+++ b/doc/html/openssl-ssl.html
@@ -113,7 +113,7 @@
 <dd>
 Factory fucnction that creates a new Connection object given an SSL context and
 a socket <A NAME="tex2html5"
-  HREF="#foot906"><SUP>4</SUP></A> object.
+  HREF="#foot919"><SUP>4</SUP></A> object.
 </dl>
 <P>
 <dl><dt><b>exception <a name='l2h-98'><tt class='exception'>Error</tt></a></b>
@@ -173,7 +173,7 @@
 <P>
 <BR><HR><H4>Footnotes</H4>
 <DL>
-<DT><A NAME="foot906">... socket</A><A
+<DT><A NAME="foot919">... socket</A><A
  href="openssl-ssl.html#tex2html5"><SUP>4</SUP></A></DT>
 <DD>Actually, all that is required is an object that
 <i>behaves</i> like a socket, you could even use files, even though it'd be
diff --git a/doc/pyOpenSSL.tex b/doc/pyOpenSSL.tex
index de91545..da4c19b 100644
--- a/doc/pyOpenSSL.tex
+++ b/doc/pyOpenSSL.tex
@@ -949,6 +949,16 @@
 readable/writeable.
 \end{methoddesc}
 
+\begin{methoddesc}[Connection]{get_shutdown}{}
+Get the shutdown state of the Connection.  Returns a bitvector of either or
+both of \var{SENT_SHUTDOWN} and \var{RECEIVED_SHUTDOWN}.
+\end{methoddesc}
+
+\begin{methoddesc}[Connection]{set_shutdown}{state}
+Set the shutdown state of the Connection.  \var{state} is a bitvector of
+either or both of \var{SENT_SHUTDOWN} and \var{RECEIVED_SHUTDOWN}.
+\end{methoddesc}
+
 \begin{methoddesc}[Connection]{sock_shutdown}{how}
 Call the \method{shutdown} method of the underlying socket.
 \end{methoddesc}
diff --git a/src/ssl/connection.c b/src/ssl/connection.c
index 96111aa..885f66d 100755
--- a/src/ssl/connection.c
+++ b/src/ssl/connection.c
@@ -756,6 +756,43 @@
     return Py_None;
 }
 
+static char ssl_Connection_get_shutdown_doc[] = "\n\
+Get shutdown state\n\
+\n\
+Arguments: self - The Connection object\n\
+           args - The Python argument tuple, should be empty\n\
+Returns:   The shutdown state, a bitmask of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.\n\
+";
+static PyObject *
+ssl_Connection_get_shutdown(ssl_ConnectionObj *self, PyObject *args)
+{
+    if (!PyArg_ParseTuple(args, ":get_shutdown"))
+        return NULL;
+
+    return PyInt_FromLong((long)SSL_get_shutdown(self->ssl));
+}
+
+static char ssl_Connection_set_shutdown_doc[] = "\n\
+Set shutdown state\n\
+\n\
+Arguments: self - The Connection object\n\
+           args - The Python argument tuple, should be\n\
+             shutdown state - bitmask of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.\n\
+Returns:   None\n\
+";
+static PyObject *
+ssl_Connection_set_shutdown(ssl_ConnectionObj *self, PyObject *args)
+{
+    int shutdown;
+
+    if (!PyArg_ParseTuple(args, "i:set_shutdown", &shutdown))
+        return NULL;
+
+    SSL_set_shutdown(self->ssl, shutdown);
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
 static char ssl_Connection_state_string_doc[] = "\n\
 Get a verbose state description\n\
 \n\
@@ -888,6 +925,8 @@
     ADD_METHOD(makefile),
     ADD_METHOD(get_app_data),
     ADD_METHOD(set_app_data),
+    ADD_METHOD(get_shutdown),
+    ADD_METHOD(set_shutdown),
     ADD_METHOD(state_string),
     ADD_METHOD(sock_shutdown),
     ADD_METHOD(get_peer_certificate),
diff --git a/src/ssl/ssl.c b/src/ssl/ssl.c
index 9d3abd2..1bd2d9e 100644
--- a/src/ssl/ssl.c
+++ b/src/ssl/ssl.c
@@ -180,6 +180,10 @@
     PyModule_AddIntConstant(module, "OP_NETSCAPE_CA_DN_BUG", SSL_OP_NETSCAPE_CA_DN_BUG);
     PyModule_AddIntConstant(module, "OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG", SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
 
+	/* For SSL_set_shutdown */
+    PyModule_AddIntConstant(module, "SENT_SHUTDOWN", SSL_SENT_SHUTDOWN);
+    PyModule_AddIntConstant(module, "RECEIVED_SHUTDOWN", SSL_RECEIVED_SHUTDOWN);
+
     dict = PyModule_GetDict(module);
     if (!init_ssl_context(dict))
         goto error;