/* * Copyright (C) 2001, 2004, 2005, 2007, 2008, 2009 Free Software Foundation * * Author: Nikos Mavrogiannopoulos * * This file is part of GNUTLS-EXTRA. * * GNUTLS-EXTRA is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GNUTLS-EXTRA is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #ifdef USE_LZO # ifdef USE_MINILZO # include "minilzo/minilzo.h" # elif HAVE_LZO_LZO1X_H # include # elif HAVE_LZO1X_H # include # endif #endif #include #ifdef USE_LZO #include /* the number of the compression algorithms available in the compression * structure. */ extern int _gnutls_comp_algorithms_size; typedef int (*LZO_FUNC) (); extern LZO_FUNC _gnutls_lzo1x_decompress_safe; extern LZO_FUNC _gnutls_lzo1x_1_compress; extern gnutls_compression_entry _gnutls_compression_algorithms[]; static int _gnutls_add_lzo_comp (void) { int i; /* find the last element */ for (i = 0; i < _gnutls_comp_algorithms_size; i++) { if (_gnutls_compression_algorithms[i].name == NULL) break; } if (_gnutls_compression_algorithms[i].name == NULL && (i < _gnutls_comp_algorithms_size - 1)) { _gnutls_compression_algorithms[i].name = "GNUTLS_COMP_LZO"; _gnutls_compression_algorithms[i].id = GNUTLS_COMP_LZO; _gnutls_compression_algorithms[i].num = 0xf2; _gnutls_compression_algorithms[i + 1].name = 0; /* Now enable the lzo functions: */ _gnutls_lzo1x_decompress_safe = lzo1x_decompress_safe; _gnutls_lzo1x_1_compress = lzo1x_1_compress; return 0; /* ok */ } return GNUTLS_E_MEMORY_ERROR; } #endif static int _gnutls_init_extra = 0; /** * gnutls_global_init_extra - initializes the global state of gnutls-extra * * This function initializes the global state of gnutls-extra library * to defaults. * * Note that gnutls_global_init() has to be called before this * function. If this function is not called then the gnutls-extra * library will not be usable. * * This function is not thread safe, see the discussion for * gnutls_global_init() on how to deal with that. * * Returns: On success, %GNUTLS_E_SUCCESS (zero) is returned, * otherwise an error code is returned. **/ int gnutls_global_init_extra (void) { int ret; /* If the version of libgnutls != version of * libextra, then do not initialize the library. * This is because it may break things. */ if (strcmp (gnutls_check_version (NULL), VERSION) != 0) { return GNUTLS_E_LIBRARY_VERSION_MISMATCH; } _gnutls_init_extra++; if (_gnutls_init_extra != 1) return 0; ret = gnutls_ext_register (GNUTLS_EXTENSION_INNER_APPLICATION, "INNER_APPLICATION", GNUTLS_EXT_TLS, _gnutls_inner_application_recv_params, _gnutls_inner_application_send_params); if (ret != GNUTLS_E_SUCCESS) return ret; /* Initialize the LZO library */ #ifdef USE_LZO if (lzo_init () != LZO_E_OK) return GNUTLS_E_LZO_INIT_FAILED; /* Add the LZO compression method in the list of compression * methods. */ ret = _gnutls_add_lzo_comp (); if (ret < 0) { gnutls_assert (); return ret; } #endif return 0; } /** * gnutls_extra_check_version - checks the libgnutls-extra version * @req_version: version string to compare with, or %NULL. * * Check GnuTLS Extra Library version. * * See %GNUTLS_EXTRA_VERSION for a suitable @req_version string. * * Return value: Check that the version of the library is at * minimum the one given as a string in @req_version and return the * actual version string of the library; return %NULL if the * condition is not met. If %NULL is passed to this function no * check is done and only the version string is returned. **/ const char * gnutls_extra_check_version (const char *req_version) { if (!req_version || strverscmp (req_version, VERSION) <= 0) return VERSION; return NULL; }