Fix crash on expired keyboard prompts
[silc.git] / lib / silcutil / silcsocketstream.c
index c320644737440f01c2991fe79636de0fea0a493e..06d55484913bde2a549e49adea4f400846494d91 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 2005 - 2006 Pekka Riikonen
+  Copyright (C) 2005 - 2008 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -34,10 +34,10 @@ int silc_socket_udp_stream_write(SilcStream stream, const unsigned char *data,
                                 SilcUInt32 data_len);
 SilcBool silc_socket_stream_close(SilcStream stream);
 void silc_socket_stream_destroy(SilcStream stream);
-void silc_socket_stream_notifier(SilcStream stream,
-                                SilcSchedule schedule,
-                                SilcStreamNotifier callback,
-                                void *context);
+SilcBool silc_socket_stream_notifier(SilcStream stream,
+                                    SilcSchedule schedule,
+                                    SilcStreamNotifier callback,
+                                    void *context);
 SilcSchedule silc_socket_stream_get_schedule(SilcStream stream);
 
 /* Internal async host lookup context. */
@@ -72,7 +72,7 @@ SILC_TASK_CALLBACK(silc_socket_host_lookup_finish)
   }
 
   if (lookup->status != SILC_SOCKET_OK) {
-    SILC_LOG_DEBUG(("Socket stream failed"));
+    SILC_LOG_DEBUG(("Socket stream lookup failed"));
     stream->schedule = NULL;
     silc_socket_stream_destroy(stream);
     stream = lookup->stream = NULL;
@@ -152,7 +152,8 @@ silc_socket_tcp_stream_create(SilcSocket sock, SilcBool lookup,
   SilcSocketStream stream;
   SilcSocketHostLookup l;
 
-  if (!sock) {
+  if (!sock || !schedule) {
+    SILC_LOG_ERROR(("Missing arguments to silc_socket_tcp_stream_create"));
     if (callback)
       callback(SILC_SOCKET_ERROR, NULL, context);
     return NULL;
@@ -165,11 +166,12 @@ silc_socket_tcp_stream_create(SilcSocket sock, SilcBool lookup,
     return NULL;
   }
 
-  SILC_LOG_DEBUG(("Creating TCP socket stream %p", stream));
+  SILC_LOG_DEBUG(("Creating TCP socket stream %p, sock %lu", stream, sock));
 
   stream->ops = &silc_socket_stream_ops;
   stream->sock = sock;
   stream->schedule = schedule;
+  stream->connected = TRUE;
 
   l = silc_calloc(1, sizeof(*l));
   if (!l) {
@@ -261,20 +263,20 @@ SilcBool silc_socket_stream_get_info(SilcStream stream,
 
   if (sock)
     *sock = socket_stream->sock;
-  if (hostname) {
-    if (!socket_stream->hostname)
+  if (port) {
+    if (!socket_stream->port)
       return FALSE;
-    *hostname = socket_stream->hostname;
+    *port = socket_stream->port;
   }
   if (ip) {
     if (!socket_stream->ip)
       return FALSE;
     *ip = socket_stream->ip;
   }
-  if (port) {
-    if (!socket_stream->port)
+  if (hostname) {
+    if (!socket_stream->hostname)
       return FALSE;
-    *port = socket_stream->port;
+    *hostname = socket_stream->hostname;
   }
 
   return TRUE;
@@ -348,6 +350,7 @@ SilcBool silc_socket_stream_set_qos(SilcStream stream,
       !limit_sec && !limit_usec) {
     silc_schedule_task_del_by_context(socket_stream->schedule,
                                      socket_stream->qos);
+    silc_free(socket_stream->qos->buffer);
     silc_free(socket_stream->qos);
     socket_stream->qos = NULL;
     return TRUE;
@@ -368,7 +371,8 @@ SilcBool silc_socket_stream_set_qos(SilcStream stream,
   socket_stream->qos->cur_rate = 0;
   socket_stream->qos->sock = socket_stream;
 
-  socket_stream->qos->buffer = silc_malloc(read_limit_bytes);
+  socket_stream->qos->buffer = silc_realloc(socket_stream->qos->buffer,
+                                           read_limit_bytes);
   if (!socket_stream->qos->buffer)
     return FALSE;
 
@@ -388,6 +392,33 @@ SilcSchedule silc_socket_stream_get_schedule(SilcStream stream)
   return socket_stream->schedule;
 }
 
+/* Return associated context. */
+
+void *
+silc_socket_stream_get_context(SilcStream stream)
+{
+  SilcSocketStream socket_stream = stream;
+
+  if (!SILC_IS_SOCKET_STREAM(socket_stream))
+    return NULL;
+
+  return socket_stream->user_context;
+}
+
+/* Set associated context. */
+
+void
+silc_socket_stream_set_context(SilcStream stream,
+                                   void *context)
+{
+  SilcSocketStream socket_stream = stream;
+
+  if (!SILC_IS_SOCKET_STREAM(socket_stream))
+    return;
+
+  socket_stream->user_context = context;
+}
+
 /* SILC Socket Stream ops.  Functions are implemented under the
    platform specific subdirectories. */
 const SilcStreamOps silc_socket_stream_ops =