Fixed stream destroying when scheduler is not set.
[silc.git] / lib / silcutil / unix / silcunixsocketstream.c
index 1b9d66295036a22721ed963d1e44d262aed27bd4..e68bef544e48efa366646094b93b4a2fe35227e5 100644 (file)
@@ -253,11 +253,12 @@ SilcBool silc_socket_stream_close(SilcStream stream)
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
-      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
-    return FALSE;
-
-  silc_schedule_unset_listen_fd(socket_stream->schedule, socket_stream->sock);
+  if (socket_stream->schedule) {
+    silc_schedule_unset_listen_fd(socket_stream->schedule,
+                                 socket_stream->sock);
+    silc_schedule_task_del_by_fd(socket_stream->schedule,
+                                socket_stream->sock);
+  }
   silc_net_close_connection(socket_stream->sock);
 
   return TRUE;
@@ -269,10 +270,6 @@ void silc_socket_stream_destroy(SilcStream stream)
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
-      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
-    return;
-
   silc_socket_stream_close(socket_stream);
   silc_free(socket_stream->ip);
   silc_free(socket_stream->hostname);
@@ -298,38 +295,41 @@ void silc_socket_stream_destroy(SilcStream stream)
 
 /* Sets stream notification callback for the 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)
 {
   SilcSocketStream socket_stream = stream;
 
-  if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
-      !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
-    return;
-
   SILC_LOG_DEBUG(("Setting stream notifier callback"));
 
   socket_stream->notifier = callback;
   socket_stream->notifier_context = context;
   socket_stream->schedule = schedule;
 
-  if (socket_stream->notifier) {
+  if (socket_stream->notifier && socket_stream->schedule) {
     /* Add the socket to scheduler.  Safe to call if already added. */
-    silc_schedule_task_add_fd(socket_stream->schedule, socket_stream->sock,
-                             silc_socket_stream_io, socket_stream);
+    if (!silc_schedule_task_add_fd(socket_stream->schedule,
+                                  socket_stream->sock,
+                                  silc_socket_stream_io, socket_stream))
+      return FALSE;
 
     /* Initially set socket for reading */
-    silc_schedule_set_listen_fd(socket_stream->schedule, socket_stream->sock,
-                               SILC_TASK_READ, FALSE);
-    silc_schedule_wakeup(socket_stream->schedule);
-  } else {
+    if (!silc_schedule_set_listen_fd(socket_stream->schedule,
+                                    socket_stream->sock,
+                                    SILC_TASK_READ, FALSE))
+      return FALSE;
+  } else if (socket_stream->schedule) {
     /* Unschedule the socket */
     silc_schedule_unset_listen_fd(socket_stream->schedule,
                                  socket_stream->sock);
     silc_schedule_task_del_by_fd(socket_stream->schedule,
                                 socket_stream->sock);
-    silc_schedule_wakeup(socket_stream->schedule);
   }
+
+  if (socket_stream->schedule)
+    silc_schedule_wakeup(socket_stream->schedule);
+
+  return TRUE;
 }