void Gobby::CertificateManager::set_certificates(gnutls_x509_crt_t* certs,
                                                 guint n_certs,
                                                 const char* filename,
                                                 const GError* error)
{
	if(error != NULL)
	{
		g_assert(n_certs == 0);

		set_certificates(NULL, 0, error);
	}
	else
	{
		GError* local_error = NULL;
		if(filename != NULL)
		{
			m_conn_certificate_file.block();
			m_preferences.security.certificate_file = filename;
			m_conn_certificate_file.unblock();

			if(n_certs > 0)
			{
				inf_cert_util_write_certificate(
					certs, n_certs, filename,
					&local_error);
			}
		}

		if(local_error != NULL)
		{
			set_certificates(NULL, 0, local_error);
			for(guint i = 0; i < n_certs; ++i)
				gnutls_x509_crt_deinit(certs[i]);
			g_error_free(local_error);
		}
		else
		{
			set_certificates(certs, n_certs, NULL);
		}
	}
}
static gnutls_x509_crt_t*
infinoted_startup_load_certificate(InfinotedLog* log,
                                   gboolean create_self_signed_certificate,
                                   gnutls_x509_privkey_t key,
                                   const gchar* certificate_file,
                                   const gchar* certificate_chain_file,
                                   guint* n_certificates,
                                   GError** error)
{
  InfCertUtilDescription desc;
  gnutls_x509_crt_t* result;
  gnutls_x509_crt_t cert;
  GPtrArray* certs;
  GPtrArray* chain_certs;
  gboolean res;

  if(create_self_signed_certificate == TRUE)
  {
    if(infinoted_util_create_dirname(certificate_file, error) == FALSE)
      return NULL;


    infinoted_log_info(log, _("Generating self-signed certificate..."));
    desc.validity = 365 * 24 * 3600;
    desc.dn_common_name = g_get_host_name();
    desc.san_dnsname = g_get_host_name();

    cert = inf_cert_util_create_self_signed_certificate(key, &desc, error);
    if(cert == NULL) return NULL;

    res = inf_cert_util_write_certificate(&cert, 1, certificate_file, error);
    if(res == FALSE)
    {
      gnutls_x509_crt_deinit(cert);
      return NULL;
    }
    else
    {
      result = g_malloc(sizeof(gnutls_x509_crt_t));
      *result = cert;
      *n_certificates = 1;
    }
  }
  else
  {
    certs = inf_cert_util_read_certificate(certificate_file, NULL, error);
    if(certs == NULL) return NULL;

    if(certificate_chain_file != NULL)
    {
      chain_certs =
        inf_cert_util_read_certificate(certificate_chain_file, certs, error);

      if(chain_certs == NULL)
      {
        result = (gnutls_x509_crt_t*)g_ptr_array_free(certs, FALSE);
        infinoted_startup_free_certificate_array(result, *n_certificates);
        return NULL;
      }
    }

    *n_certificates = certs->len;
    result = (gnutls_x509_crt_t*)g_ptr_array_free(certs, FALSE);
  }

  return result;
}