/************************** Types and definitions ***************************/
#define SILC_IS_SOCKET_STREAM(s) (s->ops == &silc_socket_stream_ops)
+#define SILC_IS_SOCKET_STREAM_UDP(s) (s->ops == &silc_socket_udp_stream_ops)
const SilcStreamOps silc_socket_stream_ops;
const SilcStreamOps silc_socket_udp_stream_ops;
{
SilcSocketStream stream = context;
- if (!stream->notifier)
+ if (silc_unlikely(!stream->notifier))
return;
switch (type) {
out:
silc_schedule_task_add_timeout(schedule, silc_socket_host_lookup_finish,
- lookup, 0, 1);
+ lookup, 0, 0);
silc_schedule_wakeup(schedule);
return NULL;
}
/* Creates UDP socket stream */
SilcStream silc_socket_udp_stream_create(int sock, SilcBool ipv6,
+ SilcBool connected,
SilcSchedule schedule)
{
SilcSocketStream stream;
stream->sock = sock;
stream->schedule = schedule;
stream->ipv6 = ipv6;
+ stream->connected = connected;
return (SilcStream)stream;
}
+/* Returns TRUE if the stream is UDP stream */
+
+SilcBool silc_socket_stream_is_udp(SilcStream stream, SilcBool *connected)
+{
+ SilcSocketStream socket_stream = stream;
+
+ if (!SILC_IS_SOCKET_STREAM_UDP(socket_stream))
+ return FALSE;
+
+ if (connected)
+ *connected = socket_stream->connected;
+
+ return TRUE;
+}
+
/* Returns socket stream information */
SilcBool silc_socket_stream_get_info(SilcStream stream,
{
SilcSocketStream socket_stream = stream;
- if (!SILC_IS_SOCKET_STREAM(socket_stream))
+ if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+ !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
return FALSE;
if (sock)
*sock = socket_stream->sock;
- if (hostname)
+ if (hostname) {
+ if (!socket_stream->hostname)
+ return FALSE;
*hostname = socket_stream->hostname;
- if (ip)
+ }
+ if (ip) {
+ if (!socket_stream->ip)
+ return FALSE;
*ip = socket_stream->ip;
- if (port)
+ }
+ if (port) {
+ if (!socket_stream->port)
+ return FALSE;
*port = socket_stream->port;
+ }
return TRUE;
}
{
SilcSocketStream socket_stream = stream;
- if (!SILC_IS_SOCKET_STREAM(socket_stream))
+ if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+ !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
return FALSE;
if (hostname) {
socket_stream->ip = strdup(ip);
if (!socket_stream->ip)
return FALSE;
+ if (!socket_stream->hostname) {
+ socket_stream->hostname = strdup(ip);
+ if (!socket_stream->hostname)
+ return FALSE;
+ }
}
if (port)
socket_stream->port = port;
{
SilcSocketStream socket_stream = stream;
- if (!SILC_IS_SOCKET_STREAM(socket_stream))
+ if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+ !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
return 0;
return socket_stream->sock_error;
{
SilcSocketStream socket_stream = stream;
- if (!SILC_IS_SOCKET_STREAM(socket_stream))
+ if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+ !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
return FALSE;
SILC_LOG_DEBUG(("Setting QoS for socket stream"));
{
SilcSocketStream socket_stream = stream;
- if (!SILC_IS_SOCKET_STREAM(socket_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);
{
SilcSocketStream socket_stream = stream;
- if (!SILC_IS_SOCKET_STREAM(socket_stream))
+ if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+ !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
return;
silc_socket_stream_close(socket_stream);
{
SilcSocketStream socket_stream = stream;
- if (!SILC_IS_SOCKET_STREAM(socket_stream))
+ if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+ !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
return;
SILC_LOG_DEBUG(("Setting stream notifier callback"));
{
SilcSocketStream socket_stream = stream;
- if (!SILC_IS_SOCKET_STREAM(socket_stream))
+ if (!SILC_IS_SOCKET_STREAM(socket_stream) &&
+ !SILC_IS_SOCKET_STREAM_UDP(socket_stream))
return NULL;
return socket_stream->schedule;