Control of 'addr' is now handed over to {platform_,}new_connection() and
[u/mdw/putty] / winnet.c
index e94075b..c211f53 100644 (file)
--- a/winnet.c
+++ b/winnet.c
@@ -59,7 +59,7 @@
        ((ntohl(addr.s_addr) & 0xFF000000L) == 0x7F000000L)
 
 struct Socket_tag {
-    struct socket_function_table *fn;
+    const struct socket_function_table *fn;
     /* the above variable absolutely *must* be the first in this structure */
     char *error;
     SOCKET s;
@@ -224,9 +224,9 @@ char *winsock_error_string(int error)
     }
 }
 
-SockAddr sk_namelookup(char *host, char **canonicalname)
+SockAddr sk_namelookup(const char *host, char **canonicalname)
 {
-    SockAddr ret = smalloc(sizeof(struct SockAddr_tag));
+    SockAddr ret = snew(struct SockAddr_tag);
     unsigned long a;
     struct hostent *h = NULL;
     char realhost[8192];
@@ -357,14 +357,15 @@ SockAddr sk_namelookup(char *host, char **canonicalname)
     }
     ret->address = ntohl(a);
     realhost[lenof(realhost)-1] = '\0';
-    *canonicalname = smalloc(1+strlen(realhost));
+    *canonicalname = snewn(1+strlen(realhost), char);
     strcpy(*canonicalname, realhost);
     return ret;
 }
 
-SockAddr sk_nonamelookup(char *host)
+SockAddr sk_nonamelookup(const char *host)
 {
-    SockAddr ret = smalloc(sizeof(struct SockAddr_tag));
+    SockAddr ret = snew(struct SockAddr_tag);
+    ret->error = NULL;
     ret->family = AF_UNSPEC;
     strncpy(ret->hostname, host, lenof(ret->hostname));
     ret->hostname[lenof(ret->hostname)-1] = '\0';
@@ -459,18 +460,18 @@ static void sk_tcp_flush(Socket s)
 }
 
 static void sk_tcp_close(Socket s);
-static int sk_tcp_write(Socket s, char *data, int len);
-static int sk_tcp_write_oob(Socket s, char *data, int len);
+static int sk_tcp_write(Socket s, const char *data, int len);
+static int sk_tcp_write_oob(Socket s, const char *data, int len);
 static void sk_tcp_set_private_ptr(Socket s, void *ptr);
 static void *sk_tcp_get_private_ptr(Socket s);
 static void sk_tcp_set_frozen(Socket s, int is_frozen);
-static char *sk_tcp_socket_error(Socket s);
+static const char *sk_tcp_socket_error(Socket s);
 
 extern char *do_select(SOCKET skt, int startup);
 
 Socket sk_register(void *sock, Plug plug)
 {
-    static struct socket_function_table fn_table = {
+    static const struct socket_function_table fn_table = {
        sk_tcp_plug,
        sk_tcp_close,
        sk_tcp_write,
@@ -489,7 +490,7 @@ Socket sk_register(void *sock, Plug plug)
     /*
      * Create Socket structure.
      */
-    ret = smalloc(sizeof(struct Socket_tag));
+    ret = snew(struct Socket_tag);
     ret->fn = &fn_table;
     ret->error = NULL;
     ret->plug = plug;
@@ -527,7 +528,7 @@ Socket sk_register(void *sock, Plug plug)
 Socket sk_new(SockAddr addr, int port, int privport, int oobinline,
              int nodelay, Plug plug)
 {
-    static struct socket_function_table fn_table = {
+    static const struct socket_function_table fn_table = {
        sk_tcp_plug,
        sk_tcp_close,
        sk_tcp_write,
@@ -552,7 +553,7 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline,
     /*
      * Create Socket structure.
      */
-    ret = smalloc(sizeof(struct Socket_tag));
+    ret = snew(struct Socket_tag);
     ret->fn = &fn_table;
     ret->error = NULL;
     ret->plug = plug;
@@ -700,12 +701,15 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline,
 
     add234(sktree, ret);
 
+    /* We're done with 'addr' now. */
+    sk_addr_free(addr);
+
     return (Socket) ret;
 }
 
 Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only)
 {
-    static struct socket_function_table fn_table = {
+    static const struct socket_function_table fn_table = {
        sk_tcp_plug,
        sk_tcp_close,
        sk_tcp_write,
@@ -731,7 +735,7 @@ Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only)
     /*
      * Create Socket structure.
      */
-    ret = smalloc(sizeof(struct Socket_tag));
+    ret = snew(struct Socket_tag);
     ret->fn = &fn_table;
     ret->error = NULL;
     ret->plug = plug;
@@ -923,7 +927,7 @@ void try_send(Actual_Socket s)
     }
 }
 
-static int sk_tcp_write(Socket sock, char *buf, int len)
+static int sk_tcp_write(Socket sock, const char *buf, int len)
 {
     Actual_Socket s = (Actual_Socket) sock;
 
@@ -941,7 +945,7 @@ static int sk_tcp_write(Socket sock, char *buf, int len)
     return bufchain_size(&s->output_data);
 }
 
-static int sk_tcp_write_oob(Socket sock, char *buf, int len)
+static int sk_tcp_write_oob(Socket sock, const char *buf, int len)
 {
     Actual_Socket s = (Actual_Socket) sock;
 
@@ -972,23 +976,8 @@ int select_result(WPARAM wParam, LPARAM lParam)
 
     /* wParam is the socket itself */
 
-    /*
-     * One user has reported an assertion failure in tree234 which
-     * indicates a null element pointer has been passed to a
-     * find*234 function. The following find234 is the only one in
-     * the whole program that I can see being capable of doing
-     * this, hence I'm forced to conclude that WinSock is capable
-     * of sending me netevent messages with wParam==0. I want to
-     * know what the rest of the message is if it does so!
-     */
-    if (wParam == 0) {
-       char *str;
-       str = dupprintf("Strange WinSock message: wp=%08x lp=%08x",
-                       (int)wParam, (int)lParam);
-       logevent(NULL, str);
-       connection_fatal(NULL, str);
-       sfree(str);
-    }
+    if (wParam == 0)
+       return 1;                      /* boggle */
 
     s = find234(sktree, (void *) wParam, cmpforsearch);
     if (!s)
@@ -1187,11 +1176,11 @@ static void *sk_tcp_get_private_ptr(Socket sock)
  * if there's a problem. These functions extract an error message,
  * or return NULL if there's no problem.
  */
-char *sk_addr_error(SockAddr addr)
+const char *sk_addr_error(SockAddr addr)
 {
     return addr->error;
 }
-static char *sk_tcp_socket_error(Socket sock)
+static const char *sk_tcp_socket_error(Socket sock)
 {
     Actual_Socket s = (Actual_Socket) sock;
     return s->error;