[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