sock);
return;
}
- if (sock->sock == -1)
+ if ( (sock->sock == -1) ||
+ ( (0 != (tc->reason & GNUNET_SCHEDULER_REASON_TIMEOUT)) &&
+ (0 == (tc->reason & GNUNET_SCHEDULER_REASON_PREREQ_DONE)) &&
+ (!FD_ISSET (sock->sock, tc->write_ready))) )
{
#if DEBUG_NETWORK
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
_("Could not satisfy pending transmission request, socket closed or connect failed.\n"));
#endif
+ if (-1 != sock->sock)
+ {
+ SHUTDOWN (sock->sock, SHUT_RDWR);
+ GNUNET_break (0 == CLOSE (sock->sock));
+ sock->sock = -1;
+ }
transmit_error (sock);
return; /* connect failed for good, we're finished */
}
- if ((tc->write_ready == NULL) || (!FD_ISSET (sock->sock, tc->write_ready)))
+ if ((tc->write_ready == NULL) || (!FD_ISSET (sock->sock, tc->write_ready)))
{
- /* special circumstances: not yet ready to write */
+ /* special circumstances (in particular,
+ PREREQ_DONE after connect): not yet ready to write,
+ but no "fatal" error either. Hence retry. */
goto SCHEDULE_WRITE;
}
GNUNET_assert (sock->write_buffer_off >= sock->write_buffer_pos);
GNUNET_NO,
GNUNET_SCHEDULER_PRIORITY_KEEP,
GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
- GNUNET_TIME_UNIT_FOREVER_REL,
+ GNUNET_TIME_absolute_get_remaining (sock->nth.transmit_timeout),
sock->sock, &transmit_ready, sock);
}
&transmit_timeout,
sock);
if (sock->write_task == GNUNET_SCHEDULER_NO_PREREQUISITE_TASK)
- sock->write_task = GNUNET_SCHEDULER_add_delayed (sock->sched,
- GNUNET_NO,
- GNUNET_SCHEDULER_PRIORITY_KEEP,
- sock->connect_task,
- GNUNET_TIME_UNIT_ZERO,
- &transmit_ready, sock);
+ {
+ if (sock->connect_task == GNUNET_SCHEDULER_NO_PREREQUISITE_TASK)
+ sock->write_task = GNUNET_SCHEDULER_add_write (sock->sched,
+ GNUNET_NO,
+ GNUNET_SCHEDULER_PRIORITY_KEEP,
+ GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
+ GNUNET_TIME_absolute_get_remaining (sock->nth.transmit_timeout),
+ sock->sock,
+ &transmit_ready, sock);
+ else
+ sock->write_task = GNUNET_SCHEDULER_add_delayed (sock->sched,
+ GNUNET_NO,
+ GNUNET_SCHEDULER_PRIORITY_KEEP,
+ sock->connect_task,
+ GNUNET_TIME_UNIT_ZERO,
+ &transmit_ready, sock);
+ }
return &sock->nth;
}