From 6e802227d9eda0208c869ab18acc84a4d64afaab Mon Sep 17 00:00:00 2001
From: Mark Salisbury <mark.salisbury@hp.com>
Date: Tue, 12 Jun 2012 10:07:09 -0600
Subject: [PATCH 2/8] schannel SSL: Use standard Curl read/write methods

Replaced calls to swrite with Curl_write_plain and calls to sread
with Curl_read_plain.
---
 lib/curl_schannel.c |   29 ++++++++++++++++-------------
 1 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/lib/curl_schannel.c b/lib/curl_schannel.c
index 3e06dc2..e2f965d 100644
--- a/lib/curl_schannel.c
+++ b/lib/curl_schannel.c
@@ -238,7 +238,7 @@ schannel_connect_step1(struct connectdata *conn, int sockindex)
         outbuf.cbBuffer);
 
   /* send initial handshake data which is now stored in output buffer */
-  write = swrite(conn->sock[sockindex], outbuf.pvBuffer, outbuf.cbBuffer);
+  Curl_write_plain(conn, conn->sock[sockindex], outbuf.pvBuffer, outbuf.cbBuffer, &write);
   s_pSecFn->FreeContextBuffer(outbuf.pvBuffer);
   if(write != outbuf.cbBuffer) {
     failf(data, "schannel: failed to send initial handshake data: %d\n",
@@ -269,6 +269,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
 #ifdef UNICODE
   wchar_t * whost;
 #endif
+  CURLcode result;
 
   infof(data, "schannel: connecting to %s:%d (step 2/3)\n",
         conn->host.name, conn->remote_port);
@@ -285,20 +286,22 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
   }
 
   /* read encrypted handshake data from socket */
-  read = sread(conn->sock[sockindex],
-               connssl->encdata_buffer + connssl->encdata_offset,
-               connssl->encdata_length - connssl->encdata_offset);
-  if(read > 0) {
+  result = Curl_read_plain(conn->sock[sockindex],
+                           connssl->encdata_buffer + connssl->encdata_offset,
+                           connssl->encdata_length - connssl->encdata_offset,
+                           &read);
+
+  if(result == CURLE_OK) {
     /* increase encrypted data buffer offset */
     connssl->encdata_offset += read;
   }
   else if(connssl->connecting_state != ssl_connect_2_writing) {
-    if(read < 0) {
+    if(result == CURLE_AGAIN) {
       connssl->connecting_state = ssl_connect_2_reading;
       infof(data, "schannel: failed to receive handshake, need more data\n");
-      return CURLE_OK;
+      return CURLE_OK; // or is CURLE_AGAIN more appropriate?
     }
-    else if(read == 0) {
+    else {
       failf(data, "schannel: failed to receive handshake, connection "
             "failed\n");
       return CURLE_SSL_CONNECT_ERROR;
@@ -382,8 +385,7 @@ schannel_connect_step2(struct connectdata *conn, int sockindex)
               outbuf[i].cbBuffer);
 
         /* send handshake token to server */
-        write = swrite(conn->sock[sockindex],
-                       outbuf[i].pvBuffer, outbuf[i].cbBuffer);
+        Curl_write_plain(conn, conn->sock[sockindex], outbuf[i].pvBuffer, outbuf[i].cbBuffer, &write);
         if(write != outbuf[i].cbBuffer) {
           failf(data, "schannel: failed to send next handshake data: %d\n",
                 write);
@@ -679,7 +681,7 @@ schannel_send(struct connectdata *conn, int sockindex,
   if(sspi_status == SEC_E_OK) {
     /* send the encrypted message including header, data and trailer */
     len = outbuf[0].cbBuffer + outbuf[1].cbBuffer + outbuf[2].cbBuffer;
-    ret = swrite(conn->sock[sockindex], data, len);
+    Curl_write_plain(conn, conn->sock[sockindex], data, len, &ret);
     /* TODO: implement write buffering */
   }
   else if(sspi_status == SEC_E_INSUFFICIENT_MEMORY) {
@@ -741,8 +743,9 @@ schannel_recv(struct connectdata *conn, int sockindex,
         connssl->encdata_offset, connssl->encdata_length);
   size = connssl->encdata_length - connssl->encdata_offset;
   if(size > 0) {
-    read = sread(conn->sock[sockindex],
-                 connssl->encdata_buffer + connssl->encdata_offset, size);
+    *err = Curl_read_plain(conn->sock[sockindex],
+                    connssl->encdata_buffer + connssl->encdata_offset,
+                    size, &read);
     infof(data, "schannel: encrypted data received %d\n", read);
 
     /* check for received data */
-- 
1.7.4.msysgit.0

