
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'                                                         '
'  This file contains some patches from me that fix some  '
'  small bugs in lwip 1.1.1.                              '
'                                                         '
'  Please apply the patches with the command              '
'  "patch -i patches.txt".                                '
'                                                         '
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


--- lwip-1.1.1/src/api/api_lib.c	Fri Nov 25 11:03:38 2005
+++ lwip-1.1.1/src/api/api_lib.c	Fri Apr 14 10:49:12 2006
@@ -621,7 +621,8 @@
 netconn_write(struct netconn *conn, void *dataptr, u16_t size, u8_t copy)
 {
   struct api_msg *msg;
-  u16_t len;
+  u16_t len, sndbuf;
+  sys_sem_t sem;
   
   if (conn == NULL) {
     return ERR_VAL;
@@ -651,16 +652,16 @@
     msg->msg.msg.w.copy = copy;
     
     if (conn->type == NETCONN_TCP) {
-      if (tcp_sndbuf(conn->pcb.tcp) == 0) {
+      while ((sndbuf = tcp_sndbuf(conn->pcb.tcp)) == 0) {
   sys_sem_wait(conn->sem);
   if (conn->err != ERR_OK) {
     goto ret;
   }
       }
-      if (size > tcp_sndbuf(conn->pcb.tcp)) {
+      if (size > sndbuf) {
   /* We cannot send more than one send buffer's worth of data at a
      time. */
-  len = tcp_sndbuf(conn->pcb.tcp);
+  len = sndbuf;
       } else {
   len = size;
       }
@@ -685,9 +686,9 @@
  ret:
   memp_free(MEMP_API_MSG, msg);
   conn->state = NETCONN_NONE;
-  if (conn->sem != SYS_SEM_NULL) {
-    sys_sem_free(conn->sem);
+  if ((sem = conn->sem) != SYS_SEM_NULL) {
     conn->sem = SYS_SEM_NULL;
+    sys_sem_free(sem);
   }
   
   return conn->err;
