static void software_button_clicked_cb (GtkButton *button, GtkAppChooserDialog *self) { GSubprocess *process; GError *error = NULL; gchar *option; if (self->priv->content_type) option = g_strconcat ("--search=", self->priv->content_type, NULL); else option = g_strdup ("--mode=overview"); process = g_subprocess_new (0, &error, "gnome-software", option, NULL); if (!process) { show_error_dialog (_("Failed to start GNOME Software"), error->message, GTK_WINDOW (self)); g_error_free (error); } else g_object_unref (process); g_free (option); }
gboolean test_make_filesystem(const gchar *dirname, const gchar *filename) { GSubprocess *sub; GError *error = NULL; gchar *path; gboolean res = FALSE; path = g_build_filename(dirname, filename, NULL); sub = g_subprocess_new( G_SUBPROCESS_FLAGS_STDOUT_SILENCE, &error, "/sbin/mkfs.ext4", "-F", path, NULL); if (!sub) { g_warning("Making filesystem failed: %s", error->message); g_clear_error(&error); return FALSE; } res = g_subprocess_wait_check(sub, NULL, &error); if (!res) { g_warning("mkfs failed: %s", error->message); g_clear_error(&error); } return TRUE; }
void *Thread_Start_Routine(void *arg) { struct Message *msg = (struct Message *)arg; #if !defined(NDEBUG) fprintf(stderr, "Origin : %s\n", msg->origin); fprintf(stderr, "Summary: %s\n", msg->summary); /* +1 to get rid of the prepended \r of the wall message. */ fprintf(stderr, "Body : \"%s\"\n", msg->body + 1); #endif GSubprocess *proc; gboolean success; GError *error; GBytes *buf; error = NULL; proc = g_subprocess_new(G_SUBPROCESS_FLAGS_STDIN_PIPE | G_SUBPROCESS_FLAGS_STDOUT_SILENCE | G_SUBPROCESS_FLAGS_STDERR_SILENCE, &error, (char *)msg->argv0, "--origin", msg->origin, "--summary", msg->summary, NULL); if (UNLIKELY(!proc)) { PTYWATCH_ERROR("g_subprocess_new() failed: %s\n", error->message); g_error_free(error); } buf = g_bytes_new(msg->body, strlen(msg->body)); error = NULL; success = g_subprocess_communicate(proc, buf, NULL, NULL, NULL, &error); if (UNLIKELY((!success) && error)) { PTYWATCH_ERROR("g_subprocess_communicate() failed: %s\n", error->message); g_error_free(error); } g_object_unref(G_OBJECT(proc)); g_bytes_unref(buf); free(msg->argv0); free(msg->origin); free(msg->summary); free(msg->body); free(msg); return NULL; }
char * ot_editor_prompt (OstreeRepo *repo, const char *input, GCancellable *cancellable, GError **error) { glnx_unref_object GSubprocess *proc = NULL; g_autoptr(GFile) file = NULL; g_autoptr(GFileIOStream) io = NULL; GOutputStream *output; const char *editor; char *ret = NULL; g_autofree char *args = NULL; editor = get_editor (); if (editor == NULL) { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Terminal is dumb, but EDITOR unset"); goto out; } file = g_file_new_tmp (NULL, &io, error); if (file == NULL) goto out; output = g_io_stream_get_output_stream (G_IO_STREAM (io)); if (!g_output_stream_write_all (output, input, strlen (input), NULL, cancellable, error) || !g_io_stream_close (G_IO_STREAM (io), cancellable, error)) goto out; { g_autofree char *quoted_file = g_shell_quote (gs_file_get_path_cached (file)); args = g_strconcat (editor, " ", quoted_file, NULL); } proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_INHERIT, error, "/bin/sh", "-c", args, NULL); if (!g_subprocess_wait_check (proc, cancellable, error)) { g_prefix_error (error, "There was a problem with the editor '%s'", editor); goto out; } ret = glnx_file_get_contents_utf8_at (AT_FDCWD, gs_file_get_path_cached (file), NULL, cancellable, error); out: if (file) (void )g_file_delete (file, NULL, NULL); return ret; }
static gboolean mksquashfs(const gchar *bundlename, const gchar *contentdir, GError **error) { GSubprocess *sproc = NULL; GError *ierror = NULL; gboolean res = FALSE; r_context_begin_step("mksquashfs", "Creating squashfs", 0); if (g_file_test (bundlename, G_FILE_TEST_EXISTS)) { g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_EXIST, "bundle %s already exists", bundlename); goto out; } sproc = g_subprocess_new(G_SUBPROCESS_FLAGS_STDOUT_SILENCE, &ierror, "mksquashfs", contentdir, bundlename, "-all-root", "-noappend", "-no-progress", "-no-xattrs", NULL); if (sproc == NULL) { g_propagate_prefixed_error( error, ierror, "Failed to start mksquashfs: "); goto out; } res = g_subprocess_wait_check(sproc, NULL, &ierror); if (!res) { g_propagate_prefixed_error( error, ierror, "Failed to run mksquashfs: "); goto out; } res = TRUE; out: r_context_end_step("mksquashfs", res); return res; }
static void end_element (GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error) { ParseState *state = user_data; GError *my_error = NULL; if (strcmp (element_name, "gresource") == 0) { g_free (state->prefix); state->prefix = NULL; } else if (strcmp (element_name, "file") == 0) { gchar *file; gchar *real_file = NULL; gchar *key; FileData *data = NULL; char *tmp_file = NULL; char *tmp_file2 = NULL; file = state->string->str; key = file; if (state->alias) key = state->alias; if (state->prefix) key = g_build_path ("/", "/", state->prefix, key, NULL); else key = g_build_path ("/", "/", key, NULL); if (g_hash_table_lookup (state->table, key) != NULL) { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("File %s appears multiple times in the resource"), key); return; } if (sourcedirs != NULL) { real_file = find_file (file); if (real_file == NULL && state->collect_data) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Failed to locate “%s” in any source directory"), file); return; } } else { gboolean exists; exists = g_file_test (file, G_FILE_TEST_EXISTS); if (!exists && state->collect_data) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Failed to locate “%s” in current directory"), file); return; } } if (real_file == NULL) real_file = g_strdup (file); data = g_new0 (FileData, 1); data->filename = g_strdup (real_file); if (!state->collect_data) goto done; if (state->preproc_options) { gchar **options; guint i; gboolean xml_stripblanks = FALSE; gboolean to_pixdata = FALSE; options = g_strsplit (state->preproc_options, ",", -1); for (i = 0; options[i]; i++) { if (!strcmp (options[i], "xml-stripblanks")) xml_stripblanks = TRUE; else if (!strcmp (options[i], "to-pixdata")) to_pixdata = TRUE; else { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Unknown processing option “%s”"), options[i]); g_strfreev (options); goto cleanup; } } g_strfreev (options); if (xml_stripblanks && xmllint != NULL) { int fd; GSubprocess *proc; tmp_file = g_strdup ("resource-XXXXXXXX"); if ((fd = g_mkstemp (tmp_file)) == -1) { int errsv = errno; g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv), _("Failed to create temp file: %s"), g_strerror (errsv)); g_free (tmp_file); tmp_file = NULL; goto cleanup; } close (fd); proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE, error, xmllint, "--nonet", "--noblanks", "--output", tmp_file, real_file, NULL); g_free (real_file); real_file = NULL; if (!proc) goto cleanup; if (!g_subprocess_wait_check (proc, NULL, error)) { g_object_unref (proc); goto cleanup; } g_object_unref (proc); real_file = g_strdup (tmp_file); } if (to_pixdata) { int fd; GSubprocess *proc; if (gdk_pixbuf_pixdata == NULL) { g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, "to-pixbuf preprocessing requested but GDK_PIXBUF_PIXDATA " "not set and gdk-pixbuf-pixdata not found in path"); goto cleanup; } tmp_file2 = g_strdup ("resource-XXXXXXXX"); if ((fd = g_mkstemp (tmp_file2)) == -1) { int errsv = errno; g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv), _("Failed to create temp file: %s"), g_strerror (errsv)); g_free (tmp_file2); tmp_file2 = NULL; goto cleanup; } close (fd); proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE, error, gdk_pixbuf_pixdata, real_file, tmp_file2, NULL); g_free (real_file); real_file = NULL; if (!g_subprocess_wait_check (proc, NULL, error)) { g_object_unref (proc); goto cleanup; } g_object_unref (proc); real_file = g_strdup (tmp_file2); } } if (!g_file_get_contents (real_file, &data->content, &data->size, &my_error)) { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Error reading file %s: %s"), real_file, my_error->message); g_clear_error (&my_error); goto cleanup; } /* Include zero termination in content_size for uncompressed files (but not in size) */ data->content_size = data->size + 1; if (state->compressed) { GOutputStream *out = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); GZlibCompressor *compressor = g_zlib_compressor_new (G_ZLIB_COMPRESSOR_FORMAT_ZLIB, 9); GOutputStream *out2 = g_converter_output_stream_new (out, G_CONVERTER (compressor)); if (!g_output_stream_write_all (out2, data->content, data->size, NULL, NULL, NULL) || !g_output_stream_close (out2, NULL, NULL)) { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Error compressing file %s"), real_file); goto cleanup; } g_free (data->content); data->content_size = g_memory_output_stream_get_size (G_MEMORY_OUTPUT_STREAM (out)); data->content = g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (out)); g_object_unref (compressor); g_object_unref (out); g_object_unref (out2); data->flags |= G_RESOURCE_FLAGS_COMPRESSED; } done: g_hash_table_insert (state->table, key, data); data = NULL; cleanup: /* Cleanup */ g_free (state->alias); state->alias = NULL; g_string_free (state->string, TRUE); state->string = NULL; g_free (state->preproc_options); state->preproc_options = NULL; g_free (real_file); if (tmp_file) { unlink (tmp_file); g_free (tmp_file); } if (tmp_file2) { unlink (tmp_file2); g_free (tmp_file2); } if (data != NULL) file_data_free (data); } }