1 https://bugzilla.gnome.org/show_bug.cgi?id=527339
3 diff -urN gvfs-1.14.0.new/client/gdaemonfile.c gvfs-1.14.0/client/gdaemonfile.c
4 --- gvfs-1.14.0.new/client/gdaemonfile.c 2012-09-30 22:04:15.383736541 +0200
5 +++ gvfs-1.14.0/client/gdaemonfile.c 2012-09-30 23:02:25.536442767 +0200
11 +g_daemon_file_set_attributes_from_info (GFile *file,
13 + GFileQueryInfoFlags flags,
14 + GCancellable *cancellable,
17 + GVfsDBusMount *proxy;
23 + proxy = create_proxy_for_file (file, NULL, &path, NULL, cancellable, error);
28 + res = gvfs_dbus_mount_call_set_attributes_from_info_sync (proxy,
31 + _g_dbus_append_file_info (info),
38 + if (g_error_matches (my_error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
39 + _g_dbus_send_cancelled_sync (g_dbus_proxy_get_connection (G_DBUS_PROXY (proxy)));
41 + if (g_error_matches (my_error, G_VFS_ERROR, G_VFS_ERROR_RETRY))
43 + g_clear_error (&my_error);
44 + g_object_unref (proxy);
47 + _g_propagate_error_stripped (error, my_error);
51 + g_object_unref (proxy);
59 iface->query_settable_attributes = g_daemon_file_query_settable_attributes;
60 iface->query_writable_namespaces = g_daemon_file_query_writable_namespaces;
61 iface->set_attribute = g_daemon_file_set_attribute;
62 + iface->set_attributes_from_info = g_daemon_file_set_attributes_from_info;
63 iface->make_symbolic_link = g_daemon_file_make_symbolic_link;
64 iface->monitor_dir = g_daemon_file_monitor_dir;
65 iface->monitor_file = g_daemon_file_monitor_file;
66 diff -urN gvfs-1.14.0.new/common/org.gtk.vfs.xml gvfs-1.14.0/common/org.gtk.vfs.xml
67 --- gvfs-1.14.0.new/common/org.gtk.vfs.xml 2012-09-30 22:04:15.377066577 +0200
68 +++ gvfs-1.14.0/common/org.gtk.vfs.xml 2012-09-30 22:56:26.665247761 +0200
70 <arg type='u' name='flags' direction='in'/>
71 <arg type='(suv)' name='attribute' direction='in'/>
73 + <method name="SetAttributesFromInfo">
74 + <arg type='ay' name='path_data' direction='in'/>
75 + <arg type='u' name='flags' direction='in'/>
76 + <arg type='a(suv)' name='info' direction='in'/>
78 <method name="QuerySettableAttributes">
79 <arg type='ay' name='path_data' direction='in'/>
80 <arg type='a(suu)' name='list' direction='out'/>
81 diff -urN gvfs-1.14.0.new/daemon/gvfsbackend.c gvfs-1.14.0/daemon/gvfsbackend.c
82 --- gvfs-1.14.0.new/daemon/gvfsbackend.c 2012-09-30 22:04:15.393741487 +0200
83 +++ gvfs-1.14.0/daemon/gvfsbackend.c 2012-09-30 23:40:33.814046064 +0200
85 #include <gvfsjobpush.h>
86 #include <gvfsjobpull.h>
87 #include <gvfsjobsetattribute.h>
88 +#include <gvfsjobsetattributesfrominfo.h>
89 #include <gvfsjobqueryattributes.h>
93 g_signal_connect (skeleton, "handle-query-settable-attributes", G_CALLBACK (g_vfs_job_query_settable_attributes_new_handle), data);
94 g_signal_connect (skeleton, "handle-query-writable-namespaces", G_CALLBACK (g_vfs_job_query_writable_namespaces_new_handle), data);
95 g_signal_connect (skeleton, "handle-set-attribute", G_CALLBACK (g_vfs_job_set_attribute_new_handle), data);
96 + g_signal_connect (skeleton, "handle-set-attributes-from-info", G_CALLBACK (g_vfs_job_set_attributes_from_info_new_handle), data);
97 g_signal_connect (skeleton, "handle-poll-mountable", G_CALLBACK (g_vfs_job_poll_mountable_new_handle), data);
98 g_signal_connect (skeleton, "handle-start-mountable", G_CALLBACK (g_vfs_job_start_mountable_new_handle), data);
99 g_signal_connect (skeleton, "handle-stop-mountable", G_CALLBACK (g_vfs_job_stop_mountable_new_handle), data);
100 diff -urN gvfs-1.14.0.new/daemon/gvfsbackend.h gvfs-1.14.0/daemon/gvfsbackend.h
101 --- gvfs-1.14.0.new/daemon/gvfsbackend.h 2012-09-30 22:04:15.387071523 +0200
102 +++ gvfs-1.14.0/daemon/gvfsbackend.h 2012-09-30 23:08:49.801027687 +0200
104 typedef struct _GVfsJobPush GVfsJobPush;
105 typedef struct _GVfsJobPull GVfsJobPull;
106 typedef struct _GVfsJobSetAttribute GVfsJobSetAttribute;
107 +typedef struct _GVfsJobSetAttributesFromInfo GVfsJobSetAttributesFromInfo;
108 typedef struct _GVfsJobQueryAttributes GVfsJobQueryAttributes;
109 typedef struct _GVfsJobCreateMonitor GVfsJobCreateMonitor;
112 GFileAttributeType type,
114 GFileQueryInfoFlags flags);
115 + void (*set_attributes_from_info) (GVfsBackend *backend,
116 + GVfsJobSetAttributesFromInfo *job,
117 + const char *filename,
119 + GFileQueryInfoFlags flags);
120 + gboolean (*try_set_attributes_from_info) (GVfsBackend *backend,
121 + GVfsJobSetAttributesFromInfo *job,
122 + const char *filename,
124 + GFileQueryInfoFlags flags);
126 void (*create_dir_monitor)(GVfsBackend *backend,
127 GVfsJobCreateMonitor *job,
128 const char *filename,
129 diff -urN gvfs-1.14.0.new/daemon/gvfsbackendsftp.c gvfs-1.14.0/daemon/gvfsbackendsftp.c
130 --- gvfs-1.14.0.new/daemon/gvfsbackendsftp.c 2012-09-30 22:04:15.390406505 +0200
131 +++ gvfs-1.14.0/daemon/gvfsbackendsftp.c 2012-09-30 23:48:52.948008785 +0200
132 @@ -4575,9 +4575,38 @@
133 g_file_attribute_info_list_add (list,
134 G_FILE_ATTRIBUTE_UNIX_MODE,
135 G_FILE_ATTRIBUTE_TYPE_UINT32,
136 - G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE |
137 G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED);
138 + /* G_FILE_INFO_COPY_WHEN_MOVED to ensure that this is copied when
139 + G_FILE_COPY_ALL_METADATA flag is set, but is not copied by default */
140 + g_file_attribute_info_list_add (list,
141 + G_FILE_ATTRIBUTE_TIME_ACCESS,
142 + G_FILE_ATTRIBUTE_TYPE_UINT32,
143 + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED);
144 + g_file_attribute_info_list_add (list,
145 + G_FILE_ATTRIBUTE_TIME_CHANGED,
146 + G_FILE_ATTRIBUTE_TYPE_UINT32,
147 + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED);
148 + /* do not make uid/gid settable: it will cause massive problems
149 + when G_FILE_COPY_ALL_METADATA is set. */
151 + g_vfs_job_query_attributes_set_list (job, list);
152 + g_vfs_job_succeeded (G_VFS_JOB (job));
153 + g_file_attribute_info_list_unref (list);
159 +try_query_writable_namespaces (GVfsBackend *backend,
160 + GVfsJobQueryAttributes *job,
161 + const char *filename)
163 + GFileAttributeInfoList *list;
165 + list = g_file_attribute_info_list_new ();
167 + /* generally, we don't have any writable namespaces */
169 g_vfs_job_query_attributes_set_list (job, list);
170 g_vfs_job_succeeded (G_VFS_JOB (job));
171 g_file_attribute_info_list_unref (list);
172 @@ -4612,6 +4641,8 @@
173 GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend);
174 GDataOutputStream *command;
176 + /* atime and mtime must be set in a single sftp command. Therefore, to set them,
177 + you must use try_set_attributes_from_info () */
178 if (strcmp (attribute, G_FILE_ATTRIBUTE_UNIX_MODE) != 0)
180 g_vfs_job_failed (G_VFS_JOB (job),
181 @@ -4640,6 +4671,103 @@
185 +set_attributes_from_info_reply (GVfsBackendSftp *backend,
187 + GDataInputStream *reply,
190 + gpointer user_data)
192 + if (reply_type == SSH_FXP_STATUS)
193 + result_from_status (job, reply, -1, -1);
195 + g_vfs_job_failed (job, G_IO_ERROR, G_IO_ERROR_FAILED,
196 + _("Invalid reply received"));
200 +try_set_attributes_from_info (GVfsBackend *backend,
201 + GVfsJobSetAttributesFromInfo *job,
202 + const char *filename,
204 + GFileQueryInfoFlags flags)
206 + GVfsBackendSftp *op_backend = G_VFS_BACKEND_SFTP (backend);
207 + GDataOutputStream *command;
211 + guint32 sftp_attributes = 0, sftp_mode, sftp_atime, sftp_mtime;
212 + gboolean is_atime_set = FALSE, is_mtime_set = FALSE;
214 + attributes = g_file_info_list_attributes (info, NULL);
215 + for (i=0; attributes[i]; i++)
217 + if (!strcmp (attributes[i], G_FILE_ATTRIBUTE_UNIX_MODE) )
219 + sftp_attributes |= SSH_FILEXFER_ATTR_PERMISSIONS;
220 + sftp_mode = 0777 & g_file_info_get_attribute_uint32 (info, attributes[i]);
222 + else if (!strcmp (attributes[i], G_FILE_ATTRIBUTE_TIME_ACCESS) )
224 + sftp_attributes |= SSH_FILEXFER_ATTR_ACMODTIME;
225 + /* assume year < 2107 */
226 + sftp_atime = g_file_info_get_attribute_uint64 (info, attributes[i]);
227 + is_atime_set = TRUE;
229 + else if (!strcmp (attributes[i], G_FILE_ATTRIBUTE_TIME_CHANGED) )
231 + sftp_attributes |= SSH_FILEXFER_ATTR_ACMODTIME;
232 + /* assume year < 2107 */
233 + sftp_mtime = g_file_info_get_attribute_uint64 (info, attributes[i]);
234 + is_mtime_set = TRUE;
237 + g_vfs_job_failed (G_VFS_JOB (job),
238 + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
239 + _("Operation unsupported"));
241 + g_strfreev (attributes);
243 + /* must set atime and mtime in a single command */
244 + if ( (is_atime_set && !is_mtime_set) || (is_mtime_set && !is_atime_set))
246 + sftp_attributes &= ~SSH_FILEXFER_ATTR_ACMODTIME;
247 + g_vfs_job_failed (G_VFS_JOB (job),
248 + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
249 + _("Operation unsupported"));
252 + if (sftp_attributes)
254 + command = new_command_stream (op_backend,SSH_FXP_SETSTAT);
255 + put_string (command, filename);
256 + g_data_output_stream_put_uint32 (command, sftp_attributes, NULL, NULL);
258 + if (sftp_attributes & SSH_FILEXFER_ATTR_PERMISSIONS)
259 + g_data_output_stream_put_uint32 (command, sftp_mode, NULL, NULL);
260 + if (sftp_attributes & SSH_FILEXFER_ATTR_ACMODTIME)
262 + g_data_output_stream_put_uint32 (command, sftp_atime, NULL, NULL);
263 + g_data_output_stream_put_uint32 (command, sftp_mtime, NULL, NULL);
266 + queue_command_stream_and_free (op_backend, command, set_attributes_from_info_reply, G_VFS_JOB (job), NULL);
271 + /* no attributes to set - return success */
272 + g_vfs_job_succeeded (G_VFS_JOB (job));
274 + g_vfs_job_failed (G_VFS_JOB (job),
275 + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
276 + _("Operation unsupported"));
282 g_vfs_backend_sftp_class_init (GVfsBackendSftpClass *klass)
284 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
285 @@ -4672,5 +4800,7 @@
286 backend_class->try_delete = try_delete;
287 backend_class->try_set_display_name = try_set_display_name;
288 backend_class->try_query_settable_attributes = try_query_settable_attributes;
289 + backend_class->try_query_writable_namespaces = try_query_writable_namespaces;
290 backend_class->try_set_attribute = try_set_attribute;
291 + backend_class->try_set_attributes_from_info = try_set_attributes_from_info;
293 diff -urN gvfs-1.14.0.new/daemon/gvfsjobsetattributesfrominfo.c gvfs-1.14.0/daemon/gvfsjobsetattributesfrominfo.c
294 --- gvfs-1.14.0.new/daemon/gvfsjobsetattributesfrominfo.c 1970-01-01 01:00:00.000000000 +0100
295 +++ gvfs-1.14.0/daemon/gvfsjobsetattributesfrominfo.c 2012-09-30 23:32:41.529938013 +0200
297 +/* GVFS - GNOME virtual filesystem layer
299 + * Copyright (C) 2008 Alexandre Rostovtsev
301 + * This library is free software; you can redistribute it and/or
302 + * modify it under the terms of the GNU Lesser General Public
303 + * License as published by the Free Software Foundation; either
304 + * version 2 of the License, or (at your option) any later version.
306 + * This library is distributed in the hope that it will be useful,
307 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
308 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
309 + * Lesser General Public License for more details.
311 + * You should have received a copy of the GNU Lesser General
312 + * Public License along with this library; if not, write to the
313 + * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
314 + * Boston, MA 02111-1307, USA.
316 + * Author: Alexandre Rostovtsev <tetromino@gmail.com>
322 +#include <sys/types.h>
323 +#include <sys/socket.h>
327 +#include <glib/gi18n.h>
328 +#include <gio/gio.h>
329 +#include "gvfsjobmove.h"
330 +#include "gvfsdaemonprotocol.h"
331 +#include "gvfsjobsetattribute.h"
332 +#include "gvfsjobsetattributesfrominfo.h"
334 +G_DEFINE_TYPE (GVfsJobSetAttributesFromInfo, g_vfs_job_set_attributes_from_info, G_VFS_TYPE_JOB_DBUS)
336 +typedef struct _GVfsJobSetAttributesFromInfoPrivate GVfsJobSetAttributesFromInfoPrivate;
337 +struct _GVfsJobSetAttributesFromInfoPrivate {
338 + gboolean dispose_has_run;
341 +#define G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO_GET_PRIVATE(o) \
342 + (G_TYPE_INSTANCE_GET_PRIVATE ((o), G_VFS_TYPE_JOB_SET_ATTRIBUTES_FROM_INFO, GVfsJobSetAttributesFromInfoPrivate))
344 +static void run (GVfsJob *job);
345 +static gboolean try (GVfsJob *job);
346 +static void create_reply (GVfsJob *job,
347 + GVfsDBusMount *object,
348 + GDBusMethodInvocation *invocation);
351 +g_vfs_job_set_attributes_from_info_dispose (GObject *object)
353 + GVfsJobSetAttributesFromInfo *job;
354 + GVfsJobSetAttributesFromInfoPrivate *priv;
356 + job = G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO (object);
357 + priv = G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO_GET_PRIVATE (object);
359 + if (priv->dispose_has_run)
362 + priv->dispose_has_run = TRUE;
364 + g_object_unref (job->info);
366 + if (G_OBJECT_CLASS (g_vfs_job_set_attributes_from_info_parent_class)->dispose)
367 + (*G_OBJECT_CLASS (g_vfs_job_set_attributes_from_info_parent_class)->dispose) (object);
371 +g_vfs_job_set_attributes_from_info_finalize (GObject *object)
373 + GVfsJobSetAttributesFromInfo *job;
375 + job = G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO (object);
377 + g_free (job->filename);
379 + if (G_OBJECT_CLASS (g_vfs_job_set_attributes_from_info_parent_class)->finalize)
380 + (*G_OBJECT_CLASS (g_vfs_job_set_attributes_from_info_parent_class)->finalize) (object);
384 +g_vfs_job_set_attributes_from_info_class_init (GVfsJobSetAttributesFromInfoClass *klass)
386 + GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
387 + GVfsJobClass *job_class = G_VFS_JOB_CLASS (klass);
388 + GVfsJobDBusClass *job_dbus_class = G_VFS_JOB_DBUS_CLASS (klass);
390 + gobject_class->dispose = g_vfs_job_set_attributes_from_info_dispose;
391 + gobject_class->finalize = g_vfs_job_set_attributes_from_info_finalize;
392 + job_class->run = run;
393 + job_class->try = try;
394 + job_dbus_class->create_reply = create_reply;
396 + g_type_class_add_private (klass, sizeof (GVfsJobSetAttributesFromInfoPrivate));
400 +g_vfs_job_set_attributes_from_info_init (GVfsJobSetAttributesFromInfo *job)
402 + GVfsJobSetAttributesFromInfoPrivate *priv;
405 + priv = G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO_GET_PRIVATE (job);
406 + priv->dispose_has_run = FALSE;
410 +g_vfs_job_set_attributes_from_info_new_handle (GVfsDBusMount *object,
411 + GDBusMethodInvocation *invocation,
412 + const char *arg_path_data,
414 + GVariant *arg_info,
415 + GVfsBackend *backend)
417 + GVfsJobSetAttributesFromInfo *job;
418 + GFileInfo *info = NULL;
420 + if (g_vfs_backend_invocation_first_handler (object, invocation, backend))
423 + if ( !(info = _g_dbus_get_file_info (arg_info, NULL)) )
425 + g_dbus_method_invocation_return_error_literal (invocation,
427 + G_IO_ERROR_INVALID_ARGUMENT,
428 + _("Invalid dbus message"));
432 + job = g_object_new (G_VFS_TYPE_JOB_SET_ATTRIBUTES_FROM_INFO,
434 + "invocation", invocation,
437 + job->backend = backend;
438 + job->filename = g_strdup (arg_path_data);
440 + job->flags = arg_flags;
442 + g_vfs_job_source_new_job (G_VFS_JOB_SOURCE (backend), G_VFS_JOB (job));
443 + g_object_unref (job);
451 + GVfsJobSetAttributesFromInfo *op_job = G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO (job);
452 + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
454 + if (class->set_attributes_from_info == NULL)
456 + /* TODO : try to fallback using class->set_attribute */
457 + g_vfs_job_failed (job, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
458 + _("Operation not supported by backend"));
461 + class->set_attributes_from_info (op_job->backend, op_job, op_job->filename, op_job->info, op_job->flags);
467 + GVfsJobSetAttributesFromInfo *op_job = G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO (job);
468 + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
470 + if (class->try_set_attributes_from_info == NULL)
472 + /* TODO : try to fallback using class->try_set_attribute */
476 + return class->try_set_attributes_from_info (op_job->backend, op_job, op_job->filename, op_job->info, op_job->flags);
479 +/* Might be called on an i/o thread */
481 +create_reply (GVfsJob *job,
482 + GVfsDBusMount *object,
483 + GDBusMethodInvocation *invocation)
485 + gvfs_dbus_mount_complete_set_attributes_from_info (object, invocation);
487 diff -urN gvfs-1.14.0.new/daemon/gvfsjobsetattributesfrominfo.h gvfs-1.14.0/daemon/gvfsjobsetattributesfrominfo.h
488 --- gvfs-1.14.0.new/daemon/gvfsjobsetattributesfrominfo.h 1970-01-01 01:00:00.000000000 +0100
489 +++ gvfs-1.14.0/daemon/gvfsjobsetattributesfrominfo.h 2012-09-30 23:42:51.086635731 +0200
491 +/* GIO - GLib Input, Output and Streaming Library
493 + * Copyright (C) 2006-2007 Red Hat, Inc.
495 + * This library is free software; you can redistribute it and/or
496 + * modify it under the terms of the GNU Lesser General Public
497 + * License as published by the Free Software Foundation; either
498 + * version 2 of the License, or (at your option) any later version.
500 + * This library is distributed in the hope that it will be useful,
501 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
502 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
503 + * Lesser General Public License for more details.
505 + * You should have received a copy of the GNU Lesser General
506 + * Public License along with this library; if not, write to the
507 + * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
508 + * Boston, MA 02111-1307, USA.
510 + * Author: Alexandre Rostovtsev <tetromino@gmail.com>
513 +#ifndef __G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO_H__
514 +#define __G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO_H__
516 +#include <gio/gio.h>
517 +#include <gvfsjob.h>
518 +#include <gvfsjobdbus.h>
519 +#include <gvfsbackend.h>
523 +#define G_VFS_TYPE_JOB_SET_ATTRIBUTES_FROM_INFO \
524 + (g_vfs_job_set_attributes_from_info_get_type ())
525 +#define G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO(o) \
526 + (G_TYPE_CHECK_INSTANCE_CAST ((o), G_VFS_TYPE_JOB_SET_ATTRIBUTES_FROM_INFO, GVfsJobSetAttributesFromInfo))
527 +#define G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO_CLASS(k) \
528 + (G_TYPE_CHECK_CLASS_CAST((k), G_VFS_TYPE_JOB_SET_ATTRIBUTES_FROM_INFO, GVfsJobSetAttributesFromInfoClass))
529 +#define G_VFS_IS_JOB_SET_ATTRIBUTES_FROM_INFO(o) \
530 + (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_VFS_TYPE_JOB_SET_ATTRIBUTES_FROM_INFO))
531 +#define G_VFS_IS_JOB_SET_ATTRIBUTES_FROM_INFO_CLASS(k) \
532 + (G_TYPE_CHECK_CLASS_TYPE ((k), G_VFS_TYPE_JOB_SET_ATTRIBUTES_FROM_INFO))
533 +#define G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO_GET_CLASS(o) \
534 + (G_TYPE_INSTANCE_GET_CLASS ((o), G_VFS_TYPE_JOB_SET_ATTRIBUTES_FROM_INFO, GVfsJobSetAttributesFromInfoClass))
536 +typedef struct _GVfsJobSetAttributesFromInfoClass GVfsJobSetAttributesFromInfoClass;
538 +struct _GVfsJobSetAttributesFromInfo
540 + GVfsJobDBus parent_instance;
542 + GVfsBackend *backend;
546 + GFileQueryInfoFlags flags;
549 +struct _GVfsJobSetAttributesFromInfoClass
551 + GVfsJobDBusClass parent_class;
554 +GType g_vfs_job_set_attributes_from_info_get_type (void) G_GNUC_CONST;
556 +gboolean g_vfs_job_set_attributes_from_info_new_handle (GVfsDBusMount *object,
557 + GDBusMethodInvocation *invocation,
558 + const gchar *arg_path_data,
560 + GVariant *arg_info,
561 + GVfsBackend *backend);
565 +#endif /* __G_VFS_JOB_SET_ATTRIBUTES_FROM_INFO_H__ */
566 diff -urN gvfs-1.14.0.new/daemon/Makefile.am gvfs-1.14.0/daemon/Makefile.am
567 --- gvfs-1.14.0.new/daemon/Makefile.am 2012-09-30 22:04:15.400411451 +0200
568 +++ gvfs-1.14.0/daemon/Makefile.am 2012-09-30 23:39:57.067578418 +0200
570 gvfsjobmakedirectory.c gvfsjobmakedirectory.h \
571 gvfsjobmakesymlink.c gvfsjobmakesymlink.h \
572 gvfsjobsetattribute.c gvfsjobsetattribute.h \
573 + gvfsjobsetattributesfrominfo.c gvfsjobsetattributesfrominfo.h \
574 gvfsjobqueryattributes.c gvfsjobqueryattributes.h \
575 gvfsjobcreatemonitor.c gvfsjobcreatemonitor.h \
576 gvfskeyring.h gvfskeyring.c \