[126128] trunk/dports/gnome/gnome-desktop

devans at macports.org devans at macports.org
Sat Oct 4 07:04:15 PDT 2014


Revision: 126128
          https://trac.macports.org/changeset/126128
Author:   devans at macports.org
Date:     2014-10-04 07:04:15 -0700 (Sat, 04 Oct 2014)
Log Message:
-----------
gnome-desktop: update to version 3.14.0.

Modified Paths:
--------------
    trunk/dports/gnome/gnome-desktop/Portfile
    trunk/dports/gnome/gnome-desktop/files/patch-libgnome-destktop-libgsystem.diff

Removed Paths:
-------------
    trunk/dports/gnome/gnome-desktop/files/patch-gnome-desktop-Makefile.am.diff

Property Changed:
----------------
    trunk/dports/gnome/gnome-desktop/


Property changes on: trunk/dports/gnome/gnome-desktop
___________________________________________________________________
Modified: svn:mergeinfo
   - /users/devans/GNOME-3/stable/dports/gnome/gnome-desktop:108269-120079
/users/devans/GNOME-3/unstable/dports/gnome/gnome-desktop:116416-118152
   + /users/devans/GNOME-3/stable/dports/gnome/gnome-desktop:108269-126096
/users/devans/GNOME-3/unstable/dports/gnome/gnome-desktop:116416-118152,119624-125621

Modified: trunk/dports/gnome/gnome-desktop/Portfile
===================================================================
--- trunk/dports/gnome/gnome-desktop/Portfile	2014-10-04 12:27:27 UTC (rev 126127)
+++ trunk/dports/gnome/gnome-desktop/Portfile	2014-10-04 14:04:15 UTC (rev 126128)
@@ -4,7 +4,7 @@
 PortSystem      1.0
 
 name            gnome-desktop
-version         3.12.2
+version         3.14.0
 set branch      [join [lrange [split ${version} .] 0 1] .]
 maintainers     devans openmaintainer
 categories      gnome
@@ -24,8 +24,8 @@
 
 use_xz          yes
 
-checksums       rmd160  9f801d21dec8b84d467e5a13206f568efd824210 \
-                sha256  b7d691363ccc90182caff1980efa7d99e4569bea968d39654102a0c4e824a44d
+checksums       rmd160  178de1265e9afd081fb32f2696f6eb7bd139114f \
+                sha256  22ced99396c022b5a8f2d78cdf7ff6227939c4ed36bc5dd806d44735d7b98305
 
 depends_build   port:pkgconfig \
                 port:intltool \
@@ -35,6 +35,7 @@
 depends_lib     port:desktop-file-utils \
                 port:gsettings-desktop-schemas \
                 path:share/themes/HighContrast/index.theme:gnome-themes-standard \
+                port:adwaita-icon-theme \
                 port:gtk3 \
                 port:gobject-introspection \
                 port:iso-codes \
@@ -43,8 +44,7 @@
                 port:xkeyboard-config \
                 port:xorg-libxkbfile
 
-patchfiles      patch-gnome-desktop-Makefile.am.diff \
-                patch-libgnome-destktop-libgsystem.diff
+patchfiles      patch-libgnome-destktop-libgsystem.diff
 
 # update m4/intltool.m4 and autoreconf
 

Deleted: trunk/dports/gnome/gnome-desktop/files/patch-gnome-desktop-Makefile.am.diff
===================================================================
--- trunk/dports/gnome/gnome-desktop/files/patch-gnome-desktop-Makefile.am.diff	2014-10-04 12:27:27 UTC (rev 126127)
+++ trunk/dports/gnome/gnome-desktop/files/patch-gnome-desktop-Makefile.am.diff	2014-10-04 14:04:15 UTC (rev 126128)
@@ -1,12 +0,0 @@
---- libgnome-desktop/Makefile.am.orig	2014-01-15 13:04:02.000000000 -0800
-+++ libgnome-desktop/Makefile.am	2014-01-24 16:42:17.000000000 -0800
-@@ -78,8 +78,7 @@
- 	$(XLIB_LIBS)		\
- 	$(LIBM)			\
- 	$(GNOME_DESKTOP_LIBS)	\
--	libgsystem.la           \
--	-lrt
-+	libgsystem.la
- 
- libgnome_desktop_3_la_LDFLAGS = \
- 	-version-info $(LT_VERSION) \

Modified: trunk/dports/gnome/gnome-desktop/files/patch-libgnome-destktop-libgsystem.diff
===================================================================
--- trunk/dports/gnome/gnome-desktop/files/patch-libgnome-destktop-libgsystem.diff	2014-10-04 12:27:27 UTC (rev 126127)
+++ trunk/dports/gnome/gnome-desktop/files/patch-libgnome-destktop-libgsystem.diff	2014-10-04 14:04:15 UTC (rev 126128)
@@ -53,1636 +53,6 @@
    return TRUE;
  }
  
-diff -urN libgnome-desktop/libgsystem.orig/gsystem-file-utils.c.orig libgnome-desktop/libgsystem/gsystem-file-utils.c.orig
---- libgnome-desktop/libgsystem.orig/gsystem-file-utils.c.orig	1969-12-31 16:00:00.000000000 -0800
-+++ libgnome-desktop/libgsystem/gsystem-file-utils.c.orig	2014-01-15 13:06:25.000000000 -0800
-@@ -0,0 +1,1626 @@
-+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
-+ *
-+ * Copyright (C) 2012 William Jon McCann <mccann at redhat.com>
-+ * Copyright (C) 2012 Colin Walters <walters at verbum.org>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ */
-+
-+#include "config.h"
-+
-+#ifndef _GNU_SOURCE
-+#define _GNU_SOURCE
-+#endif
-+
-+#include <string.h>
-+
-+#define _GSYSTEM_NO_LOCAL_ALLOC
-+#include "libgsystem.h"
-+#include "gsystem-glib-compat.h"
-+#include <glib/gstdio.h>
-+#include <gio/gunixinputstream.h>
-+#include <gio/gfiledescriptorbased.h>
-+#include <gio/gunixoutputstream.h>
-+#include <glib-unix.h>
-+#include <limits.h>
-+#include <dirent.h>
-+#ifdef GSYSTEM_CONFIG_XATTRS
-+#include <attr/xattr.h>
-+#endif
-+
-+static int
-+close_nointr (int fd)
-+{
-+  int res;
-+  /* Note this is NOT actually a retry loop.
-+   * See: https://bugzilla.gnome.org/show_bug.cgi?id=682819
-+   */
-+  res = close (fd);
-+  /* Just ignore EINTR...on Linux, retrying is wrong. */
-+  if (res == EINTR)
-+    res = 0;
-+  return res;
-+}
-+
-+static void
-+close_nointr_noerror (int fd)
-+{
-+  (void) close_nointr (fd);
-+}
-+
-+static int
-+open_nointr (const char *path, int flags, mode_t mode)
-+{
-+  int res;
-+  do
-+    res = open (path, flags, mode);
-+  while (G_UNLIKELY (res == -1 && errno == EINTR));
-+  return res;
-+}
-+
-+static inline void
-+_set_error_from_errno (GError **error)
-+{
-+  int errsv = errno;
-+  g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                       g_strerror (errsv));
-+}
-+
-+/**
-+ * gs_file_openat_noatime:
-+ * @dfd: File descriptor for directory
-+ * @name: Pathname, relative to @dfd
-+ * @ret_fd: (out): Returned file descriptor
-+ * @cancellable: Cancellable
-+ * @error: Error
-+ *
-+ * Wrapper for openat() using %O_RDONLY with %O_NOATIME if available.
-+ */
-+gboolean
-+gs_file_openat_noatime (int            dfd,
-+                        const char    *name,
-+                        int           *ret_fd,
-+                        GCancellable  *cancellable,
-+                        GError       **error)
-+{
-+  int fd;
-+
-+#ifdef O_NOATIME
-+  do
-+    fd = openat (dfd, name, O_RDONLY | O_NOATIME, 0);
-+  while (G_UNLIKELY (fd == -1 && errno == EINTR));
-+  /* Only the owner or superuser may use O_NOATIME; so we may get
-+   * EPERM.  EINVAL may happen if the kernel is really old...
-+   */
-+  if (fd == -1 && (errno == EPERM || errno == EINVAL))
-+#endif
-+    do
-+      fd = openat (dfd, name, O_RDONLY, 0);
-+    while (G_UNLIKELY (fd == -1 && errno == EINTR));
-+  
-+  if (fd == -1)
-+    {
-+      _set_error_from_errno (error);
-+      return FALSE;
-+    }
-+  else
-+    {
-+      *ret_fd = fd;
-+      return TRUE;
-+    }
-+}
-+
-+/**
-+ * gs_file_read_noatime:
-+ * @file: a #GFile
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * Like g_file_read(), but try to avoid updating the file's
-+ * access time.  This should be used by background scanning
-+ * components such as search indexers, antivirus programs, etc.
-+ *
-+ * Returns: (transfer full): A new input stream, or %NULL on error
-+ */
-+GInputStream *
-+gs_file_read_noatime (GFile         *file,
-+                      GCancellable  *cancellable,
-+                      GError       **error)
-+{
-+  const char *path = NULL;
-+  int fd;
-+
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    return NULL;
-+
-+  path = gs_file_get_path_cached (file);
-+  if (path == NULL)
-+    {
-+      char *uri;
-+      uri = g_file_get_uri (file);
-+      g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT,
-+                   "%s has no associated path", uri);
-+      g_free (uri);
-+      return NULL;
-+    }
-+
-+  if (!gs_file_openat_noatime (AT_FDCWD, path, &fd, cancellable, error))
-+    return NULL;
-+
-+  return g_unix_input_stream_new (fd, TRUE);
-+}
-+
-+/**
-+ * gs_stream_fstat:
-+ * @stream: A stream containing a Unix file descriptor
-+ * @stbuf: Memory location to write stat buffer
-+ * @cancellable:
-+ * @error:
-+ *
-+ * Some streams created via libgsystem are #GUnixInputStream; these do
-+ * not support e.g. g_file_input_stream_query_info().  This function
-+ * allows dropping to the raw unix fstat() call for these types of
-+ * streams, while still conveniently wrapped with the normal GLib
-+ * handling of @cancellable and @error.
-+ */
-+gboolean
-+gs_stream_fstat (GFileDescriptorBased *stream,
-+                 struct stat          *stbuf,
-+                 GCancellable         *cancellable,
-+                 GError              **error)
-+{
-+  gboolean ret = FALSE;
-+  int fd;
-+
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    goto out;
-+
-+  fd = g_file_descriptor_based_get_fd (stream);
-+
-+  if (fstat (fd, stbuf) == -1)
-+    {
-+      _set_error_from_errno (error);
-+      goto out;
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  return ret;
-+}
-+
-+/**
-+ * gs_file_map_noatime: (skip)
-+ * @file: a #GFile
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * Like g_mapped_file_new(), but try to avoid updating the file's
-+ * access time.  This should be used by background scanning
-+ * components such as search indexers, antivirus programs, etc.
-+ *
-+ * Returns: (transfer full): A new mapped file, or %NULL on error
-+ */
-+GMappedFile *
-+gs_file_map_noatime (GFile         *file,
-+                     GCancellable  *cancellable,
-+                     GError       **error)
-+{
-+  const char *path;
-+  int fd;
-+  GMappedFile *ret;
-+
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    return NULL;
-+
-+  path = gs_file_get_path_cached (file);
-+  if (path == NULL)
-+    return NULL;
-+
-+  if (!gs_file_openat_noatime (AT_FDCWD, path, &fd, cancellable, error))
-+    return NULL;
-+  
-+  ret = g_mapped_file_new_from_fd (fd, FALSE, error);
-+  close_nointr_noerror (fd); /* Ignore errors - we always want to close */
-+
-+  return ret;
-+}
-+
-+#if GLIB_CHECK_VERSION(2,34,0)
-+/**
-+ * gs_file_map_readonly:
-+ * @file: a #GFile
-+ * @cancellable:
-+ * @error:
-+ *
-+ * Return a #GBytes which references a readonly view of the contents of
-+ * @file.  This function uses #GMappedFile internally.
-+ *
-+ * Returns: (transfer full): a newly referenced #GBytes
-+ */
-+GBytes *
-+gs_file_map_readonly (GFile         *file,
-+                      GCancellable  *cancellable,
-+                      GError       **error)
-+{
-+  GMappedFile *mfile;
-+  GBytes *ret;
-+
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    return NULL;
-+
-+  mfile = g_mapped_file_new (gs_file_get_path_cached (file), FALSE, error);
-+  if (!mfile)
-+    return NULL;
-+
-+  ret = g_mapped_file_get_bytes (mfile);
-+  g_mapped_file_unref (mfile);
-+  return ret;
-+}
-+#endif
-+
-+/**
-+ * gs_file_sync_data:
-+ * @file: a #GFile
-+ * @cancellable:
-+ * @error:
-+ *
-+ * Wraps the UNIX fsync() function (or fdatasync(), if available), which
-+ * ensures that the data in @file is on non-volatile storage.
-+ */
-+gboolean
-+gs_file_sync_data (GFile          *file,
-+                   GCancellable   *cancellable,
-+                   GError        **error)
-+{
-+  gboolean ret = FALSE;
-+  int res;
-+  int fd = -1; 
-+
-+  if (!gs_file_openat_noatime (AT_FDCWD, gs_file_get_path_cached (file), &fd,
-+                               cancellable, error))
-+    goto out;
-+
-+  do
-+    {
-+#ifdef __linux
-+      res = fdatasync (fd);
-+#else
-+      res = fsync (fd);
-+#endif
-+    }
-+  while (G_UNLIKELY (res != 0 && errno == EINTR));
-+  if (res != 0)
-+    {
-+      _set_error_from_errno (error);
-+      goto out;
-+    }
-+
-+  res = close_nointr (fd);
-+  if (res != 0)
-+    {
-+      _set_error_from_errno (error);
-+      goto out;
-+    }
-+  fd = -1;
-+  
-+  ret = TRUE;
-+ out:
-+  if (fd != -1)
-+    close_nointr_noerror (fd);
-+  return ret;
-+}
-+
-+/**
-+ * gs_file_create:
-+ * @file: Path to non-existent file
-+ * @mode: Unix access permissions
-+ * @out_stream: (out) (transfer full) (allow-none): Newly created output, or %NULL
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * Like g_file_create(), except this function allows specifying the
-+ * access mode.  This allows atomically creating private files.
-+ */
-+gboolean
-+gs_file_create (GFile          *file,
-+                int             mode,
-+                GOutputStream **out_stream,
-+                GCancellable   *cancellable,
-+                GError        **error)
-+{
-+  gboolean ret = FALSE;
-+  int fd;
-+  GOutputStream *ret_stream = NULL;
-+
-+  fd = open_nointr (gs_file_get_path_cached (file), O_WRONLY | O_CREAT | O_EXCL, mode);
-+  if (fd < 0)
-+    {
-+      _set_error_from_errno (error);
-+      goto out;
-+    }
-+
-+  if (fchmod (fd, mode) < 0)
-+    {
-+      close (fd);
-+      _set_error_from_errno (error);
-+      goto out;
-+    }
-+  
-+  ret_stream = g_unix_output_stream_new (fd, TRUE);
-+  
-+  ret = TRUE;
-+  gs_transfer_out_value (out_stream, &ret_stream);
-+ out:
-+  g_clear_object (&ret_stream);
-+  return ret;
-+}
-+
-+static const char *
-+get_default_tmp_prefix (void)
-+{
-+  static char *tmpprefix = NULL;
-+
-+  if (g_once_init_enter (&tmpprefix))
-+    {
-+      const char *prgname = g_get_prgname ();
-+      const char *p;
-+      char *prefix;
-+      char *iter;
-+
-+      if (prgname)
-+        {
-+          p = strrchr (prgname, '/');
-+          if (p)
-+            prgname = p + 1;
-+        }
-+      else
-+        prgname = "";
-+          
-+      prefix = g_strdup_printf ("tmp-%s%u-", prgname, getuid ());
-+      for (iter = prefix; *iter; iter++)
-+        {
-+          char c = *iter;
-+          if (c == ' ')
-+            *iter = '_';
-+        }
-+      
-+      g_once_init_leave (&tmpprefix, prefix);
-+    }
-+
-+  return tmpprefix;
-+}
-+
-+/**
-+ * gs_fileutil_gen_tmp_name:
-+ * @prefix: (allow-none): String prepended to the result
-+ * @suffix: (allow-none): String suffixed to the result
-+ *
-+ * Generate a name suitable for use as a temporary file.  This
-+ * function does no I/O; it is not guaranteed that a file with that
-+ * name does not exist.
-+ */
-+char *
-+gs_fileutil_gen_tmp_name (const char *prefix,
-+                          const char *suffix)
-+{
-+  static const char table[] = "ABCEDEFGHIJKLMNOPQRSTUVWXYZabcedefghijklmnopqrstuvwxyz0123456789";
-+  GString *str = g_string_new ("");
-+  guint i;
-+
-+  if (!prefix)
-+    prefix = get_default_tmp_prefix ();
-+  if (!suffix)
-+    suffix = "tmp";
-+
-+  g_string_append (str, prefix);
-+  for (i = 0; i < 8; i++)
-+    {
-+      int offset = g_random_int_range (0, sizeof (table) - 1);
-+      g_string_append_c (str, (guint8)table[offset]);
-+    }
-+  g_string_append_c (str, '.');
-+  g_string_append (str, suffix);
-+
-+  return g_string_free (str, FALSE);
-+}
-+
-+/**
-+ * gs_file_open_dir_fd:
-+ * @path: Directory name
-+ * @out_fd: (out): File descriptor for directory
-+ * @cancellable: Cancellable
-+ * @error: Error
-+ *
-+ * On success, sets @out_fd to a file descriptor for the directory
-+ * that can be used with UNIX functions such as openat().
-+ */
-+gboolean
-+gs_file_open_dir_fd (GFile         *path,
-+                     int           *out_fd,
-+                     GCancellable  *cancellable,
-+                     GError       **error)
-+{
-+  /* Linux specific probably */
-+  *out_fd = open (gs_file_get_path_cached (path), O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC);
-+  if (*out_fd == -1)
-+    {
-+      _set_error_from_errno (error);
-+      return FALSE;
-+    }
-+  return TRUE;
-+}
-+
-+/**
-+ * gs_file_open_in_tmpdir_at:
-+ * @tmpdir_fd: Directory to place temporary file
-+ * @mode: Default mode (will be affected by umask)
-+ * @out_name: (out) (transfer full): Newly created file name
-+ * @out_stream: (out) (transfer full) (allow-none): Newly created output stream
-+ * @cancellable:
-+ * @error:
-+ *
-+ * Like g_file_open_tmp(), except the file will be created in the
-+ * provided @tmpdir, and allows specification of the Unix @mode, which
-+ * means private files may be created.  Return values will be stored
-+ * in @out_name, and optionally @out_stream.
-+ */
-+gboolean
-+gs_file_open_in_tmpdir_at (int                tmpdir_fd,
-+                           int                mode,
-+                           char             **out_name,
-+                           GOutputStream    **out_stream,
-+                           GCancellable      *cancellable,
-+                           GError           **error)
-+{
-+  gboolean ret = FALSE;
-+  const int max_attempts = 128;
-+  int i;
-+  char *tmp_name = NULL;
-+  int fd;
-+
-+  /* 128 attempts seems reasonable... */
-+  for (i = 0; i < max_attempts; i++)
-+    {
-+      g_free (tmp_name);
-+      tmp_name = gs_fileutil_gen_tmp_name (NULL, NULL);
-+
-+      do
-+        fd = openat (tmpdir_fd, tmp_name, O_WRONLY | O_CREAT | O_EXCL, mode);
-+      while (fd == -1 && errno == EINTR);
-+      if (fd < 0 && errno != EEXIST)
-+        {
-+          _set_error_from_errno (error);
-+          goto out;
-+        }
-+      else if (fd != -1)
-+        break;
-+    }
-+  if (i == max_attempts)
-+    {
-+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
-+                   "Exhausted attempts to open temporary file");
-+      goto out;
-+    }
-+
-+  ret = TRUE;
-+  gs_transfer_out_value (out_name, &tmp_name);
-+  if (out_stream)
-+    *out_stream = g_unix_output_stream_new (fd, TRUE);
-+  else
-+    (void) close (fd);
-+ out:
-+  g_free (tmp_name);
-+  return ret;
-+}
-+
-+/**
-+ * gs_file_open_in_tmpdir:
-+ * @tmpdir: Directory to place temporary file
-+ * @mode: Default mode (will be affected by umask)
-+ * @out_file: (out) (transfer full): Newly created file path
-+ * @out_stream: (out) (transfer full) (allow-none): Newly created output stream
-+ * @cancellable:
-+ * @error:
-+ *
-+ * Like g_file_open_tmp(), except the file will be created in the
-+ * provided @tmpdir, and allows specification of the Unix @mode, which
-+ * means private files may be created.  Return values will be stored
-+ * in @out_file, and optionally @out_stream.
-+ */
-+gboolean
-+gs_file_open_in_tmpdir (GFile             *tmpdir,
-+                        int                mode,
-+                        GFile            **out_file,
-+                        GOutputStream    **out_stream,
-+                        GCancellable      *cancellable,
-+                        GError           **error)
-+{
-+  gboolean ret = FALSE;
-+  DIR *d = NULL;
-+  int dfd = -1;
-+  char *tmp_name = NULL;
-+  GOutputStream *ret_stream = NULL;
-+
-+  d = opendir (gs_file_get_path_cached (tmpdir));
-+  if (!d)
-+    {
-+      _set_error_from_errno (error);
-+      goto out;
-+    }
-+  dfd = dirfd (d);
-+
-+  if (!gs_file_open_in_tmpdir_at (dfd, mode, &tmp_name,
-+                                  out_stream ? &ret_stream : NULL,
-+                                  cancellable, error))
-+    goto out;
-+ 
-+  ret = TRUE;
-+  *out_file = g_file_get_child (tmpdir, tmp_name);
-+  gs_transfer_out_value (out_stream, &ret_stream);
-+ out:
-+  if (d) (void) closedir (d);
-+  g_clear_object (&ret_stream);
-+  g_free (tmp_name);
-+  return ret;
-+}
-+
-+static gboolean
-+linkcopy_internal_attempt (GFile          *src,
-+                          GFile          *dest,
-+                          GFile          *dest_parent,
-+                          GFileCopyFlags  flags,
-+                          gboolean        sync_data,
-+                          gboolean        enable_guestfs_fuse_workaround,
-+                          gboolean       *out_try_again,
-+                          GCancellable   *cancellable,
-+                          GError        **error)
-+{
-+  gboolean ret = FALSE;
-+  int res;
-+  char *tmp_name = NULL;
-+  GFile *tmp_dest = NULL;
-+
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    goto out;
-+
-+  tmp_name = gs_fileutil_gen_tmp_name (NULL, NULL);
-+  tmp_dest = g_file_get_child (dest_parent, tmp_name);
-+
-+  res = link (gs_file_get_path_cached (src), gs_file_get_path_cached (tmp_dest));
-+  if (res == -1)
-+    {
-+      if (errno == EEXIST)
-+        {
-+          /* Nothing, fall through */
-+          *out_try_again = TRUE;
-+          ret = TRUE;
-+          goto out;
-+        }
-+      else if (errno == EXDEV || errno == EMLINK || errno == EPERM
-+               || (enable_guestfs_fuse_workaround && errno == ENOENT))
-+        {
-+          if (!g_file_copy (src, tmp_dest, flags,
-+                            cancellable, NULL, NULL, error))
-+            goto out;
-+        }
-+      else
-+        {
-+          _set_error_from_errno (error);
-+          goto out;
-+        }
-+    }
-+      
-+  if (sync_data)
-+    {
-+      /* Now, we need to fsync */
-+      if (!gs_file_sync_data (tmp_dest, cancellable, error))
-+        goto out;
-+    }
-+
-+  if (!gs_file_rename (tmp_dest, dest, cancellable, error))
-+    goto out;
-+
-+  ret = TRUE;
-+  *out_try_again = FALSE;
-+ out:
-+  g_clear_pointer (&tmp_name, g_free);
-+  g_clear_object (&tmp_dest);
-+  return ret;
-+}
-+
-+static gboolean
-+linkcopy_internal (GFile          *src,
-+                   GFile          *dest,
-+                   GFileCopyFlags  flags,
-+                   gboolean        sync_data,
-+                   GCancellable   *cancellable,
-+                   GError        **error)
-+{
-+  gboolean ret = FALSE;
-+  gboolean dest_exists;
-+  int i;
-+  gboolean enable_guestfs_fuse_workaround;
-+  struct stat src_stat;
-+  struct stat dest_stat;
-+  GFile *dest_parent = NULL;
-+
-+  flags |= G_FILE_COPY_NOFOLLOW_SYMLINKS;
-+
-+  g_return_val_if_fail ((flags & (G_FILE_COPY_BACKUP | G_FILE_COPY_TARGET_DEFAULT_PERMS)) == 0, FALSE);
-+
-+  dest_parent = g_file_get_parent (dest);
-+
-+  if (lstat (gs_file_get_path_cached (src), &src_stat) == -1)
-+    {
-+      int errsv = errno;
-+      g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errno),
-+                           g_strerror (errsv));
-+      goto out;
-+    }
-+
-+  if (lstat (gs_file_get_path_cached (dest), &dest_stat) == -1)
-+    dest_exists = FALSE;
-+  else
-+    dest_exists = TRUE;
-+  
-+  if (((flags & G_FILE_COPY_OVERWRITE) == 0) && dest_exists)
-+    {
-+      g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_EXISTS,
-+                           "File exists");
-+      goto out;
-+    }
-+
-+  /* Work around the behavior of link() where it's a no-op if src and
-+   * dest are the same.
-+   */
-+  if (dest_exists &&
-+      src_stat.st_dev == dest_stat.st_dev &&
-+      src_stat.st_ino == dest_stat.st_ino)
-+    {
-+      ret = TRUE;
-+      goto out;
-+    }
-+
-+  enable_guestfs_fuse_workaround = getenv ("LIBGSYSTEM_ENABLE_GUESTFS_FUSE_WORKAROUND") != NULL;
-+
-+  /* 128 attempts seems reasonable... */
-+  for (i = 0; i < 128; i++)
-+    {
-+      gboolean tryagain = FALSE;
-+
-+      if (!linkcopy_internal_attempt (src, dest, dest_parent,
-+                                      flags, sync_data,
-+                                      enable_guestfs_fuse_workaround,
-+                                      &tryagain,
-+                                      cancellable, error))
-+        goto out;
-+
-+      if (!tryagain)
-+        break;
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  g_clear_object (&dest_parent);
-+  return ret;
-+
-+}
-+
-+/**
-+ * gs_file_linkcopy:
-+ * @src: Source file
-+ * @dest: Destination file
-+ * @flags: flags
-+ * @cancellable:
-+ * @error:
-+ *
-+ * First tries to use the UNIX link() call, but if the files are on
-+ * separate devices, fall back to copying via g_file_copy().
-+ *
-+ * The given @flags have different semantics than those documented
-+ * when hardlinking is used.  Specifically, both
-+ * #G_FILE_COPY_TARGET_DEFAULT_PERMS and #G_FILE_COPY_BACKUP are not
-+ * supported.  #G_FILE_COPY_NOFOLLOW_SYMLINKS treated as if it was
-+ * always given - if you want to follow symbolic links, you will need
-+ * to resolve them manually.
-+ *
-+ * Beware - do not use this function if @src may be modified, and it's
-+ * undesirable for the changes to also be reflected in @dest.  The
-+ * best use of this function is in the case where @src and @dest are
-+ * read-only, or where @src is a temporary file, and you want to put
-+ * it in the final place.
-+ */
-+gboolean
-+gs_file_linkcopy (GFile          *src,
-+                  GFile          *dest,
-+                  GFileCopyFlags  flags,
-+                  GCancellable   *cancellable,
-+                  GError        **error)
-+{
-+  return linkcopy_internal (src, dest, flags, FALSE, cancellable, error);
-+}
-+
-+/**
-+ * gs_file_linkcopy_sync_data:
-+ * @src: Source file
-+ * @dest: Destination file
-+ * @flags: flags
-+ * @cancellable:
-+ * @error:
-+ *
-+ * This function is similar to gs_file_linkcopy(), except it also uses
-+ * gs_file_sync_data() to ensure that @dest is in stable storage
-+ * before it is moved into place.
-+ */
-+gboolean
-+gs_file_linkcopy_sync_data (GFile          *src,
-+                            GFile          *dest,
-+                            GFileCopyFlags  flags,
-+                            GCancellable   *cancellable,
-+                            GError        **error)
-+{
-+  return linkcopy_internal (src, dest, flags, TRUE, cancellable, error);
-+}
-+
-+static char *
-+gs_file_get_target_path (GFile *file)
-+{
-+  GFileInfo *info;
-+  const char *target;
-+  char *path;
-+
-+  info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI, G_FILE_QUERY_INFO_NONE, NULL, NULL);
-+  if (info == NULL)
-+    return NULL;
-+  target = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
-+  path = g_filename_from_uri (target, NULL, NULL);
-+  g_object_unref (info);
-+
-+  return path;
-+}
-+
-+G_LOCK_DEFINE_STATIC (pathname_cache);
-+
-+/**
-+ * gs_file_get_path_cached:
-+ *
-+ * Like g_file_get_path(), but returns a constant copy so callers
-+ * don't need to free the result.
-+ */
-+const char *
-+gs_file_get_path_cached (GFile *file)
-+{
-+  const char *path;
-+  static GQuark _file_path_quark = 0;
-+
-+  if (G_UNLIKELY (_file_path_quark) == 0)
-+    _file_path_quark = g_quark_from_static_string ("gsystem-file-path");
-+
-+  G_LOCK (pathname_cache);
-+
-+  path = g_object_get_qdata ((GObject*)file, _file_path_quark);
-+  if (!path)
-+    {
-+      if (g_file_has_uri_scheme (file, "trash") ||
-+          g_file_has_uri_scheme (file, "recent"))
-+        path = gs_file_get_target_path (file);
-+      else
-+        path = g_file_get_path (file);
-+      if (path == NULL)
-+        {
-+          G_UNLOCK (pathname_cache);
-+          return NULL;
-+        }
-+      g_object_set_qdata_full ((GObject*)file, _file_path_quark, (char*)path, (GDestroyNotify)g_free);
-+    }
-+
-+  G_UNLOCK (pathname_cache);
-+
-+  return path;
-+}
-+
-+/**
-+ * gs_file_get_basename_cached:
-+ *
-+ * Like g_file_get_basename(), but returns a constant copy so callers
-+ * don't need to free the result.
-+ */
-+const char *
-+gs_file_get_basename_cached (GFile *file)
-+{
-+  const char *name;
-+  static GQuark _file_name_quark = 0;
-+
-+  if (G_UNLIKELY (_file_name_quark) == 0)
-+    _file_name_quark = g_quark_from_static_string ("gsystem-file-name");
-+
-+  G_LOCK (pathname_cache);
-+
-+  name = g_object_get_qdata ((GObject*)file, _file_name_quark);
-+  if (!name)
-+    {
-+      name = g_file_get_basename (file);
-+      g_object_set_qdata_full ((GObject*)file, _file_name_quark, (char*)name, (GDestroyNotify)g_free);
-+    }
-+
-+  G_UNLOCK (pathname_cache);
-+
-+  return name;
-+}
-+
-+/**
-+ * gs_file_enumerator_iterate:
-+ * @direnum: an open #GFileEnumerator
-+ * @out_info: (out) (transfer none) (allow-none): Output location for the next #GFileInfo
-+ * @out_child: (out) (transfer none) (allow-none): Output location for the next #GFile, or %NULL
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * This is a version of g_file_enumerator_next_file() that's easier to
-+ * use correctly from C programs.  With g_file_enumerator_next_file(),
-+ * the gboolean return value signifies "end of iteration or error", which
-+ * requires allocation of a temporary #GError.
-+ *
-+ * In contrast, with this function, a %FALSE return from
-+ * gs_file_enumerator_iterate() <emphasis>always</emphasis> means
-+ * "error".  End of iteration is signaled by @out_info being %NULL.
-+ *
-+ * Another crucial difference is that the references for @out_info and
-+ * @out_child are owned by @direnum (they are cached as hidden
-+ * properties).  You must not unref them in your own code.  This makes
-+ * memory management significantly easier for C code in combination
-+ * with loops.
-+ *
-+ * Finally, this function optionally allows retrieving a #GFile as
-+ * well.
-+ *
-+ * The code pattern for correctly using gs_file_enumerator_iterate() from C
-+ * is:
-+ *
-+ * |[
-+ * direnum = g_file_enumerate_children (file, ...);
-+ * while (TRUE)
-+ *   {
-+ *     GFileInfo *info;
-+ *     if (!gs_file_enumerator_iterate (direnum, &info, NULL, cancellable, error))
-+ *       goto out;
-+ *     if (!info)
-+ *       break;
-+ *     ... do stuff with "info"; do not unref it! ...
-+ *   }
-+ * 
-+ * out:
-+ *   g_object_unref (direnum); // Note: frees the last @info
-+ * ]|
-+ */
-+gboolean
-+gs_file_enumerator_iterate (GFileEnumerator  *direnum,
-+                            GFileInfo       **out_info,
-+                            GFile           **out_child,
-+                            GCancellable     *cancellable,
-+                            GError          **error)
-+{
-+  gboolean ret = FALSE;
-+  GError *temp_error = NULL;
-+
-+  static GQuark cached_info_quark;
-+  static GQuark cached_child_quark;
-+  static gsize quarks_initialized;
-+
-+  g_return_val_if_fail (direnum != NULL, FALSE);
-+  g_return_val_if_fail (out_info != NULL, FALSE);
-+
-+  if (g_once_init_enter (&quarks_initialized))
-+    {
-+      cached_info_quark = g_quark_from_static_string ("gsystem-cached-info");
-+      cached_child_quark = g_quark_from_static_string ("gsystem-cached-child");
-+      g_once_init_leave (&quarks_initialized, 1);
-+    }
-+
-+  
-+  *out_info = g_file_enumerator_next_file (direnum, cancellable, &temp_error);
-+  if (out_child)
-+    *out_child = NULL;
-+  if (temp_error != NULL)
-+    {
-+      g_propagate_error (error, temp_error);
-+      goto out;
-+    }
-+  else if (*out_info != NULL)
-+    {
-+      g_object_set_qdata_full ((GObject*)direnum, cached_info_quark, *out_info, (GDestroyNotify)g_object_unref);
-+      if (out_child != NULL)
-+        {
-+          const char *name = g_file_info_get_name (*out_info);
-+          *out_child = g_file_get_child (g_file_enumerator_get_container (direnum), name);
-+          g_object_set_qdata_full ((GObject*)direnum, cached_child_quark, *out_child, (GDestroyNotify)g_object_unref);
-+        }
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  return ret;
-+}
-+
-+/**
-+ * gs_file_rename:
-+ * @from: Current path
-+ * @to: New path
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * This function wraps the raw Unix function rename().
-+ *
-+ * Returns: %TRUE on success, %FALSE on error
-+ */
-+gboolean
-+gs_file_rename (GFile          *from,
-+                GFile          *to,
-+                GCancellable   *cancellable,
-+                GError        **error)
-+{
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    return FALSE;
-+
-+  if (rename (gs_file_get_path_cached (from),
-+              gs_file_get_path_cached (to)) < 0)
-+    {
-+      _set_error_from_errno (error);
-+      return FALSE;
-+    }
-+  return TRUE;
-+}
-+
-+/**
-+ * gs_file_unlink:
-+ * @path: Path to file
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * Like g_file_delete(), except this function does not follow Unix
-+ * symbolic links, and will delete a symbolic link even if it's
-+ * pointing to a nonexistent file.  In other words, this function
-+ * merely wraps the raw Unix function unlink().
-+ *
-+ * Returns: %TRUE on success, %FALSE on error
-+ */
-+gboolean
-+gs_file_unlink (GFile          *path,
-+                GCancellable   *cancellable,
-+                GError        **error)
-+{
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    return FALSE;
-+
-+  if (unlink (gs_file_get_path_cached (path)) < 0)
-+    {
-+      _set_error_from_errno (error);
-+      return FALSE;
-+    }
-+  return TRUE;
-+}
-+
-+static gboolean
-+chown_internal (GFile          *path,
-+                gboolean        dereference_links,
-+                guint32         owner,
-+                guint32         group,
-+                GCancellable   *cancellable,
-+                GError        **error)
-+{
-+  gboolean ret = FALSE;
-+  int res;
-+
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    return FALSE;
-+
-+  do
-+    if (dereference_links)
-+      res = chown (gs_file_get_path_cached (path), owner, group);
-+    else
-+      res = lchown (gs_file_get_path_cached (path), owner, group);
-+  while (G_UNLIKELY (res != 0 && errno == EINTR));
-+
-+  if (res < 0)
-+    {
-+      _set_error_from_errno (error);
-+      goto out;
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  return ret;
-+}
-+
-+/**
-+ * gs_file_chown:
-+ * @path: Path to file
-+ * @owner: UNIX owner
-+ * @group: UNIX group
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * Merely wraps UNIX chown().
-+ *
-+ * Returns: %TRUE on success, %FALSE on error
-+ */
-+gboolean
-+gs_file_chown (GFile          *path,
-+               guint32         owner,
-+               guint32         group,
-+               GCancellable   *cancellable,
-+               GError        **error)
-+{
-+  return chown_internal (path, TRUE, owner, group, cancellable, error);
-+}
-+
-+/**
-+ * gs_file_lchown:
-+ * @path: Path to file
-+ * @owner: UNIX owner
-+ * @group: UNIX group
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * Merely wraps UNIX lchown().
-+ *
-+ * Returns: %TRUE on success, %FALSE on error
-+ */
-+gboolean
-+gs_file_lchown (GFile          *path,
-+                guint32         owner,
-+                guint32         group,
-+                GCancellable   *cancellable,
-+                GError        **error)
-+{
-+  return chown_internal (path, FALSE, owner, group, cancellable, error);
-+}
-+
-+/**
-+ * gs_file_chmod:
-+ * @path: Path to file
-+ * @mode: UNIX mode
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * Merely wraps UNIX chmod().
-+ *
-+ * Returns: %TRUE on success, %FALSE on error
-+ */
-+gboolean
-+gs_file_chmod (GFile          *path,
-+               guint           mode,
-+               GCancellable   *cancellable,
-+               GError        **error)
-+{
-+  gboolean ret = FALSE;
-+  int res;
-+
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    return FALSE;
-+
-+  do
-+    res = chmod (gs_file_get_path_cached (path), mode);
-+  while (G_UNLIKELY (res != 0 && errno == EINTR));
-+
-+  if (res < 0)
-+    {
-+      _set_error_from_errno (error);
-+      goto out;
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  return ret;
-+}
-+
-+/**
-+ * gs_file_ensure_directory:
-+ * @dir: Path to create as directory
-+ * @with_parents: Also create parent directories
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * Like g_file_make_directory(), except does not throw an error if the
-+ * directory already exists.
-+ */
-+gboolean
-+gs_file_ensure_directory (GFile         *dir,
-+                          gboolean       with_parents, 
-+                          GCancellable  *cancellable,
-+                          GError       **error)
-+{
-+  gboolean ret = FALSE;
-+  GError *temp_error = NULL;
-+  GFile *parent = NULL;
-+
-+  if (!g_file_make_directory (dir, cancellable, &temp_error))
-+    {
-+      if (with_parents &&
-+          g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
-+        {
-+          g_clear_error (&temp_error);
-+
-+          parent = g_file_get_parent (dir);
-+          if (parent)
-+            {
-+              if (!gs_file_ensure_directory (parent, TRUE, cancellable, error))
-+                goto out;
-+            }
-+          if (!gs_file_ensure_directory (dir, FALSE, cancellable, error))
-+            goto out;
-+        }
-+      else if (!g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_EXISTS))
-+        {
-+          g_propagate_error (error, temp_error);
-+          goto out;
-+        }
-+      else
-+        g_clear_error (&temp_error);
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  g_clear_object (&parent);
-+  return ret;
-+}
-+
-+/**
-+ * gs_file_ensure_directory_mode:
-+ * @dir: Path to create as directory
-+ * @mode: Create directory with these permissions
-+ * @cancellable: a #GCancellable
-+ * @error: a #GError
-+ *
-+ * Wraps UNIX mkdir() function with support for @cancellable, and
-+ * uses @error instead of errno.
-+ */
-+gboolean
-+gs_file_ensure_directory_mode (GFile         *dir,
-+                               guint          mode,
-+                               GCancellable  *cancellable,
-+                               GError       **error)
-+{
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    return FALSE;
-+
-+  if (mkdir (gs_file_get_path_cached (dir), mode) == -1 && errno != EEXIST)
-+    {
-+      _set_error_from_errno (error);
-+      return FALSE;
-+    }
-+  return TRUE;
-+}
-+
-+/**
-+ * gs_file_load_contents_utf8:
-+ * @file: Path to file whose contents must be UTF-8
-+ * @cancellable:
-+ * @error:
-+ *
-+ * Like g_file_load_contents(), except validates the contents are
-+ * UTF-8.
-+ */
-+gchar *
-+gs_file_load_contents_utf8 (GFile         *file,
-+                            GCancellable  *cancellable,
-+                            GError       **error)
-+{
-+  gboolean ret = FALSE;
-+  gsize len;
-+  char *ret_contents = NULL;
-+
-+  if (!g_file_load_contents (file, cancellable, &ret_contents, &len,
-+                             NULL, error))
-+    goto out;
-+  if (!g_utf8_validate (ret_contents, len, NULL))
-+    {
-+      g_set_error (error,
-+                   G_IO_ERROR,
-+                   G_IO_ERROR_INVALID_DATA,
-+                   "Invalid UTF-8");
-+      goto out;
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  if (!ret)
-+    {
-+      g_free (ret_contents);
-+      return NULL;
-+    }
-+  return ret_contents;
-+}
-+
-+static int
-+path_common_directory (char *one,
-+                       char *two)
-+{
-+  int dir_index = 0;
-+  int i = 0;
-+
-+  while (*one && *two)
-+    {
-+      if (*one != *two)
-+        break;
-+      if (*one == '/')
-+        dir_index = i + 1;
-+
-+      one++;
-+      two++;
-+      i++;
-+    }
-+
-+  return dir_index;
-+}
-+
-+/**
-+ * gs_file_get_relpath:
-+ * @one: The first #GFile
-+ * @two: The second #GFile
-+ *
-+ * Like gs_file_get_relative_path(), but does not mandate that
-+ * the two files have any parent in common. This function will
-+ * instead insert "../" where appropriate.
-+ *
-+ * Returns: (transfer full): The relative path between the two.
-+ */
-+gchar *
-+gs_file_get_relpath (GFile *one,
-+                     GFile *two)
-+{
-+  gchar *simple_path;
-+  gchar *one_path, *one_suffix;
-+  gchar *two_path, *two_suffix;
-+  GString *path;
-+  int i;
-+
-+  simple_path = g_file_get_relative_path (one, two);
-+  if (simple_path)
-+    return simple_path;
-+
-+  one_path = g_file_get_path (one);
-+  two_path = g_file_get_path (two);
-+
-+  i = path_common_directory (one_path, two_path);
-+  one_suffix = one_path + i;
-+  two_suffix = two_path + i;
-+
-+  path = g_string_new ("");
-+
-+  /* For every leftover path segment one has, append "../" so
-+   * that we reach the same directory. */
-+  while (*one_suffix)
-+    {
-+      g_string_append (path, "../");
-+      one_suffix = strchr (one_suffix, '/');
-+      if (one_suffix == NULL)
-+        break;
-+      one_suffix++;
-+    }
-+
-+  /* And now append the leftover stuff on two's side. */
-+  g_string_append (path, two_suffix);
-+
-+  g_free (one_path);
-+  g_free (two_path);
-+
-+  return g_string_free (path, FALSE);
-+}
-+
-+/**
-+ * gs_file_realpath:
-+ * @file: A #GFile
-+ *
-+ * Return a #GFile that contains the same path with symlinks
-+ * followed. That is, it's a #GFile whose path is the result
-+ * of calling realpath() on @file.
-+ *
-+ * Returns: (allow-none) (transfer full): A new #GFile or %NULL if @file is invalid
-+ */
-+GFile *
-+gs_file_realpath (GFile *file)
-+{
-+  gchar *path;
-+  gchar path_real[PATH_MAX];
-+
-+  path = g_file_get_path (file);
-+
-+  if (realpath ((const char *) path, path_real) == NULL)
-+    {
-+      g_free (path);
-+      return NULL;
-+    }
-+
-+  g_free (path);
-+  return g_file_new_for_path (path_real);
-+}
-+
-+#ifdef GSYSTEM_CONFIG_XATTRS
-+static char *
-+canonicalize_xattrs (char    *xattr_string,
-+                     size_t   len)
-+{
-+  char *p;
-+  GSList *xattrs = NULL;
-+  GSList *iter;
-+  GString *result;
-+
-+  result = g_string_new (0);
-+
-+  p = xattr_string;
-+  while (p < xattr_string+len)
-+    {
-+      xattrs = g_slist_prepend (xattrs, p);
-+      p += strlen (p) + 1;
-+    }
-+
-+  xattrs = g_slist_sort (xattrs, (GCompareFunc) strcmp);
-+  for (iter = xattrs; iter; iter = iter->next) {
-+    g_string_append (result, iter->data);
-+    g_string_append_c (result, '\0');
-+  }
-+
-+  g_slist_free (xattrs);
-+  return g_string_free (result, FALSE);
-+}
-+
-+static GVariant *
-+variant_new_ay_bytes (GBytes *bytes)
-+{
-+  gsize size;
-+  gconstpointer data;
-+  data = g_bytes_get_data (bytes, &size);
-+  g_bytes_ref (bytes);
-+  return g_variant_new_from_data (G_VARIANT_TYPE ("ay"), data, size,
-+                                  TRUE, (GDestroyNotify)g_bytes_unref, bytes);
-+}
-+
-+static gboolean
-+read_xattr_name_array (const char *path,
-+                       const char *xattrs,
-+                       size_t      len,
-+                       GVariantBuilder *builder,
-+                       GError  **error)
-+{
-+  gboolean ret = FALSE;
-+  const char *p;
-+
-+  p = xattrs;
-+  while (p < xattrs+len)
-+    {
-+      ssize_t bytes_read;
-+      char *buf;
-+      GBytes *bytes = NULL;
-+
-+      bytes_read = lgetxattr (path, p, NULL, 0);
-+      if (bytes_read < 0)
-+        {
-+          _set_error_from_errno (error);
-+          g_prefix_error (error, "lgetxattr (%s, %s) failed: ", path, p);
-+          goto out;
-+        }
-+      if (bytes_read == 0)
-+        continue;
-+
-+      buf = g_malloc (bytes_read);
-+      bytes = g_bytes_new_take (buf, bytes_read);
-+      if (lgetxattr (path, p, buf, bytes_read) < 0)
-+        {
-+          g_bytes_unref (bytes);
-+          _set_error_from_errno (error);
-+          g_prefix_error (error, "lgetxattr (%s, %s) failed: ", path, p);
-+          goto out;
-+        }
-+      
-+      g_variant_builder_add (builder, "(@ay at ay)",
-+                             g_variant_new_bytestring (p),
-+                             variant_new_ay_bytes (bytes));
-+
-+      p = p + strlen (p) + 1;
-+      g_bytes_unref (bytes);
-+    }
-+  
-+  ret = TRUE;
-+ out:
-+  return ret;
-+}
-+
-+#endif
-+
-+/**
-+ * gs_file_get_all_xattrs:
-+ * @f: a #GFile
-+ * @out_xattrs: (out): A new #GVariant containing the extended attributes
-+ * @cancellable: Cancellable
-+ * @error: Error
-+ *
-+ * Read all extended attributes of @f in a canonical sorted order, and
-+ * set @out_xattrs with the result.
-+ *
-+ * If the filesystem does not support extended attributes, @out_xattrs
-+ * will have 0 elements, and this function will return successfully.
-+ */
-+gboolean
-+gs_file_get_all_xattrs (GFile         *f,
-+                        GVariant     **out_xattrs,
-+                        GCancellable  *cancellable,
-+                        GError       **error)
-+{
-+  gboolean ret = FALSE;
-+  const char *path;
-+  ssize_t bytes_read;
-+  GVariant *ret_xattrs = NULL;
-+  char *xattr_names = NULL;
-+  char *xattr_names_canonical = NULL;
-+  GVariantBuilder builder;
-+  gboolean builder_initialized = FALSE;
-+
-+  path = gs_file_get_path_cached (f);
-+
-+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ayay)"));
-+  builder_initialized = TRUE;
-+
-+#ifdef GSYSTEM_CONFIG_XATTRS
-+  bytes_read = llistxattr (path, NULL, 0);
-+
-+  if (bytes_read < 0)
-+    {
-+      if (errno != ENOTSUP)
-+        {
-+          _set_error_from_errno (error);
-+          g_prefix_error (error, "llistxattr (%s) failed: ", path);
-+          goto out;
-+        }
-+    }
-+  else if (bytes_read > 0)
-+    {
-+      xattr_names = g_malloc (bytes_read);
-+      if (llistxattr (path, xattr_names, bytes_read) < 0)
-+        {
-+          _set_error_from_errno (error);
-+          g_prefix_error (error, "llistxattr (%s) failed: ", path);
-+          goto out;
-+        }
-+      xattr_names_canonical = canonicalize_xattrs (xattr_names, bytes_read);
-+      
-+      if (!read_xattr_name_array (path, xattr_names_canonical, bytes_read, &builder, error))
-+        goto out;
-+    }
-+
-+#endif
-+
-+  ret_xattrs = g_variant_builder_end (&builder);
-+  g_variant_ref_sink (ret_xattrs);
-+  
-+  ret = TRUE;
-+  gs_transfer_out_value (out_xattrs, &ret_xattrs);
-+ out:
-+  g_clear_pointer (&ret_xattrs, g_variant_unref);
-+  g_clear_pointer (&xattr_names, g_free);
-+  g_clear_pointer (&xattr_names_canonical, g_free);
-+  if (!builder_initialized)
-+    g_variant_builder_clear (&builder);
-+  return ret;
-+}
-+
-+/**
-+ * gs_fd_set_all_xattrs:
-+ * @fd: File descriptor
-+ * @xattrs: Extended attributes
-+ * @cancellable: Cancellable
-+ * @error: Error
-+ *
-+ * For each attribute in @xattrs, set its value on the file or
-+ * directory referred to by @fd.  This function does not remove any
-+ * attributes not in @xattrs.
-+ */
-+gboolean
-+gs_fd_set_all_xattrs (int            fd,
-+                      GVariant      *xattrs,
-+                      GCancellable  *cancellable,
-+                      GError       **error)
-+{
-+#ifdef GSYSTEM_CONFIG_XATTRS
-+  gboolean ret = FALSE;
-+  int i, n;
-+
-+  n = g_variant_n_children (xattrs);
-+  for (i = 0; i < n; i++)
-+    {
-+      const guint8* name;
-+      const guint8* value_data;
-+      GVariant *value = NULL;
-+      gsize value_len;
-+      int res;
-+
-+      g_variant_get_child (xattrs, i, "(^&ay at ay)",
-+                           &name, &value);
-+      value_data = g_variant_get_fixed_array (value, &value_len, 1);
-+      
-+      do
-+        res = fsetxattr (fd, (char*)name, (char*)value_data, value_len, 0);
-+      while (G_UNLIKELY (res == -1 && errno == EINTR));
-+      g_variant_unref (value);
-+      if (G_UNLIKELY (res == -1))
-+        {
-+          _set_error_from_errno (error);
-+          goto out;
-+        }
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  return ret;
-+#else
-+  return TRUE;
-+#endif
-+}
-+
-+/**
-+ * gs_file_set_all_xattrs:
-+ * @file: File descriptor
-+ * @xattrs: Extended attributes
-+ * @cancellable: Cancellable
-+ * @error: Error
-+ *
-+ * For each attribute in @xattrs, set its value on the file or
-+ * directory referred to by @file.  This function does not remove any
-+ * attributes not in @xattrs.
-+ */
-+gboolean
-+gs_file_set_all_xattrs (GFile         *file,
-+                        GVariant      *xattrs,
-+                        GCancellable  *cancellable,
-+                        GError       **error)
-+{
-+#ifdef GSYSTEM_CONFIG_XATTRS
-+  gboolean ret = FALSE;
-+  const char *path;
-+  int i, n;
-+
-+  path = gs_file_get_path_cached (file);
-+
-+  n = g_variant_n_children (xattrs);
-+  for (i = 0; i < n; i++)
-+    {
-+      const guint8* name;
-+      GVariant *value;
-+      const guint8* value_data;
-+      gsize value_len;
-+      gboolean loop_err;
-+
-+      g_variant_get_child (xattrs, i, "(^&ay at ay)",
-+                           &name, &value);
-+      value_data = g_variant_get_fixed_array (value, &value_len, 1);
-+      
-+      loop_err = lsetxattr (path, (char*)name, (char*)value_data, value_len, 0) < 0;
-+      g_clear_pointer (&value, (GDestroyNotify) g_variant_unref);
-+      if (loop_err)
-+        {
-+          _set_error_from_errno (error);
-+          g_prefix_error (error, "lsetxattr (%s, %s) failed: ", path, name);
-+          goto out;
-+        }
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  return ret;
-+#else
-+  return TRUE;
-+#endif
-+}
 diff -urN libgnome-desktop/libgsystem.orig/gsystem-osx-compat.c libgnome-desktop/libgsystem/gsystem-osx-compat.c
 --- libgnome-desktop/libgsystem.orig/gsystem-osx-compat.c	1969-12-31 16:00:00.000000000 -0800
 +++ libgnome-desktop/libgsystem/gsystem-osx-compat.c	2014-01-24 17:02:13.000000000 -0800
@@ -2441,469 +811,6 @@
      {
        d = fdopendir (dfd);
        if (!d)
-diff -urN libgnome-desktop/libgsystem.orig/gsystem-shutil.c.orig libgnome-desktop/libgsystem/gsystem-shutil.c.orig
---- libgnome-desktop/libgsystem.orig/gsystem-shutil.c.orig	1969-12-31 16:00:00.000000000 -0800
-+++ libgnome-desktop/libgsystem/gsystem-shutil.c.orig	2014-01-15 13:06:25.000000000 -0800
-@@ -0,0 +1,459 @@
-+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
-+ *
-+ * Copyright (C) 2012 William Jon McCann <mccann at redhat.com>
-+ * Copyright (C) 2012 Colin Walters <walters at verbum.org>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ */
-+
-+#include "config.h"
-+
-+#ifndef _GNU_SOURCE
-+#define _GNU_SOURCE
-+#endif
-+
-+#define _GSYSTEM_NO_LOCAL_ALLOC
-+#include "libgsystem.h"
-+#include <glib-unix.h>
-+#include <string.h>
-+#include <sys/stat.h>
-+#include <dirent.h>
-+#include <fcntl.h>
-+
-+/* Taken from systemd/src/shared/util.h */
-+union dirent_storage {
-+        struct dirent dent;
-+        guint8 storage[offsetof(struct dirent, d_name) +
-+                        ((NAME_MAX + 1 + sizeof(long)) & ~(sizeof(long) - 1))];
-+};
-+
-+static inline void
-+_set_error_from_errno (GError **error)
-+{
-+  int errsv = errno;
-+  g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                       g_strerror (errsv));
-+}
-+
-+static gboolean
-+copy_xattrs_from_file_to_fd (GFile         *src,
-+                             int            dest_fd,
-+                             GCancellable  *cancellable,
-+                             GError       **error)
-+{
-+  gboolean ret = FALSE;
-+  GVariant *src_xattrs = NULL;
-+
-+  if (!gs_file_get_all_xattrs (src, &src_xattrs, cancellable, error))
-+    goto out;
-+
-+  if (src_xattrs)
-+    {
-+      if (!gs_fd_set_all_xattrs (dest_fd, src_xattrs, cancellable, error))
-+        goto out;
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  g_clear_pointer (&src_xattrs, g_variant_unref);
-+  return ret;
-+}
-+
-+typedef enum {
-+  GS_CP_MODE_NONE,
-+  GS_CP_MODE_HARDLINK,
-+  GS_CP_MODE_COPY_ALL
-+} GsCpMode;
-+
-+static gboolean
-+cp_internal (GFile         *src,
-+             GFile         *dest,
-+             GsCpMode       mode,
-+             GCancellable  *cancellable,
-+             GError       **error)
-+{
-+  gboolean ret = FALSE;
-+  GFileEnumerator *enumerator = NULL;
-+  GFileInfo *src_info = NULL;
-+  GFile *dest_child = NULL;
-+  int dest_dfd = -1;
-+  int r;
-+
-+  enumerator = g_file_enumerate_children (src, "standard::type,standard::name,unix::uid,unix::gid,unix::mode",
-+                                          G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
-+                                          cancellable, error);
-+  if (!enumerator)
-+    goto out;
-+
-+  src_info = g_file_query_info (src, "standard::name,unix::mode,unix::uid,unix::gid," \
-+                                "time::modified,time::modified-usec,time::access,time::access-usec",
-+                                G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
-+                                cancellable, error);
-+  if (!src_info)
-+    goto out;
-+
-+  do
-+    r = mkdir (gs_file_get_path_cached (dest), 0755);
-+  while (G_UNLIKELY (r == -1 && errno == EINTR));
-+  if (r == -1)
-+    {
-+      _set_error_from_errno (error);
-+      goto out;
-+    }
-+
-+  if (mode != GS_CP_MODE_NONE)
-+    {
-+      if (!gs_file_open_dir_fd (dest, &dest_dfd,
-+                                cancellable, error))
-+        goto out;
-+
-+      do
-+        r = fchown (dest_dfd,
-+                    g_file_info_get_attribute_uint32 (src_info, "unix::uid"),
-+                    g_file_info_get_attribute_uint32 (src_info, "unix::gid"));
-+      while (G_UNLIKELY (r == -1 && errno == EINTR));
-+      if (r == -1)
-+        {
-+          _set_error_from_errno (error);
-+          goto out;
-+        }
-+
-+      do
-+        r = fchmod (dest_dfd, g_file_info_get_attribute_uint32 (src_info, "unix::mode"));
-+      while (G_UNLIKELY (r == -1 && errno == EINTR));
-+
-+      if (!copy_xattrs_from_file_to_fd (src, dest_dfd, cancellable, error))
-+        goto out;
-+
-+      if (dest_dfd != -1)
-+        {
-+          (void) close (dest_dfd);
-+          dest_dfd = -1;
-+        }
-+    }
-+
-+  while (TRUE)
-+    {
-+      GFileInfo *file_info = NULL;
-+      GFile *src_child = NULL;
-+
-+      if (!gs_file_enumerator_iterate (enumerator, &file_info, &src_child,
-+                                       cancellable, error))
-+        goto out;
-+      if (!file_info)
-+        break;
-+
-+      if (dest_child) g_object_unref (dest_child);
-+      dest_child = g_file_get_child (dest, g_file_info_get_name (file_info));
-+
-+      if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY)
-+        {
-+          if (!cp_internal (src_child, dest_child, mode,
-+                            cancellable, error))
-+            goto out;
-+        }
-+      else
-+        {
-+          gboolean did_link = FALSE;
-+          (void) unlink (gs_file_get_path_cached (dest_child));
-+          if (mode == GS_CP_MODE_HARDLINK)
-+            {
-+              if (link (gs_file_get_path_cached (src_child), gs_file_get_path_cached (dest_child)) == -1)
-+                {
-+                  if (!(errno == EMLINK || errno == EXDEV))
-+                    {
-+                      int errsv = errno;
-+                      g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                                           g_strerror (errsv));
-+                      goto out;
-+                    }
-+                  /* We failed to hardlink; fall back to copying all; this will
-+                   * affect subsequent directory copies too.
-+                   */
-+                  mode = GS_CP_MODE_COPY_ALL;
-+                }
-+              else
-+                did_link = TRUE;
-+            }
-+          if (!did_link)
-+            {
-+              GFileCopyFlags copyflags = G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS;
-+              if (mode == GS_CP_MODE_COPY_ALL)
-+                copyflags |= G_FILE_COPY_ALL_METADATA;
-+              if (!g_file_copy (src_child, dest_child, copyflags,
-+                                cancellable, NULL, NULL, error))
-+                goto out;
-+            }
-+        }
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  if (dest_dfd != -1)
-+    (void) close (dest_dfd);
-+  g_clear_object (&src_info);
-+  g_clear_object (&enumerator);
-+  g_clear_object (&dest_child);
-+  return ret;
-+}
-+
-+/**
-+ * gs_shutil_cp_al_or_fallback:
-+ * @src: Source path
-+ * @dest: Destination path
-+ * @cancellable:
-+ * @error:
-+ *
-+ * Recursively copy path @src (which must be a directory) to the
-+ * target @dest.  If possible, hardlinks are used; if a hardlink is
-+ * not possible, a regular copy is created.  Any existing files are
-+ * overwritten.
-+ *
-+ * Returns: %TRUE on success
-+ */
-+gboolean
-+gs_shutil_cp_al_or_fallback (GFile         *src,
-+                             GFile         *dest,
-+                             GCancellable  *cancellable,
-+                             GError       **error)
-+{
-+  return cp_internal (src, dest, GS_CP_MODE_HARDLINK,
-+                      cancellable, error);
-+}
-+
-+/**
-+ * gs_shutil_cp_a:
-+ * @src: Source path
-+ * @dest: Destination path
-+ * @cancellable:
-+ * @error:
-+ *
-+ * Recursively copy path @src (which must be a directory) to the
-+ * target @dest.  Any existing files are overwritten.
-+ *
-+ * Returns: %TRUE on success
-+ */
-+gboolean
-+gs_shutil_cp_a (GFile         *src,
-+                GFile         *dest,
-+                GCancellable  *cancellable,
-+                GError       **error)
-+{
-+  return cp_internal (src, dest, GS_CP_MODE_COPY_ALL,
-+                      cancellable, error);
-+}
-+
-+static unsigned char
-+struct_stat_to_dt (struct stat *stbuf)
-+{
-+  if (S_ISDIR (stbuf->st_mode))
-+    return DT_DIR;
-+  if (S_ISREG (stbuf->st_mode))
-+    return DT_REG;
-+  if (S_ISCHR (stbuf->st_mode))
-+    return DT_CHR;
-+  if (S_ISBLK (stbuf->st_mode))
-+    return DT_BLK;
-+  if (S_ISFIFO (stbuf->st_mode))
-+    return DT_FIFO;
-+  if (S_ISLNK (stbuf->st_mode))
-+    return DT_LNK;
-+  if (S_ISSOCK (stbuf->st_mode))
-+    return DT_SOCK;
-+  return DT_UNKNOWN;
-+}
-+
-+static gboolean
-+gs_shutil_rm_rf_children (DIR                *dir,
-+                          GCancellable       *cancellable,
-+                          GError            **error)
-+{
-+  gboolean ret = FALSE;
-+  int dfd;
-+  DIR *child_dir = NULL;
-+  struct dirent *dent;
-+  union dirent_storage buf;
-+
-+  if (g_cancellable_set_error_if_cancelled (cancellable, error))
-+    goto out;
-+
-+  dfd = dirfd (dir);
-+
-+  while (readdir_r (dir, &buf.dent, &dent) == 0)
-+    {
-+      if (dent == NULL)
-+        break;
-+      if (dent->d_type == DT_UNKNOWN)
-+        {
-+          struct stat stbuf;
-+          if (fstatat (dfd, dent->d_name, &stbuf, AT_SYMLINK_NOFOLLOW) == -1)
-+            {
-+              int errsv = errno;
-+              if (errsv == ENOENT)
-+                continue;
-+              else
-+                {
-+                  g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                                       g_strerror (errsv));
-+                  goto out;
-+                }
-+            }
-+          dent->d_type = struct_stat_to_dt (&stbuf);
-+          /* Assume unknown types are just treated like regular files */
-+          if (dent->d_type == DT_UNKNOWN)
-+            dent->d_type = DT_REG;
-+        }
-+
-+      if (strcmp (dent->d_name, ".") == 0 || strcmp (dent->d_name, "..") == 0)
-+        continue;
-+          
-+      if (dent->d_type == DT_DIR)
-+        {
-+          int child_dfd = openat (dfd, dent->d_name, O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC | O_NOFOLLOW);
-+
-+          if (child_dfd == -1)
-+            {
-+              if (errno == ENOENT)
-+                continue;
-+              else
-+                {
-+                  int errsv = errno;
-+                  g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                                       g_strerror (errsv));
-+                  goto out;
-+                }
-+            }
-+
-+          child_dir = fdopendir (child_dfd);
-+          if (!child_dir)
-+            {
-+              int errsv = errno;
-+              g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                                   g_strerror (errsv));
-+              goto out;
-+            }
-+
-+          if (!gs_shutil_rm_rf_children (child_dir, cancellable, error))
-+            goto out;
-+
-+          if (unlinkat (dfd, dent->d_name, AT_REMOVEDIR) == -1)
-+            {
-+              int errsv = errno;
-+              g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                                   g_strerror (errsv));
-+              goto out;
-+            }
-+
-+          (void) closedir (child_dir);
-+          child_dir = NULL;
-+        }
-+      else
-+        {
-+          if (unlinkat (dfd, dent->d_name, 0) == -1)
-+            {
-+              int errsv = errno;
-+              if (errno != ENOENT)
-+                {
-+                  g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                                       g_strerror (errsv));
-+                  goto out;
-+                }
-+            }
-+        }
-+    }
-+  /* Ignore error result from readdir_r, that's what others
-+   * seem to do =(
-+   */
-+
-+  ret = TRUE;
-+ out:
-+  if (child_dir) (void) closedir (child_dir);
-+  return ret;
-+}
-+
-+/**
-+ * gs_shutil_rm_rf:
-+ * @path: A file or directory
-+ * @cancellable:
-+ * @error:
-+ *
-+ * Recursively delete the filename referenced by @path; it may be a
-+ * file or directory.  No error is thrown if @path does not exist.
-+ */
-+gboolean
-+gs_shutil_rm_rf (GFile        *path,
-+                 GCancellable *cancellable,
-+                 GError      **error)
-+{
-+  gboolean ret = FALSE;
-+  int dfd = -1;
-+  DIR *d = NULL;
-+
-+  /* With O_NOFOLLOW first */
-+  dfd = openat (AT_FDCWD, gs_file_get_path_cached (path),
-+                O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC | O_NOFOLLOW);
-+
-+  if (dfd == -1)
-+    {
-+      int errsv = errno;
-+      if (errsv == ENOENT)
-+        {
-+          ;
-+        }
-+      else if (errsv == ENOTDIR || errsv == ELOOP)
-+        {
-+          if (!gs_file_unlink (path, cancellable, error))
-+            goto out;
-+        }
-+      else
-+        {
-+          g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                               g_strerror (errsv));
-+          goto out;
-+        }
-+    }
-+  else
-+    {
-+      d = fdopendir (dfd);
-+      if (!d)
-+        {
-+          int errsv = errno;
-+          g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                               g_strerror (errsv));
-+          goto out;
-+        }
-+
-+      if (!gs_shutil_rm_rf_children (d, cancellable, error))
-+        goto out;
-+
-+      if (rmdir (gs_file_get_path_cached (path)) == -1)
-+        {
-+          int errsv = errno;
-+          if (errsv != ENOENT)
-+            {
-+              g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (errsv),
-+                                   g_strerror (errsv));
-+              goto out;
-+            }
-+        }
-+    }
-+
-+  ret = TRUE;
-+ out:
-+  if (d) (void) closedir (d);
-+  return ret;
-+}
-+
 diff -urN libgnome-desktop/libgsystem.orig/gsystem-subprocess.c libgnome-desktop/libgsystem/gsystem-subprocess.c
 --- libgnome-desktop/libgsystem.orig/gsystem-subprocess.c	2014-01-15 13:06:25.000000000 -0800
 +++ libgnome-desktop/libgsystem/gsystem-subprocess.c	2014-01-24 17:02:13.000000000 -0800
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/macports-changes/attachments/20141004/c39b2480/attachment-0001.html>


More information about the macports-changes mailing list