void xa_open_rpm (XArchive *archive) { unsigned short int i; int response; GSList *list = NULL; FILE *stream; gboolean result; signal (SIGPIPE, SIG_IGN); stream = fopen ( archive->path , "r" ); if (stream == NULL) { gchar *msg = g_strdup_printf (_("Can't open RPM file %s:") , archive->path); response = xa_show_message_dialog (GTK_WINDOW (xa_main_window) , GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK, msg,g_strerror(errno)); g_free (msg); return; } archive->can_extract = archive->has_properties = TRUE; archive->can_add = archive->has_sfx = archive->has_test = FALSE; archive->dummy_size = 0; archive->nr_of_files = 0; archive->nc = 8; archive->format ="RPM"; char *names[]= {(_("Points to")),(_("Size")),(_("Permission")),(_("Date")),(_("Hard Link")),(_("Owner")),(_("Group")),NULL}; GType types[]= {GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_UINT64,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_POINTER}; archive->column_types = g_malloc0(sizeof(types)); for (i = 0; i < 10; i++) archive->column_types[i] = types[i]; xa_create_liststore (archive,names); /* Create a unique temp dir in /tmp */ result = xa_create_temp_directory (archive); if (!result) return; /* Now I run dd to have the bzip2 / gzip compressed cpio archive in /tmp */ gchar *command = g_strconcat ( "sh -c \"rpm2cpio ",archive->escaped_path," > ",archive->tmp, "/file.cpio\"",NULL); list = NULL; list = g_slist_append(list,command); result = xa_run_command (archive,list); if (result == FALSE) { gtk_widget_set_sensitive(Stop_button,FALSE); xa_set_button_state (1,1,1,1,archive->can_add,archive->can_extract,0,archive->has_test,archive->has_properties,archive->has_passwd,0); gtk_label_set_text(GTK_LABEL(total_label),""); return; } /* And finally cpio to receive the content */ command = g_strconcat ("sh -c \"cpio -tv < ",archive->tmp,"/file.cpio\"",NULL); archive->parse_output = xa_get_cpio_line_content; xa_spawn_async_process (archive,command); g_free(command); }
void xa_open_rpm (XArchive *archive) { int result, i; gchar *command; char *names[]= {(_("Points to")),(_("Size")),(_("Permission")),(_("Date")),(_("Hard Link")),(_("Owner")),(_("Group")),NULL}; GType types[]= {GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_UINT64,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_POINTER}; result = xa_rpm2cpio(archive); if (result < 0) return; archive->can_extract = archive->has_properties = TRUE; archive->can_add = archive->has_sfx = archive->has_test = FALSE; archive->dummy_size = 0; archive->nr_of_files = 0; archive->nc = 8; archive->format ="RPM"; archive->column_types = g_malloc0(sizeof(types)); for (i = 0; i < 10; i++) archive->column_types[i] = types[i]; xa_create_liststore(archive, names); if (result == 0) { gtk_widget_set_sensitive(Stop_button,FALSE); xa_set_button_state (1,1,1,1,archive->can_add,archive->can_extract,0,archive->has_test,archive->has_properties,archive->has_passwd,0); gtk_label_set_text(GTK_LABEL(total_label),""); return; } /* list the content */ command = g_strconcat ("sh -c \"cpio -tv < ",archive->tmp,"/xa-tmp.cpio\"",NULL); archive->parse_output = xa_get_cpio_line_content; xa_spawn_async_process (archive,command); g_free(command); }