summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2013-02-08 11:39:03 +0100
committerChristophe Fergeau <cfergeau@redhat.com>2013-03-14 11:10:02 +0100
commitd8a79053c72136d75b6137f72cd528cd838a5410 (patch)
tree536291d205f3da1b94c2d2015ed45f4340d016e1
parent1899f83e20fdc447dc29564a5a3b3930bfcaa41c (diff)
Use gio to write trust store
This has the big advantage of being portable, in addition to removing some code. Big disadvantage is that this adds a dependency on gio.
-rw-r--r--SpiceXPI/src/plugin/plugin.cpp69
-rw-r--r--SpiceXPI/src/plugin/plugin.h2
-rw-r--r--configure.ac2
3 files changed, 39 insertions, 34 deletions
diff --git a/SpiceXPI/src/plugin/plugin.cpp b/SpiceXPI/src/plugin/plugin.cpp
index b2ea8a2..51d1c09 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,10 @@ nsPluginInstance::nsPluginInstance(NPP aInstance):
// create temporary directory in /tmp
char tmp_dir[] = "/tmp/spicec-XXXXXX";
m_tmp_dir = mkdtemp(tmp_dir);
+
+#if !GLIB_CHECK_VERSION(2, 35, 0)
+ g_type_init();
+#endif
}
nsPluginInstance::~nsPluginInstance()
@@ -647,41 +653,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);
+ 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_critical("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 +716,7 @@ void nsPluginInstance::Connect()
return;
}
- if (!this->CreateTrustStore()) {
+ if (!this->CreateTrustStoreFile(m_trust_store)) {
g_critical("failed to create trust store");
return;
}
@@ -844,8 +848,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)