]> git.pld-linux.org Git - packages/GConf2.git/commitdiff
- add dialog to offer to delete gconf locks (patch from rawhide).
authorkloczek <kloczek@pld-linux.org>
Sat, 7 Sep 2002 05:28:39 +0000 (05:28 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    GConf2-unlock-dialog.patch -> 1.1

GConf2-unlock-dialog.patch [new file with mode: 0644]

diff --git a/GConf2-unlock-dialog.patch b/GConf2-unlock-dialog.patch
new file mode 100644 (file)
index 0000000..e4d76d1
--- /dev/null
@@ -0,0 +1,438 @@
+Index: backends/xml-backend.c
+===================================================================
+RCS file: /cvs/gnome/gconf/backends/xml-backend.c,v
+retrieving revision 1.81
+diff -u -p -u -r1.81 xml-backend.c
+--- GConf-1.2.1/backends/xml-backend.c 21 Mar 2002 23:55:06 -0000      1.81
++++ GConf-1.2.1/backends/xml-backend.c 21 Aug 2002 12:47:17 -0000
+@@ -206,6 +206,8 @@ static void          destroy_source  (GC
+ static void          clear_cache     (GConfSource* source);
++static void          blow_away_locks (const char *address);
++
+ static GConfBackendVTable xml_vtable = {
+   x_shutdown,
+   resolve_address,
+@@ -224,7 +226,8 @@ static GConfBackendVTable xml_vtable = {
+   set_schema,
+   sync_all,
+   destroy_source,
+-  clear_cache
++  clear_cache,
++  blow_away_locks
+ };
+ static void          
+@@ -267,13 +270,48 @@ writable (GConfSource* source,
+   return TRUE;
+ }
++static char*
++get_dir_from_address (const char *address,
++                      GError    **err)
++{
++  char *root_dir;
++  int len;
++  
++  root_dir = gconf_address_resource (address);
++
++  if (root_dir == NULL)
++    {
++      gconf_set_error (err, GCONF_ERROR_BAD_ADDRESS,
++                       _("Couldn't find the XML root directory in the address `%s'"),
++                       address);
++      return NULL;
++    }
++
++  /* Chop trailing '/' to canonicalize */
++  len = strlen (root_dir);
++
++  if (root_dir[len-1] == '/')
++    root_dir[len-1] = '\0';
++
++  return root_dir;
++}
++
++static char*
++get_lock_dir_from_root_dir (const char *root_dir)
++{
++  gchar* lockdir;
++  
++  lockdir = gconf_concat_dir_and_key (root_dir, "%gconf-xml-backend.lock");
++
++  return lockdir;
++}
++
+ static GConfSource*  
+ resolve_address (const gchar* address, GError** err)
+ {
+   gchar* root_dir;
+   XMLSource* xsource;
+   GConfSource* source;
+-  guint len;
+   gint flags = 0;
+   GConfLock* lock = NULL;
+   guint dir_mode = 0700;
+@@ -281,20 +319,10 @@ resolve_address (const gchar* address, G
+   gchar** address_flags;
+   gchar** iter;
+   gboolean force_readonly;
+-  
+-  root_dir = gconf_address_resource(address);
++  root_dir = get_dir_from_address (address, err);
+   if (root_dir == NULL)
+-    {
+-      gconf_set_error(err, GCONF_ERROR_BAD_ADDRESS, _("Couldn't find the XML root directory in the address `%s'"), address);
+-      return NULL;
+-    }
+-
+-  /* Chop trailing '/' to canonicalize */
+-  len = strlen(root_dir);
+-
+-  if (root_dir[len-1] == '/')
+-    root_dir[len-1] = '\0';
++    return NULL;
+   if (mkdir(root_dir, dir_mode) < 0)
+     {
+@@ -374,7 +402,7 @@ resolve_address (const gchar* address, G
+       {
+         gchar* lockdir;
+-        lockdir = gconf_concat_dir_and_key(root_dir, "%gconf-xml-backend.lock");
++        lockdir = get_lock_dir_from_root_dir (root_dir);
+         
+         lock = gconf_get_lock(lockdir, err);
+@@ -712,6 +740,58 @@ clear_cache     (GConfSource* source)
+   /* clean all entries older than 0 seconds */
+   cache_clean(xs->cache, 0);
++}
++
++static void
++blow_away_locks (const char *address)
++{
++  char *root_dir;
++  char *lock_dir;
++  DIR *dp;
++  struct dirent *dent;
++  
++  root_dir = get_dir_from_address (address, NULL);
++  if (root_dir == NULL)
++    return;
++
++  lock_dir = get_lock_dir_from_root_dir (root_dir);
++
++  dp = opendir (lock_dir);
++  
++  if (dp == NULL)
++    {
++      g_printerr (_("Could not open lock directory for %s to remove locks: %s\n"),
++                  address, g_strerror (errno));
++      goto out;
++    }
++  
++  while ((dent = readdir (dp)) != NULL)
++    {
++      char *path;
++      
++      /* ignore ., .. (and any ..foo as an intentional who-cares bug) */
++      if (dent->d_name[0] == '.' &&
++          (dent->d_name[1] == '\0' || dent->d_name[1] == '.'))
++        continue;
++
++      path = g_build_filename (lock_dir, dent->d_name, NULL);
++
++      if (unlink (path) < 0)
++        {
++          g_printerr (_("Could not remove file %s: %s\n"),
++                      path, g_strerror (errno));
++        }
++
++      g_free (path);
++    }
++
++ out:
++
++  if (dp)
++    closedir (dp);
++  
++  g_free (root_dir);
++  g_free (lock_dir);
+ }
+ /* Initializer */
+Index: gconf/gconf-backend.c
+===================================================================
+RCS file: /cvs/gnome/gconf/gconf/gconf-backend.c,v
+retrieving revision 1.21
+diff -u -p -u -r1.21 gconf-backend.c
+--- GConf-1.2.1/gconf/gconf-backend.c  4 Dec 2001 22:17:09 -0000       1.21
++++ GConf-1.2.1/gconf/gconf-backend.c  21 Aug 2002 12:47:17 -0000
+@@ -353,5 +353,15 @@ gconf_backend_resolve_address (GConfBack
+   return retval;
+ }
++void
++gconf_blow_away_locks (const gchar* address)
++{
++  GConfBackend* backend;
++  backend = gconf_get_backend (address, NULL);
++  if (backend != NULL)
++    {
++      (*backend->vtable->blow_away_locks) (address);
++    }
++}
+Index: gconf/gconf-backend.h
+===================================================================
+RCS file: /cvs/gnome/gconf/gconf/gconf-backend.h,v
+retrieving revision 1.29
+diff -u -p -u -r1.29 gconf-backend.h
+--- GConf-1.2.1/gconf/gconf-backend.h  13 Jul 2001 22:07:37 -0000      1.29
++++ GConf-1.2.1/gconf/gconf-backend.h  21 Aug 2002 12:47:17 -0000
+@@ -127,6 +127,9 @@ struct _GConfBackendVTable {
+   /* This is basically used by the test suite */
+   void                (* clear_cache)     (GConfSource* source);
++
++  /* used by gconf-sanity-check */
++  void                (* blow_away_locks) (const char *address);
+ };
+ struct _GConfBackend {
+@@ -161,6 +164,8 @@ void          gconf_backend_unref(GConfB
+ GConfSource*  gconf_backend_resolve_address (GConfBackend* backend, 
+                                              const gchar* address,
+                                              GError** err);
++
++void          gconf_blow_away_locks       (const gchar* address);
+ #endif
+Index: gconf/gconf-internals.c
+===================================================================
+RCS file: /cvs/gnome/gconf/gconf/gconf-internals.c,v
+retrieving revision 1.114
+diff -u -p -u -r1.114 gconf-internals.c
+--- GConf-1.2.1/gconf/gconf-internals.c        4 Aug 2002 17:44:16 -0000       1.114
++++ GConf-1.2.1/gconf/gconf-internals.c        21 Aug 2002 12:47:18 -0000
+@@ -2701,6 +2701,24 @@ gconf_get_current_lock_holder  (const gc
+   return server;
+ }
++void
++gconf_daemon_blow_away_locks (void)
++{
++  char *lock_directory;
++  char *iorfile;
++  
++  lock_directory = gconf_get_lock_dir ();
++
++  iorfile = g_strconcat (lock_directory, "/ior", NULL);
++
++  if (unlink (iorfile) < 0)
++    g_printerr (_("Failed to unlink lock file %s: %s\n"),
++                iorfile, g_strerror (errno));
++
++  g_free (iorfile);
++  g_free (lock_directory);
++}
++
+ static CORBA_ORB gconf_orb = CORBA_OBJECT_NIL;      
+ CORBA_ORB
+Index: gconf/gconf-internals.h
+===================================================================
+RCS file: /cvs/gnome/gconf/gconf/gconf-internals.h,v
+retrieving revision 1.74
+diff -u -p -u -r1.74 gconf-internals.h
+--- GConf-1.2.1/gconf/gconf-internals.h        3 Jun 2002 02:36:26 -0000       1.74
++++ GConf-1.2.1/gconf/gconf-internals.h        21 Aug 2002 12:47:18 -0000
+@@ -190,6 +190,8 @@ GConfLock* gconf_get_lock_or_current_hol
+ ConfigServer gconf_get_current_lock_holder  (const gchar *lock_directory,
+                                              GString     *failure_log);
++void gconf_daemon_blow_away_locks (void);
++
+ GError*  gconf_error_new  (GConfError en,
+                            const gchar* format, ...) G_GNUC_PRINTF (2, 3);
+Index: gconf/gconf-sanity-check.c
+===================================================================
+RCS file: /cvs/gnome/gconf/gconf/gconf-sanity-check.c,v
+retrieving revision 1.4
+diff -u -p -u -r1.4 gconf-sanity-check.c
+--- GConf-1.2.1/gconf/gconf-sanity-check.c     21 Mar 2002 23:55:09 -0000      1.4
++++ GConf-1.2.1/gconf/gconf-sanity-check.c     21 Aug 2002 12:47:18 -0000
+@@ -53,8 +53,9 @@ struct poptOption options[] = {
+ static gboolean ensure_gtk (void);
+ static void     show_fatal_error_dialog (const char *format,
+                                          ...) G_GNUC_PRINTF (1, 2);
++static gboolean offer_delete_locks (void);
+ static gboolean check_file_locking (void);
+-static gboolean check_gconf (void);
++static gboolean check_gconf (gboolean display_errors);
+ int 
+ main (int argc, char** argv)
+@@ -83,8 +84,14 @@ main (int argc, char** argv)
+   if (!check_file_locking ())
+     return 1;
+-  if (!check_gconf ())
+-    return 1;
++  if (!check_gconf (FALSE))
++    {
++      if (!offer_delete_locks ())
++        return 1;
++  
++      if (!check_gconf (TRUE))
++        return 1;
++    }
+   
+   return 0;
+ }
+@@ -164,7 +171,7 @@ check_file_locking (void)
+ }
+ static gboolean
+-check_gconf (void)
++check_gconf (gboolean display_errors)
+ {
+   GSList* addresses;
+   GSList* tmp;
+@@ -192,11 +199,12 @@ check_gconf (void)
+   if (addresses == NULL)
+     {
+-      show_fatal_error_dialog (_("Please contact your system administrator to resolve the following problem:\n"
+-                                 "No configuration sources in the configuration file \"%s\"; this means that preferences and other settings can't be saved. %s%s"),
+-                               conffile,
+-                               error ? _("Error reading the file: ") : "",
+-                               error ? error->message : "");
++      if (display_errors)
++        show_fatal_error_dialog (_("Please contact your system administrator to resolve the following problem:\n"
++                                   "No configuration sources in the configuration file \"%s\"; this means that preferences and other settings can't be saved. %s%s"),
++                                 conffile,
++                                 error ? _("Error reading the file: ") : "",
++                                 error ? error->message : "");
+       if (error)
+         g_error_free (error);
+@@ -217,9 +225,10 @@ check_gconf (void)
+       if (error)
+         {
+-          show_fatal_error_dialog (_("Please contact your system administrator to resolve the following problem:\n"
+-                                     "Could not resolve the address \"%s\" in the configuration file \"%s\": %s"),
+-                                   address, conffile, error->message);
++          if (display_errors)
++            show_fatal_error_dialog (_("Please contact your system administrator to resolve the following problem:\n"
++                                       "Could not resolve the address \"%s\" in the configuration file \"%s\": %s"),
++                                     address, conffile, error->message);
+           g_error_free (error);
+           goto out;
+         }
+@@ -269,6 +278,97 @@ show_fatal_error_dialog (const char *for
+   gtk_dialog_run (GTK_DIALOG (d));
+   gtk_widget_destroy (d);
++}
++
++static gboolean
++offer_delete_locks (void)
++{
++  gboolean delete_locks;
++  const char *question;
++
++  delete_locks = FALSE;
++  question = _("Your preferences files are currently in use. "
++               "(If you are logged in to this same account from "
++               "another computer, the other login session is probably using "
++               "your preferences files.) "
++               "You can choose to continue, but be aware that other login "
++               "sessions may become temporarily confused. "
++               "If you are not logged in elsewhere, it should be harmless to "
++               "continue.");
++      
++  if (ensure_gtk ())
++    {
++      GtkDialog *d;
++      int response;
++      
++      d = gtk_message_dialog_new (NULL, 0,
++                                  GTK_MESSAGE_ERROR,
++                                  GTK_BUTTONS_NONE,
++                                  "%s", question);
++
++      gtk_dialog_add_buttons (GTK_DIALOG (d),
++                              GTK_STOCK_CANCEL,
++                              GTK_RESPONSE_REJECT,
++                              _("Continue"),
++                              GTK_RESPONSE_ACCEPT,
++                              NULL);
++      
++      response = gtk_dialog_run (GTK_DIALOG (d));
++
++      gtk_widget_destroy (d);
++
++      if (response == GTK_RESPONSE_ACCEPT)
++        delete_locks = TRUE;
++    }
++  else
++    {
++      g_print (_("%s Continue (y/n)?"), question);
++      switch (getchar ())
++        {
++        case 'y':
++        case 'Y':
++          delete_locks = TRUE;
++          break;
++        }
++    }
++
++  if (delete_locks)
++    {
++      GSList* addresses;
++      GSList* tmp;
++      char *conffile;
++      
++      conffile = g_strconcat (GCONF_CONFDIR, "/path", NULL);
++      
++      addresses = gconf_load_source_path (conffile, NULL);
++
++      g_free (conffile);
++      
++      if (addresses == NULL)
++        g_printerr ("Failed to load addresses to delete locks\n");
++
++      tmp = addresses;
++      while (tmp != NULL)
++        {
++          const char *address;
++          
++          address = tmp->data;
++          
++          gconf_blow_away_locks (address);
++
++          g_free (tmp->data);
++          
++          tmp = tmp->next;
++        }
++
++      g_slist_free (addresses);
++      
++      gconf_daemon_blow_away_locks ();
++
++      return TRUE;
++    }
++
++  return FALSE;
+ }
+ /* this is because setting up gtk is kind of slow, no point doing it
This page took 0.068526 seconds and 4 git commands to generate.