static void do_close_write (GVfsBackend *backend, GVfsJobCloseWrite *job, GVfsBackendHandle handle) { GFileOutputStream *out; GError *error; char *etag; out = (GFileOutputStream *)handle; error = NULL; if (!g_output_stream_close (G_OUTPUT_STREAM (out), G_VFS_JOB (job)->cancellable, &error)) { g_vfs_job_failed_from_error (G_VFS_JOB (job), error); g_error_free (error); } else { etag = g_file_output_stream_get_etag (out); if (etag) { g_vfs_job_close_write_set_etag (job, etag); g_free (etag); } g_vfs_job_succeeded (G_VFS_JOB (job)); } g_object_unref (out); }
static gboolean save (GFile *file) { GOutputStream *out; GFileCreateFlags flags; char buffer[1025]; char *p; gssize res; gboolean close_res; GError *error; gboolean save_res; error = NULL; flags = priv ? G_FILE_CREATE_PRIVATE : G_FILE_CREATE_NONE; flags |= replace_dest ? G_FILE_CREATE_REPLACE_DESTINATION : 0; if (create) out = (GOutputStream *)g_file_create (file, flags, NULL, &error); else if (append) out = (GOutputStream *)g_file_append_to (file, flags, NULL, &error); else out = (GOutputStream *)g_file_replace (file, etag, backup, flags, NULL, &error); if (out == NULL) { g_printerr (_("Error opening file: %s\n"), error->message); g_error_free (error); return FALSE; } save_res = TRUE; while (1) { res = read (STDIN_FILENO, buffer, 1024); if (res > 0) { ssize_t written; p = buffer; while (res > 0) { error = NULL; written = g_output_stream_write (out, p, res, NULL, &error); if (written == -1) { save_res = FALSE; g_printerr ("Error writing to stream: %s", error->message); g_error_free (error); goto out; } res -= written; p += written; } } else if (res < 0) { save_res = FALSE; perror (_("Error reading stdin")); break; } else if (res == 0) break; } out: close_res = g_output_stream_close (out, NULL, &error); if (!close_res) { save_res = FALSE; g_printerr (_("Error closing: %s\n"), error->message); g_error_free (error); } if (close_res && print_etag) { char *etag; etag = g_file_output_stream_get_etag (G_FILE_OUTPUT_STREAM (out)); if (etag) g_print ("Etag: %s\n", etag); else /* Translators: The "etag" is a token allowing to verify whether a file has been modified */ g_print (_("Etag not available\n")); g_free (etag); } g_object_unref (out); return save_res; }
static VALUE rg_etag(VALUE self) { return CSTR2RVAL(g_file_output_stream_get_etag(_SELF(self))); }