[Spice-devel] [spice-xpi 02/12] Use gio to write trust store

Marc-André Lureau marcandre.lureau at gmail.com
Tue Mar 12 04:59:07 PDT 2013


On Tue, Mar 12, 2013 at 12:22 PM, Christophe Fergeau
<cfergeau at redhat.com> wrote:
> This has the big advantage of being portable, in addition to removing
> some code. Big disadvantage is that this adds a dependency on gio.
> ---
>  SpiceXPI/src/plugin/plugin.cpp | 67 +++++++++++++++++++++---------------------
>  SpiceXPI/src/plugin/plugin.h   |  2 ++
>  configure.ac                   |  2 +-
>  3 files changed, 37 insertions(+), 34 deletions(-)
>
> diff --git a/SpiceXPI/src/plugin/plugin.cpp b/SpiceXPI/src/plugin/plugin.cpp
> index b2ea8a2..2da69cb 100644
> --- a/SpiceXPI/src/plugin/plugin.cpp
> +++ b/SpiceXPI/src/plugin/plugin.cpp
> @@ -57,6 +57,8 @@
>  #include <sstream>
>  #include <signal.h>
>  #include <glib.h>
> +#include <glib/gstdio.h>
> +#include <gio/gio.h>
>
>  extern "C" {
>  #include <pthread.h>
> @@ -188,6 +190,8 @@ nsPluginInstance::nsPluginInstance(NPP aInstance):
>      // create temporary directory in /tmp
>      char tmp_dir[] = "/tmp/spicec-XXXXXX";
>      m_tmp_dir = mkdtemp(tmp_dir);
> +
> +    g_type_init();

please make it conditionnal on #if !GLIB_CHECK_VERSION(2, 35, 0)

>  }
>
>  nsPluginInstance::~nsPluginInstance()
> @@ -647,41 +651,39 @@ bool nsPluginInstance::StartClient()
>      g_return_val_if_reached(false);
>  }
>
> -bool nsPluginInstance::CreateTrustStore(void)
> +bool nsPluginInstance::CreateTrustStoreFile(const std::string &trust_store)
>  {
> -    // create trust store filename
> -    FILE *fp;
> -    int fd = -1;
> -    char trust_store_template[] = "/tmp/truststore.pem-XXXXXX";
> -    mode_t prev_umask = umask(0177);
> -    fd = mkstemp(trust_store_template);
> -    umask(prev_umask);
> -    m_trust_store_file = trust_store_template;
> +    GFile *tmp_file;
> +    GFileIOStream *iostream;
> +    GOutputStream *stream;
>
> -    if (fd != -1)
> -    {
> -        fp = fdopen(fd,"w+");
> -        if (fp != NULL)
> -        {
> -            fputs(m_trust_store.c_str(), fp);
> -            fflush(fp);
> -            fsync(fd);
> -            fclose(fp);
> -        }
> -        else
> -        {
> -            g_critical("could not open truststore temp file");
> -            close(fd);
> -            unlink(m_trust_store_file.c_str());
> -            m_trust_store_file.clear();
> -            return false;
> -        }
> +    tmp_file = g_file_new_tmp ("trustore.pem-XXXXXX", &iostream, NULL);

extra space

> +    if (tmp_file == NULL) {
> +        g_message("Couldn't create truststore");
> +        return false;
>      }
> -    else
> -    {
> -        g_critical("could not create truststore temp file: %s", g_strerror(errno));
> +
> +    stream = g_io_stream_get_output_stream(G_IO_STREAM(iostream));
> +    if (!g_output_stream_write_all(stream,
> +                                   trust_store.c_str(),
> +                                   trust_store.length(),
> +                                   NULL, NULL, NULL)) {
> +        g_message("Couldn't write truststore");
>          return false;
>      }
> +    m_trust_store_file = g_file_get_path(tmp_file);
> +    g_object_unref(tmp_file);
> +    g_object_unref(iostream);
> +
> +    return true;
> +}
> +
> +bool nsPluginInstance::RemoveTrustStoreFile()
> +{
> +    if (g_unlink(m_trust_store_file.c_str()) != 0)
> +        return false;;
> +
> +    m_trust_store_file.clear();
>
>      return true;
>  }
> @@ -712,7 +714,7 @@ void nsPluginInstance::Connect()
>          return;
>      }
>
> -    if (!this->CreateTrustStore()) {
> +    if (!this->CreateTrustStoreFile(m_trust_store)) {
>          g_critical("failed to create trust store");
>          return;
>      }
> @@ -844,8 +846,7 @@ void *nsPluginInstance::ControllerWaitHelper(void *opaque)
>          fake_this->m_external_controller.Disconnect();
>      }
>
> -    unlink(fake_this->m_trust_store_file.c_str());
> -    fake_this->m_trust_store_file.clear();
> +    fake_this->RemoveTrustStoreFile();
>      fake_this->m_pid_controller = -1;
>      return NULL;
>  }
> diff --git a/SpiceXPI/src/plugin/plugin.h b/SpiceXPI/src/plugin/plugin.h
> index 9c56f73..ea50ca5 100644
> --- a/SpiceXPI/src/plugin/plugin.h
> +++ b/SpiceXPI/src/plugin/plugin.h
> @@ -187,6 +187,8 @@ private:
>  private:
>      bool StartClient();
>      bool CreateTrustStore();
> +    bool CreateTrustStoreFile(const std::string &trust_store);
> +    bool RemoveTrustStoreFile();
>
>      pid_t m_pid_controller;
>      int32_t m_connected_status;
> diff --git a/configure.ac b/configure.ac
> index 0ca271c..48d3a6b 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -24,7 +24,7 @@ AC_CONFIG_SUBDIRS([spice-protocol])
>  SPICE_PROTOCOL_CFLAGS='-I ${top_srcdir}/spice-protocol'
>  AC_SUBST(SPICE_PROTOCOL_CFLAGS)
>
> -PKG_CHECK_MODULES(GLIB, glib-2.0)
> +PKG_CHECK_MODULES(GLIB, glib-2.0 gio-2.0)
>  AC_SUBST(GLIB_CFLAGS)
>  AC_SUBST(GLIB_LIBS)
>
> --
> 1.8.1.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel



-- 
Marc-André Lureau


More information about the Spice-devel mailing list