Return NULL if the location id is NULL (archive_get_current_location_id):
2001-06-22 Bradford Hovinen <hovinen@ximian.com> * archive.c (archive_get_current_location): Return NULL if the location id is NULL (archive_get_current_location_id): Return NULL if storing the snapshot results in an error * location.c (location_store): Add return values for error conditions; remove g_warning's and g_critical's (location_store_full_snapshot): Folded in store_snapshot_cb; don't call location_foreach_backend (location_store_full_snapshot): Return error condition; 0 on success, -1 if any backend failed * location-manager-dialog.c (location_manager_dialog_set_arg): Add a check to inform the user if the location manager was unable to form an initial configuration snapshot
This commit is contained in:
parent
47d682e446
commit
a18fd85bba
4 changed files with 81 additions and 39 deletions
|
@ -1,5 +1,24 @@
|
||||||
|
2001-06-22 Bradford Hovinen <hovinen@ximian.com>
|
||||||
|
|
||||||
|
* archive.c (archive_get_current_location): Return NULL if the
|
||||||
|
location id is NULL
|
||||||
|
(archive_get_current_location_id): Return NULL if storing the
|
||||||
|
snapshot results in an error
|
||||||
|
|
||||||
|
* location.c (location_store): Add return values for error
|
||||||
|
conditions; remove g_warning's and g_critical's
|
||||||
|
(location_store_full_snapshot): Folded in store_snapshot_cb; don't
|
||||||
|
call location_foreach_backend
|
||||||
|
(location_store_full_snapshot): Return error condition; 0 on
|
||||||
|
success, -1 if any backend failed
|
||||||
|
|
||||||
2001-06-21 Bradford Hovinen <hovinen@ximian.com>
|
2001-06-21 Bradford Hovinen <hovinen@ximian.com>
|
||||||
|
|
||||||
|
* location.c (location_do_rollback): Wait for child process to
|
||||||
|
terminate
|
||||||
|
(run_backend_proc): Take an extra argument -- where to store the
|
||||||
|
PID of the child process
|
||||||
|
|
||||||
* archive.c (archive_set_current_location): Use
|
* archive.c (archive_set_current_location): Use
|
||||||
location_get_changed_backends
|
location_get_changed_backends
|
||||||
|
|
||||||
|
|
|
@ -405,18 +405,24 @@ archive_unregister_location (Archive *archive, Location *location)
|
||||||
*
|
*
|
||||||
* Convenience function to get a pointer to the current location
|
* Convenience function to get a pointer to the current location
|
||||||
*
|
*
|
||||||
* Return value: Pointer to current location
|
* Return value: Pointer to current location, or NULL if the current location
|
||||||
|
* does not exist and a default location could not be created
|
||||||
**/
|
**/
|
||||||
|
|
||||||
Location *
|
Location *
|
||||||
archive_get_current_location (Archive *archive)
|
archive_get_current_location (Archive *archive)
|
||||||
{
|
{
|
||||||
|
gchar *locid;
|
||||||
|
|
||||||
g_return_val_if_fail (archive != NULL, NULL);
|
g_return_val_if_fail (archive != NULL, NULL);
|
||||||
g_return_val_if_fail (IS_ARCHIVE (archive), NULL);
|
g_return_val_if_fail (IS_ARCHIVE (archive), NULL);
|
||||||
|
|
||||||
return archive_get_location (archive,
|
locid = archive_get_current_location_id (archive);
|
||||||
archive_get_current_location_id
|
|
||||||
(archive));
|
if (locid == NULL)
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
return archive_get_location (archive, locid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -484,7 +490,9 @@ archive_set_current_location_id (Archive *archive, const gchar *locid)
|
||||||
*
|
*
|
||||||
* Get the name of the current location
|
* Get the name of the current location
|
||||||
*
|
*
|
||||||
* Return value: String containing current location, should not be freed
|
* Return value: String containing current location, should not be freed, or
|
||||||
|
* NULL if no current location exists and the default location could not be
|
||||||
|
* created
|
||||||
**/
|
**/
|
||||||
|
|
||||||
const gchar *
|
const gchar *
|
||||||
|
@ -514,7 +522,10 @@ archive_get_current_location_id (Archive *archive)
|
||||||
(location_new (archive,
|
(location_new (archive,
|
||||||
archive->current_location_id,
|
archive->current_location_id,
|
||||||
NULL));
|
NULL));
|
||||||
location_store_full_snapshot (loc);
|
if (location_store_full_snapshot (loc) < 0) {
|
||||||
|
location_delete (loc);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <tree.h>
|
#include <tree.h>
|
||||||
|
@ -91,9 +92,6 @@ static gboolean location_do_rollback (Location *location,
|
||||||
gchar *backend_id,
|
gchar *backend_id,
|
||||||
xmlDocPtr xml_doc);
|
xmlDocPtr xml_doc);
|
||||||
|
|
||||||
static gint store_snapshot_cb (Location *location,
|
|
||||||
gchar *backend_id);
|
|
||||||
|
|
||||||
static gint get_backends_cb (BackendList *backend_list,
|
static gint get_backends_cb (BackendList *backend_list,
|
||||||
gchar *backend_id,
|
gchar *backend_id,
|
||||||
Location *location);
|
Location *location);
|
||||||
|
@ -109,7 +107,8 @@ static void write_metadata_file (Location *location,
|
||||||
|
|
||||||
static xmlDocPtr load_xml_data (gchar *fullpath, gint id);
|
static xmlDocPtr load_xml_data (gchar *fullpath, gint id);
|
||||||
static gint run_backend_proc (gchar *backend_id,
|
static gint run_backend_proc (gchar *backend_id,
|
||||||
gboolean do_get);
|
gboolean do_get,
|
||||||
|
pid_t *pid);
|
||||||
|
|
||||||
static BackendNote *backend_note_new (gchar *backend_id,
|
static BackendNote *backend_note_new (gchar *backend_id,
|
||||||
ContainmentType type);
|
ContainmentType type);
|
||||||
|
@ -398,8 +397,9 @@ location_finalize (GtkObject *object)
|
||||||
static gboolean
|
static gboolean
|
||||||
location_do_rollback (Location *location, gchar *backend_id, xmlDocPtr doc)
|
location_do_rollback (Location *location, gchar *backend_id, xmlDocPtr doc)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd, status;
|
||||||
FILE *output;
|
FILE *output;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
g_return_val_if_fail (location != NULL, FALSE);
|
g_return_val_if_fail (location != NULL, FALSE);
|
||||||
g_return_val_if_fail (IS_LOCATION (location), FALSE);
|
g_return_val_if_fail (IS_LOCATION (location), FALSE);
|
||||||
|
@ -411,7 +411,7 @@ location_do_rollback (Location *location, gchar *backend_id, xmlDocPtr doc)
|
||||||
*/
|
*/
|
||||||
if (doc == NULL) return FALSE;
|
if (doc == NULL) return FALSE;
|
||||||
|
|
||||||
fd = run_backend_proc (backend_id, FALSE);
|
fd = run_backend_proc (backend_id, FALSE, &pid);
|
||||||
if (fd == -1) return FALSE;
|
if (fd == -1) return FALSE;
|
||||||
|
|
||||||
output = fdopen (fd, "w");
|
output = fdopen (fd, "w");
|
||||||
|
@ -430,6 +430,8 @@ location_do_rollback (Location *location, gchar *backend_id, xmlDocPtr doc)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
waitpid (pid, &status, 0);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -503,9 +505,12 @@ location_delete (Location *location)
|
||||||
*
|
*
|
||||||
* Store configuration data from the given stream in the location under the
|
* Store configuration data from the given stream in the location under the
|
||||||
* given backend id
|
* given backend id
|
||||||
|
*
|
||||||
|
* Return value: 0 on success, -1 if it cannot parse the XML, and -2 if no
|
||||||
|
* data were supplied
|
||||||
**/
|
**/
|
||||||
|
|
||||||
void
|
gint
|
||||||
location_store (Location *location, gchar *backend_id, FILE *input,
|
location_store (Location *location, gchar *backend_id, FILE *input,
|
||||||
StoreType store_type)
|
StoreType store_type)
|
||||||
{
|
{
|
||||||
|
@ -532,18 +537,18 @@ location_store (Location *location, gchar *backend_id, FILE *input,
|
||||||
doc = xmlParseDoc (doc_str->str);
|
doc = xmlParseDoc (doc_str->str);
|
||||||
|
|
||||||
if (doc == NULL) {
|
if (doc == NULL) {
|
||||||
g_warning ("Could not parse XML");
|
|
||||||
g_string_free (doc_str, TRUE);
|
g_string_free (doc_str, TRUE);
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
location_store_xml (location, backend_id, doc, store_type);
|
location_store_xml (location, backend_id, doc, store_type);
|
||||||
xmlFreeDoc (doc);
|
xmlFreeDoc (doc);
|
||||||
} else {
|
} else {
|
||||||
g_critical ("No data to store");
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_string_free (doc_str, TRUE);
|
g_string_free (doc_str, TRUE);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1173,17 +1178,37 @@ location_set_id (Location *location, const gchar *locid)
|
||||||
*
|
*
|
||||||
* Gets XML snapshot data from all the backends contained in this location and
|
* Gets XML snapshot data from all the backends contained in this location and
|
||||||
* archives those data
|
* archives those data
|
||||||
|
*
|
||||||
|
* Return value: 0 on success and -1 if any of the backends failed
|
||||||
**/
|
**/
|
||||||
|
|
||||||
void
|
gint
|
||||||
location_store_full_snapshot (Location *location)
|
location_store_full_snapshot (Location *location)
|
||||||
{
|
{
|
||||||
|
int fd;
|
||||||
|
gint ret;
|
||||||
|
FILE *pipe;
|
||||||
|
GList *c;
|
||||||
|
BackendNote *note;
|
||||||
|
|
||||||
g_return_if_fail (location != NULL);
|
g_return_if_fail (location != NULL);
|
||||||
g_return_if_fail (IS_LOCATION (location));
|
g_return_if_fail (IS_LOCATION (location));
|
||||||
|
|
||||||
location_foreach_backend (location,
|
for (c = location->p->contains_list; c; c = c->next) {
|
||||||
(LocationBackendCB) store_snapshot_cb,
|
note = c->data;
|
||||||
NULL);
|
DEBUG_MSG ("Storing %s", note->backend_id);
|
||||||
|
|
||||||
|
fd = run_backend_proc (note->backend_id, TRUE, NULL);
|
||||||
|
pipe = fdopen (fd, "r");
|
||||||
|
ret = location_store (location, note->backend_id,
|
||||||
|
pipe, STORE_DEFAULT);
|
||||||
|
fclose (pipe);
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1241,22 +1266,6 @@ location_does_backend_change (Location *location, Location *location1,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
|
||||||
store_snapshot_cb (Location *location, gchar *backend_id)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
FILE *pipe;
|
|
||||||
|
|
||||||
DEBUG_MSG ("Storing %s", backend_id);
|
|
||||||
|
|
||||||
fd = run_backend_proc (backend_id, TRUE);
|
|
||||||
pipe = fdopen (fd, "r");
|
|
||||||
location_store (location, backend_id, pipe, STORE_DEFAULT);
|
|
||||||
fclose (pipe);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
get_backends_cb (BackendList *backend_list, gchar *backend_id,
|
get_backends_cb (BackendList *backend_list, gchar *backend_id,
|
||||||
Location *location)
|
Location *location)
|
||||||
|
@ -1530,7 +1539,7 @@ load_xml_data (gchar *fullpath, gint id)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
run_backend_proc (gchar *backend_id, gboolean do_get)
|
run_backend_proc (gchar *backend_id, gboolean do_get, pid_t *pid_r)
|
||||||
{
|
{
|
||||||
char *args[3];
|
char *args[3];
|
||||||
int fd[2];
|
int fd[2];
|
||||||
|
@ -1577,6 +1586,9 @@ run_backend_proc (gchar *backend_id, gboolean do_get)
|
||||||
exit (-1);
|
exit (-1);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
if (pid_r != NULL)
|
||||||
|
*pid_r = pid;
|
||||||
|
|
||||||
close (fd[c_fd]);
|
close (fd[c_fd]);
|
||||||
return fd[p_fd];
|
return fd[p_fd];
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,7 @@ GtkObject *location_open (Archive *archive,
|
||||||
void location_close (Location *location);
|
void location_close (Location *location);
|
||||||
void location_delete (Location *location);
|
void location_delete (Location *location);
|
||||||
|
|
||||||
void location_store (Location *location,
|
gint location_store (Location *location,
|
||||||
gchar *backend_id,
|
gchar *backend_id,
|
||||||
FILE *input,
|
FILE *input,
|
||||||
StoreType store_type);
|
StoreType store_type);
|
||||||
|
@ -139,7 +139,7 @@ const gchar *location_get_id (Location *location);
|
||||||
|
|
||||||
void location_set_id (Location *location, const gchar *locid);
|
void location_set_id (Location *location, const gchar *locid);
|
||||||
|
|
||||||
void location_store_full_snapshot (Location *location);
|
gint location_store_full_snapshot (Location *location);
|
||||||
|
|
||||||
GList *location_get_changed_backends (Location *location,
|
GList *location_get_changed_backends (Location *location,
|
||||||
Location *location1);
|
Location *location1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue