summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/gdaemonfileinputstream.c18
-rw-r--r--client/gdaemonfileoutputstream.c17
-rw-r--r--daemon/gvfschannel.c16
3 files changed, 42 insertions, 9 deletions
diff --git a/client/gdaemonfileinputstream.c b/client/gdaemonfileinputstream.c
index bfe02bde..f73c6816 100644
--- a/client/gdaemonfileinputstream.c
+++ b/client/gdaemonfileinputstream.c
@@ -394,6 +394,16 @@ error_is_cancel (GError *error)
}
static void
+unappend_request (GDaemonFileInputStream *stream)
+{
+ g_assert (stream->output_buffer->len >= G_VFS_DAEMON_SOCKET_PROTOCOL_REQUEST_SIZE);
+
+ stream->seq_nr--;
+ g_string_truncate (stream->output_buffer,
+ stream->output_buffer->len - G_VFS_DAEMON_SOCKET_PROTOCOL_REQUEST_SIZE);
+}
+
+static void
append_request (GDaemonFileInputStream *stream, guint32 command,
guint32 arg1, guint32 arg2, guint32 data_len,
guint32 *seq_nr)
@@ -623,6 +633,8 @@ iterate_read_state_machine (GDaemonFileInputStream *file, IOOperationData *io_op
case READ_STATE_WROTE_COMMAND:
if (io_op->io_cancelled)
{
+ if (!op->sent_cancel)
+ unappend_request (file);
op->ret_val = -1;
g_set_error_literal (&op->ret_error,
G_IO_ERROR,
@@ -894,6 +906,8 @@ iterate_close_state_machine (GDaemonFileInputStream *file, IOOperationData *io_o
case CLOSE_STATE_WROTE_REQUEST:
if (io_op->io_cancelled)
{
+ if (!op->sent_cancel)
+ unappend_request (file);
op->ret_val = FALSE;
g_set_error_literal (&op->ret_error,
G_IO_ERROR,
@@ -1142,6 +1156,8 @@ iterate_seek_state_machine (GDaemonFileInputStream *file, IOOperationData *io_op
case SEEK_STATE_WROTE_REQUEST:
if (io_op->io_cancelled)
{
+ if (!op->sent_cancel)
+ unappend_request (file);
op->ret_val = -1;
g_set_error_literal (&op->ret_error,
G_IO_ERROR,
@@ -1384,6 +1400,8 @@ iterate_query_state_machine (GDaemonFileInputStream *file,
case QUERY_STATE_WROTE_REQUEST:
if (io_op->io_cancelled)
{
+ if (!op->sent_cancel)
+ unappend_request (file);
op->info = NULL;
g_set_error_literal (&op->ret_error,
G_IO_ERROR,
diff --git a/client/gdaemonfileoutputstream.c b/client/gdaemonfileoutputstream.c
index 4516c975..70535b19 100644
--- a/client/gdaemonfileoutputstream.c
+++ b/client/gdaemonfileoutputstream.c
@@ -316,6 +316,15 @@ error_is_cancel (GError *error)
}
static void
+unappend_request (GDaemonFileOutputStream *stream)
+{
+ g_assert (stream->output_buffer->len >= G_VFS_DAEMON_SOCKET_PROTOCOL_REQUEST_SIZE);
+ stream->seq_nr--;
+ g_string_truncate (stream->output_buffer,
+ stream->output_buffer->len - G_VFS_DAEMON_SOCKET_PROTOCOL_REQUEST_SIZE);
+}
+
+static void
append_request (GDaemonFileOutputStream *stream, guint32 command,
guint32 arg1, guint32 arg2, guint32 data_len, guint32 *seq_nr)
{
@@ -499,6 +508,8 @@ iterate_write_state_machine (GDaemonFileOutputStream *file, IOOperationData *io_
case WRITE_STATE_WROTE_COMMAND:
if (io_op->io_cancelled)
{
+ if (!op->sent_cancel)
+ unappend_request (file);
op->ret_val = -1;
g_set_error_literal (&op->ret_error,
G_IO_ERROR,
@@ -674,6 +685,8 @@ iterate_close_state_machine (GDaemonFileOutputStream *file, IOOperationData *io_
case CLOSE_STATE_WROTE_REQUEST:
if (io_op->io_cancelled)
{
+ if (!op->sent_cancel)
+ unappend_request (file);
op->ret_val = FALSE;
g_set_error_literal (&op->ret_error,
G_IO_ERROR,
@@ -866,6 +879,8 @@ iterate_seek_state_machine (GDaemonFileOutputStream *file, IOOperationData *io_o
case SEEK_STATE_WROTE_REQUEST:
if (io_op->io_cancelled)
{
+ if (!op->sent_cancel)
+ unappend_request (file);
op->ret_val = -1;
g_set_error_literal (&op->ret_error,
G_IO_ERROR,
@@ -1045,6 +1060,8 @@ iterate_query_state_machine (GDaemonFileOutputStream *file,
case QUERY_STATE_WROTE_REQUEST:
if (io_op->io_cancelled)
{
+ if (!op->sent_cancel)
+ unappend_request (file);
op->info = NULL;
g_set_error_literal (&op->ret_error,
G_IO_ERROR,
diff --git a/daemon/gvfschannel.c b/daemon/gvfschannel.c
index ec87cb99..994b5ea1 100644
--- a/daemon/gvfschannel.c
+++ b/daemon/gvfschannel.c
@@ -321,21 +321,19 @@ start_queued_request (GVfsChannel *channel)
req->arg1, req->arg2,
req->data, req->data_len,
&error);
- if (job == NULL)
- {
- job = g_vfs_job_error_new (channel, error);
- g_error_free (error);
- }
-
if (job != NULL && req->cancelled)
{
/* Ignore the job, although we need to create it to rely
on handle_request side effects like seek generations, etc */
g_object_unref (job);
- error =
- g_error_new_literal (G_IO_ERROR, G_IO_ERROR_CANCELLED,
- _("Operation was cancelled"));
+ job = NULL;
+ error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_CANCELLED,
+ _("Operation was cancelled"));
+ }
+
+ if (job == NULL)
+ {
job = g_vfs_job_error_new (channel, error);
g_error_free (error);
}