Пример #1
0
static void silc_net_connect_stream(SilcResult status,
				    SilcStream stream, void *context)
{
  SilcSymbianTCPConnect *conn = (SilcSymbianTCPConnect *)context;

  SILC_LOG_DEBUG(("Socket stream creation status %d", status));

  /* Call connection callback */
  if (conn->callback)
    conn->callback(status, stream, conn->context);
  else if (stream)
    silc_stream_destroy(stream);

  delete conn;
}
Пример #2
0
static void silc_client_listener_tcp_accept(SilcNetStatus status,
					    SilcStream stream,
					    void *context)
{
  SilcClientListener listener = context;
  SilcPacketStream packet_stream;

  SILC_LOG_DEBUG(("New incoming TCP connection"));

  /* Create packet stream */
  packet_stream =
    silc_packet_stream_create(listener->client->internal->packet_engine,
			      listener->schedule, stream);
  if (!packet_stream) {
    silc_stream_destroy(stream);
    return;
  }

  /* Process session */
  silc_client_listener_new_connection(listener, packet_stream);
}
Пример #3
0
static void silc_client_ftp_session_free(SilcClientFtpSession session)
{
  SILC_LOG_DEBUG(("Free session %d", session->session_id));

  silc_schedule_task_del_by_context(session->client->schedule, session);

  silc_dlist_del(session->client->internal->ftp_sessions, session);

  /* Abort connecting  */
  if (session->op)
    silc_async_abort(session->op, NULL, NULL);

  /* Destroy SFTP */
  if (session->sftp) {
    if (session->initiator)
      silc_sftp_server_shutdown(session->sftp);
    else
      silc_sftp_client_shutdown(session->sftp);
  }
  if (session->fs)
    silc_sftp_fs_memory_free(session->fs);

  /* Destroy listener */
  if (session->listener)
    silc_client_listener_free(session->listener);

  /* Destroy wrapped stream */
  if (session->stream)
    silc_stream_destroy(session->stream);

  silc_client_unref_client(session->client, session->server_conn,
			   session->client_entry);
  silc_free(session->hostname);
  silc_free(session->filepath);
  silc_free(session->path);
  silc_free(session);
}
Пример #4
0
SilcClientListener
silc_client_listener_add(SilcClient client,
			 SilcSchedule schedule,
			 SilcClientConnectionParams *params,
			 SilcPublicKey public_key,
			 SilcPrivateKey private_key,
			 SilcClientConnectCallback callback,
			 void *context)
{
  SilcClientListener listener;
  SilcStream stream;

  if (!client || !schedule ||
      !params || (!params->local_ip && !params->bind_ip))
    return NULL;

  SILC_LOG_DEBUG(("Adding new listener"));

  listener = silc_calloc(1, sizeof(*listener));
  if (!listener)
    return NULL;
  listener->client = client;
  listener->schedule = schedule;
  listener->callback = callback;
  listener->context = context;
  listener->params = *params;
  listener->public_key = public_key;
  listener->private_key = private_key;

  /* Create network listener */
  if (params->udp) {
    /* UDP listener */
    stream = silc_net_udp_connect(params->bind_ip ? params->bind_ip :
				  params->local_ip, params->local_port,
				  NULL, 0, schedule);
    listener->udp_listener =
      silc_packet_stream_create(client->internal->packet_engine,
				schedule, stream);
    if (!listener->udp_listener) {
      client->internal->ops->say(
		     client, NULL, SILC_CLIENT_MESSAGE_ERROR,
		     "Cannot create UDP listener on %s on port %d: %s",
		     params->bind_ip ? params->bind_ip :
		     params->local_ip, params->local_port, strerror(errno));
      silc_client_listener_free(listener);
      if (stream)
	silc_stream_destroy(stream);
      return NULL;
    }
    silc_packet_stream_link(listener->udp_listener,
			    &silc_client_listener_stream_cb, listener,
			    1000000, SILC_PACKET_ANY, -1);

    if (!params->local_port) {
      /* Get listener port */
      SilcSocket sock;
      silc_socket_stream_get_info(stream, &sock, NULL, NULL, NULL);
      listener->params.local_port = silc_net_get_local_port(sock);
    }
  } else {
    /* TCP listener */
    listener->tcp_listener =
      silc_net_tcp_create_listener(params->bind_ip ?
				   (const char **)&params->bind_ip :
				   (const char **)&params->local_ip,
				   1, params->local_port, TRUE, FALSE,
				   schedule, silc_client_listener_tcp_accept,
				   listener);
    if (!listener->tcp_listener) {
      client->internal->ops->say(
		     client, NULL, SILC_CLIENT_MESSAGE_ERROR,
		     "Cannot create listener on %s on port %d: %s",
		     params->bind_ip ? params->bind_ip :
		     params->local_ip, params->local_port, strerror(errno));

      silc_client_listener_free(listener);
      return NULL;
    }

    if (!params->local_port) {
      /* Get listener port */
      SilcUInt16 *ports;
      ports = silc_net_listener_get_port(listener->tcp_listener, NULL);
      listener->params.local_port = ports[0];
      silc_free(ports);
    }
  }

  SILC_LOG_DEBUG(("Bound listener to %s:%d",
		  params->bind_ip ? params->bind_ip : params->local_ip,
		  listener->params.local_port));

  return listener;
}