mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 13:06:23 +00:00
gst/registries/gstxmlregistry.c: Make registry saving atomic.
Original commit message from CVS: 2004-03-20 Colin Walters <walters@verbum.org> * gst/registries/gstxmlregistry.c: (gst_xml_registry_open_func, gst_xml_registry_close_func): Make registry saving atomic.
This commit is contained in:
parent
59c20484d0
commit
5dce08af99
2 changed files with 29 additions and 3 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2004-03-20 Colin Walters <walters@verbum.org>
|
||||||
|
|
||||||
|
* gst/registries/gstxmlregistry.c:
|
||||||
|
(gst_xml_registry_open_func, gst_xml_registry_close_func): Make
|
||||||
|
registry saving atomic.
|
||||||
|
|
||||||
2004-03-20 Colin Walters <walters@verbum.org>
|
2004-03-20 Colin Walters <walters@verbum.org>
|
||||||
|
|
||||||
* gst/registries/gstxmlregistry.c (gst_xml_registry_get_perms_func): Just use
|
* gst/registries/gstxmlregistry.c (gst_xml_registry_get_perms_func): Just use
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
|
||||||
#include <gst/gst_private.h>
|
#include <gst/gst_private.h>
|
||||||
|
@ -513,11 +514,22 @@ gst_xml_registry_open_func (GstXMLRegistry * registry, GstXMLRegistryMode mode)
|
||||||
registry->location);
|
registry->location);
|
||||||
registry->regfile = fopen (registry->location, "r");
|
registry->regfile = fopen (registry->location, "r");
|
||||||
} else if (mode == GST_XML_REGISTRY_WRITE) {
|
} else if (mode == GST_XML_REGISTRY_WRITE) {
|
||||||
|
char *tmploc;
|
||||||
|
int fd;
|
||||||
|
|
||||||
g_return_val_if_fail (gst_registry->flags & GST_REGISTRY_WRITABLE, FALSE);
|
g_return_val_if_fail (gst_registry->flags & GST_REGISTRY_WRITABLE, FALSE);
|
||||||
|
|
||||||
GST_CAT_DEBUG (GST_CAT_GST_INIT, "opening registry %s for writing",
|
tmploc = g_strconcat (registry->location, ".tmp", NULL);
|
||||||
registry->location);
|
|
||||||
registry->regfile = fopen (registry->location, "w");
|
GST_CAT_DEBUG (GST_CAT_GST_INIT, "opening registry %s for writing", tmploc);
|
||||||
|
|
||||||
|
if ((fd = open (tmploc, O_WRONLY | O_CREAT | O_EXCL, 0644)) < 0) {
|
||||||
|
g_free (tmploc);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
g_free (tmploc);
|
||||||
|
|
||||||
|
registry->regfile = fdopen (fd, "w");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!registry->regfile)
|
if (!registry->regfile)
|
||||||
|
@ -554,9 +566,17 @@ gst_xml_registry_save_func (GstXMLRegistry * registry, gchar * format, ...)
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_xml_registry_close_func (GstXMLRegistry * registry)
|
gst_xml_registry_close_func (GstXMLRegistry * registry)
|
||||||
{
|
{
|
||||||
|
char *tmploc;
|
||||||
|
|
||||||
GST_CAT_DEBUG (GST_CAT_GST_INIT, "closing registry %s", registry->location);
|
GST_CAT_DEBUG (GST_CAT_GST_INIT, "closing registry %s", registry->location);
|
||||||
fclose (registry->regfile);
|
fclose (registry->regfile);
|
||||||
|
|
||||||
|
/* If we opened for writing, rename our temporary file. */
|
||||||
|
tmploc = g_strconcat (registry->location, ".tmp", NULL);
|
||||||
|
if (g_file_test (tmploc, G_FILE_TEST_EXISTS))
|
||||||
|
rename (tmploc, registry->location);
|
||||||
|
g_free (tmploc);
|
||||||
|
|
||||||
registry->open = FALSE;
|
registry->open = FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
Loading…
Reference in a new issue