dsk_boolean dsk_ssl_stream_new (DskSslStreamOptions *options, DskSslStream **stream_out, DskOctetSource **source_out, DskOctetSink **sink_out, DskError **error) { DskSslStream *stream; DskSslSink *sink; DskSslSource *source; if (sink_out == NULL || source_out == NULL) { dsk_set_error (error, "dsk_ssl_stream_new: sink/source"); return DSK_FALSE; } sink = dsk_object_new (&dsk_ssl_sink_class); source = dsk_object_new (&dsk_ssl_source_class); stream = dsk_object_new (&dsk_ssl_stream_class); BIO *bio; bio = BIO_new (&bio_method__ssl_underlying_stream); bio->ptr = stream; bio->init = 1; /// HMM... stream->ssl = SSL_new (options->context->ctx); stream->context = dsk_object_ref (options->context); SSL_set_bio (stream->ssl, bio, bio); stream->base_instance.sink = DSK_OCTET_SINK (sink); /* does not own */ stream->base_instance.source = DSK_OCTET_SOURCE (source); /* does not own */ stream->is_client = options->is_client ? 1 : 0; stream->handshaking = DSK_TRUE; sink->base_instance.stream = dsk_object_ref (stream); source->base_instance.stream = dsk_object_ref (stream); if (stream->is_client) SSL_set_connect_state (stream->ssl); else SSL_set_accept_state (stream->ssl); *sink_out = DSK_OCTET_SINK (sink); *source_out = DSK_OCTET_SOURCE (source); if (stream_out != NULL) *stream_out = stream; else dsk_object_unref (stream); return DSK_TRUE; }
DskOctetFilter *dsk_bz2lib_decompressor_new (void) { DskBz2libDecompressor *rv = dsk_object_new (&dsk_bz2lib_decompressor_class); int zrv; zrv = BZ2_bzDecompressInit (&rv->bz2lib, DSK_FALSE, DSK_FALSE); if (zrv != BZ_OK) { dsk_warning ("BZ2_bzDecompressInit returned error"); dsk_object_unref (rv); return NULL; } rv->initialized = DSK_TRUE; return DSK_OCTET_FILTER (rv); }
DskOctetFilter *dsk_bz2lib_compressor_new (unsigned level) { DskBz2libCompressor *rv = dsk_object_new (&dsk_bz2lib_compressor_class); int zrv; zrv = BZ2_bzCompressInit (&rv->bz2lib, level, DSK_FALSE, 0); if (zrv != BZ_OK) { dsk_warning ("deflateInit2 returned error: %s", bzrv_to_string (zrv)); dsk_object_unref (rv); return NULL; } rv->initialized = DSK_TRUE; return DSK_OCTET_FILTER (rv); }
DskSslContext * dsk_ssl_context_new (DskSslContextOptions *options, DskError **error) { const SSL_METHOD *method = SSLv3_method (); SSL_CTX *ctx = SSL_CTX_new (method); DskSslContext *rv = dsk_object_new (&dsk_ssl_context_class); rv->ctx = ctx; if (options->password) { rv->password = dsk_strdup (options->password); SSL_CTX_set_default_passwd_cb (ctx, set_password_cb); SSL_CTX_set_default_passwd_cb_userdata (ctx, rv); } if (options->cert_filename) { if (SSL_CTX_use_certificate_file (ctx, options->cert_filename, SSL_FILETYPE_PEM) != 1) { dsk_set_error (error, "error using certificate file %s", options->cert_filename); dsk_object_unref (rv); return NULL; } } if (options->key_filename) { if (SSL_CTX_use_PrivateKey_file (ctx, options->key_filename, SSL_FILETYPE_PEM) != 1) { dsk_set_error (error, "error using key file %s", options->key_filename); dsk_object_unref (rv); return NULL; } } return rv; }
DskSyncFilter *dsk_whitespace_trimmer_new (void) { DskWhitespaceTrimmer *trimmer = dsk_object_new (&dsk_whitespace_trimmer_class); trimmer->in_initial_space = trimmer->in_space = DSK_TRUE; return DSK_SYNC_FILTER (trimmer); }
DskOctetFilter *dsk_hex_decoder_new (void) { DskHexDecoder *rv = dsk_object_new (&dsk_hex_decoder_class); return DSK_OCTET_FILTER (rv); }
DskOctetFilter *dsk_xml_escaper_new (void) { return dsk_object_new (&dsk_xml_escaper_class); }
DskOctetFilter *dsk_utf8_fixer_new (DskUtf8FixerMode mode) { DskUtf8Fixer *fixer = dsk_object_new (&dsk_utf8_fixer_class); fixer->mode = mode; return &fixer->base; }
dsk_boolean dsk_client_stream_new (DskClientStreamOptions *options, DskClientStream **stream_out, DskOctetSink **sink_out, DskOctetSource **source_out, DskError **error) { DskClientStream *rv; dsk_boolean has_address = !ip_address_is_default (&options->address); /* check trivial usage considerations */ dsk_warn_if_fail (!(options->hostname != NULL && has_address), "ignoring ip-address because symbolic name given"); if (options->hostname != NULL || has_address) { if (options->port == 0) { dsk_set_error (error, "port must be non-zero for client (hostname is '%s')", options->hostname); return DSK_FALSE; } dsk_warn_if_fail (options->path == NULL, "cannot decide between tcp and local client"); } rv = dsk_object_new (&dsk_client_stream_class); rv->base_instance.sink = dsk_object_new (&dsk_client_stream_sink_class); rv->base_instance.source = dsk_object_new (&dsk_client_stream_source_class); rv->base_instance.sink->stream = dsk_object_ref (rv); rv->base_instance.source->stream = dsk_object_ref (rv); rv->reconnect_time_ms = -1; rv->idle_disconnect_time_ms = -1; rv->fd = -1; if (options->hostname != NULL) { if (dsk_hostname_looks_numeric (options->hostname)) rv->is_numeric_name = 1; rv->name = dsk_strdup (options->hostname); rv->port = options->port; } else if (has_address) { rv->is_numeric_name = 1; rv->name = dsk_ip_address_to_string (&options->address); rv->port = options->port; } else if (options->path != NULL) { rv->is_local_socket = 1; rv->name = dsk_strdup (options->path); } rv->idle_disconnect_time_ms = options->idle_disconnect_time; rv->reconnect_time_ms = options->reconnect_time; begin_connecting (rv); if (options->idle_disconnect_time >= 0) dsk_client_stream_set_max_idle_time (rv, options->idle_disconnect_time); if (options->reconnect_time >= 0) dsk_client_stream_set_reconnect_time (rv, options->reconnect_time); if (source_out) *source_out = rv->base_instance.source; else if (rv->base_instance.source) dsk_object_unref (rv->base_instance.source); if (sink_out) *sink_out = rv->base_instance.sink; else if (rv->base_instance.sink) dsk_object_unref (rv->base_instance.sink); if (stream_out) *stream_out = rv; else dsk_object_unref (rv); return DSK_TRUE; }