static char * get_temp_name (FrCommandTar *c_tar, const char *filepath) { char *dirname = _g_path_remove_level (filepath); char *template; char *result = NULL; char *temp_name = NULL;
static void list_command_completed (gpointer data) { FrCommandUnarchiver *unar_comm = FR_COMMAND_UNARCHIVER (data); JsonParser *parser; GError *error = NULL; parser = json_parser_new (); if (json_parser_load_from_stream (parser, unar_comm->stream, NULL, &error)) { JsonObject *root; root = json_node_get_object (json_parser_get_root (parser)); if (json_object_get_int_member (root, "lsarFormatVersion") == LSAR_SUPPORTED_FORMAT) { JsonArray *content; int i; content = json_object_get_array_member (root, "lsarContents"); for (i = 0; i < json_array_get_length (content); i++) { JsonObject *entry; FileData *fdata; const char *filename; entry = json_array_get_object_element (content, i); fdata = file_data_new (); fdata->size = json_object_get_int_member (entry, "XADFileSize"); fdata->modified = mktime_from_string (json_object_get_string_member (entry, "XADLastModificationDate")); if (json_object_has_member (entry, "XADIsEncrypted")) fdata->encrypted = json_object_get_int_member (entry, "XADIsEncrypted") == 1; filename = json_object_get_string_member (entry, "XADFileName"); if (*filename == '/') { fdata->full_path = g_strdup (filename); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", filename, NULL); fdata->original_path = fdata->full_path + 1; } fdata->link = NULL; if (json_object_has_member (entry, "XADIsDirectory")) fdata->dir = json_object_get_int_member (entry, "XADIsDirectory") == 1; if (fdata->dir) fdata->name = _g_path_get_dir_name (fdata->full_path); else fdata->name = g_strdup (_g_path_get_basename (fdata->full_path)); fdata->path = _g_path_remove_level (fdata->full_path); fr_archive_add_file (FR_ARCHIVE (unar_comm), fdata); } } } g_object_unref (parser); }
static void list__process_line (char *line, gpointer data) { FileData *fdata; FrCommand *comm = FR_COMMAND (data); g_return_if_fail (line != NULL); if (strlen (line) == 0) return; if (! g_str_has_prefix (line, "Decompressed file size:")) return; fdata = file_data_new (); fdata->size = g_ascii_strtoull (_g_str_get_last_field (line, 4), NULL, 10); struct stat st; if (stat (comm->filename, &st) == 0) fdata->modified = st.st_mtim.tv_sec; else time(&(fdata->modified)); fdata->encrypted = FALSE; char *new_fname = g_strdup (_g_path_get_basename (comm->filename)); if (g_str_has_suffix (new_fname, ".lrz")) new_fname[strlen (new_fname) - 4] = '\0'; if (*new_fname == '/') { fdata->full_path = g_strdup (new_fname); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", new_fname, NULL); fdata->original_path = fdata->full_path + 1; } fdata->path = _g_path_remove_level (fdata->full_path); fdata->name = new_fname; fdata->dir = FALSE; fdata->link = NULL; if (fdata->name == 0) file_data_free (fdata); else fr_archive_add_file (FR_ARCHIVE (comm), fdata); }
static void process_line (char *line, gpointer data) { FileData *fdata; FrCommandAce *ace_comm = FR_COMMAND_ACE (data); FrCommand *comm = FR_COMMAND (data); char **fields; const char *field_name; g_return_if_fail (line != NULL); if (ace_comm->command_type == FR_ACE_COMMAND_UNKNOWN) { if (g_str_has_prefix (line, "UNACE")) { if (strstr (line, "public version") != NULL) ace_comm->command_type = FR_ACE_COMMAND_PUBLIC; else ace_comm->command_type = FR_ACE_COMMAND_NONFREE; } return; } if (! ace_comm->list_started) { if (ace_comm->command_type == FR_ACE_COMMAND_PUBLIC) { if (g_str_has_prefix (line, "Date")) ace_comm->list_started = TRUE; } else if (ace_comm->command_type == FR_ACE_COMMAND_NONFREE) { if (g_str_has_prefix (line, " Date")) ace_comm->list_started = TRUE; } return; } fdata = file_data_new (); if (ace_comm->command_type == FR_ACE_COMMAND_PUBLIC) fields = g_strsplit (line, "|", 6); else if (ace_comm->command_type == FR_ACE_COMMAND_NONFREE) fields = _g_str_split_line (line, 5); else fields = NULL; if ((fields == NULL) || (fields[0] == NULL) || (g_strv_length (fields) < 5)) return; fdata->size = g_ascii_strtoull (fields[3], NULL, 10); fdata->modified = mktime_from_string (fields[0], fields[1]); if (ace_comm->command_type == FR_ACE_COMMAND_PUBLIC) { field_name = fields[5]; field_name = field_name + 1; } else if (ace_comm->command_type == FR_ACE_COMMAND_NONFREE) field_name = _g_str_get_last_field (line, 6); else g_assert_not_reached (); if (field_name[0] != '/') { fdata->full_path = g_strconcat ("/", field_name, NULL); fdata->original_path = fdata->full_path + 1; } else { fdata->full_path = g_strdup (field_name); fdata->original_path = fdata->full_path; } g_strfreev (fields); fdata->name = g_strdup (_g_path_get_basename (fdata->full_path)); fdata->path = _g_path_remove_level (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_archive_add_file (FR_ARCHIVE (comm), fdata); }
static void fr_command_tar_recompress (FrCommand *comm) { FrCommandTar *c_tar = FR_COMMAND_TAR (comm); FrArchive *archive = FR_ARCHIVE (comm); char *new_name = NULL; if (can_create_a_compressed_archive (comm)) return; if (_g_mime_type_matches (archive->mime_type, "application/x-compressed-tar")) { fr_process_begin_command (comm->process, "gzip"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); fr_process_set_continue_func (comm->process, gzip_continue_func, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".gz", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-bzip-compressed-tar")) { fr_process_begin_command (comm->process, "bzip2"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".bz2", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-tarz")) { fr_process_begin_command (comm->process, "compress"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".Z", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-lrzip-compressed-tar")) { fr_process_begin_command (comm->process, "lrzip"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-l"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-g"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-b"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-z"); break; } fr_process_add_arg (comm->process, "-o"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".lrz", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-lzip-compressed-tar")) { fr_process_begin_command (comm->process, "lzip"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".lz", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-lzma-compressed-tar")) { fr_process_begin_command (comm->process, "lzma"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".lzma", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-xz-compressed-tar")) { fr_process_begin_command (comm->process, "xz"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".xz", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-lzop-compressed-tar")) { fr_process_begin_command (comm->process, "lzop"); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-3"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-6"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-9"); break; } fr_process_add_arg (comm->process, "-fU"); fr_process_add_arg (comm->process, "--no-stdin"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); new_name = g_strconcat (c_tar->uncomp_filename, ".lzo", NULL); } else if (_g_mime_type_matches (archive->mime_type, "application/x-7z-compressed-tar")) { FrCommandTar *comm_tar = (FrCommandTar*) comm; fr_process_begin_command (comm->process, comm_tar->compress_command); fr_process_set_begin_func (comm->process, begin_func__recompress, comm); switch (archive->compression) { case FR_COMPRESSION_VERY_FAST: fr_process_add_arg (comm->process, "-mx=1"); break; case FR_COMPRESSION_FAST: fr_process_add_arg (comm->process, "-mx=5"); break; case FR_COMPRESSION_NORMAL: fr_process_add_arg (comm->process, "-mx=5"); break; case FR_COMPRESSION_MAXIMUM: fr_process_add_arg (comm->process, "-mx=7"); break; } fr_process_add_arg (comm->process, "a"); fr_process_add_arg (comm->process, "-bd"); fr_process_add_arg (comm->process, "-y"); fr_process_add_arg (comm->process, "-l"); new_name = g_strconcat (c_tar->uncomp_filename, ".7z", NULL); fr_process_add_arg_concat (comm->process, new_name, NULL); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); /* remove the uncompressed tar */ fr_process_begin_command (comm->process, "rm"); fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, c_tar->uncomp_filename); fr_process_end_command (comm->process); } if (c_tar->name_modified) { char *tmp_dir; /* Restore original name. */ fr_process_begin_command (comm->process, "mv"); fr_process_add_arg (comm->process, "-f"); fr_process_add_arg (comm->process, "--"); fr_process_add_arg (comm->process, new_name); fr_process_add_arg (comm->process, comm->filename); fr_process_end_command (comm->process); tmp_dir = _g_path_remove_level (new_name); fr_process_begin_command (comm->process, "rm"); fr_process_set_sticky (comm->process, TRUE); fr_process_add_arg (comm->process, "-fr"); fr_process_add_arg (comm->process, tmp_dir); fr_process_end_command (comm->process); g_free (tmp_dir); } g_free (new_name); g_free (c_tar->uncomp_filename); c_tar->uncomp_filename = NULL; }
static void process_line (char *line, gpointer data) { FileData *fdata; FrCommand *comm = FR_COMMAND (data); char **fields; int date_idx; char *field_date, *field_time, *field_size, *field_name; char *name; g_return_if_fail (line != NULL); date_idx = _g_line_get_index_from_pattern (line, "%n%n%n%n-%n%n-%n%n %n%n:%n%n"); if (date_idx < 0) return; fdata = file_data_new (); field_size = _g_line_get_prev_field (line, date_idx, 1); fdata->size = g_ascii_strtoull (field_size, NULL, 10); g_free (field_size); field_date = _g_line_get_next_field (line, date_idx, 1); field_time = _g_line_get_next_field (line, date_idx, 2); fdata->modified = mktime_from_string (field_date, field_time); g_free (field_date); g_free (field_time); /* Full path */ field_name = tar_get_last_field (line, date_idx, 3); fields = g_strsplit (field_name, " -> ", 2); if (fields[1] == NULL) { g_strfreev (fields); fields = g_strsplit (field_name, " link to ", 2); } name = g_strcompress (fields[0]); if (*name == '/') { fdata->full_path = g_strdup (name); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", name, NULL); fdata->original_path = fdata->full_path + 1; } g_free (name); name = g_filename_from_utf8 (fdata->original_path, -1, NULL, NULL, NULL); if (name) fdata->original_path = name; if (fields[1] != NULL) fdata->link = g_strdup (fields[1]); g_strfreev (fields); g_free (field_name); fdata->dir = line[0] == 'd'; if (fdata->dir) fdata->name = _g_path_get_dir_name (fdata->full_path); else fdata->name = g_strdup (_g_path_get_basename (fdata->full_path)); fdata->path = _g_path_remove_level (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_archive_add_file (FR_ARCHIVE (comm), fdata); }
static void fr_command_jar_add (FrCommand *comm, const char *from_file, GList *file_list, const char *base_dir, gboolean update, gboolean follow_links) { FrProcess *proc = comm->process; GList *zip_list = NULL, *jardata_list = NULL, *jar_list = NULL; GList *scan; char *tmp_dir; for (scan = file_list; scan; scan = scan->next) { char *filename = scan->data; char *path = g_build_filename (base_dir, filename, NULL); char *package = NULL; if (_g_filename_has_extension (filename, ".java")) package = get_package_name_from_java_file (path); else if (_g_filename_has_extension (filename, ".class")) package = get_package_name_from_class_file (path); if ((package == NULL) || (strlen (package) == 0)) zip_list = g_list_append (zip_list, g_strdup (filename)); else { JarData *newdata = g_new0 (JarData, 1); newdata->package_minus_one_level = _g_path_remove_level (package); newdata->link_name = g_strdup (_g_path_get_basename (package)); newdata->rel_path = _g_path_remove_level (filename); newdata->filename = g_strdup (_g_path_get_basename (filename)); jardata_list = g_list_append (jardata_list, newdata); } g_free (package); g_free (path); } tmp_dir = _g_path_get_temp_work_dir (NULL); for (scan = jardata_list; scan ; scan = scan->next) { JarData *jdata = scan->data; char *pack_path; GFile *directory; char *old_link; char *link_name; int retval; pack_path = g_build_filename (tmp_dir, jdata->package_minus_one_level, NULL); directory = g_file_new_for_path (pack_path); if (! _g_file_make_directory_tree (directory, 0755, NULL)) { g_object_unref (directory); g_free (pack_path); continue; } old_link = g_build_filename (base_dir, jdata->rel_path, NULL); link_name = g_build_filename (pack_path, jdata->link_name, NULL); retval = symlink (old_link, link_name); if ((retval != -1) || (errno == EEXIST)) jar_list = g_list_append (jar_list, g_build_filename (jdata->package_minus_one_level, jdata->link_name, jdata->filename, NULL)); g_free (link_name); g_free (old_link); g_object_unref (directory); g_free (pack_path); } if (zip_list != NULL) FR_COMMAND_CLASS (fr_command_jar_parent_class)->add (comm, NULL, zip_list, base_dir, update, follow_links); if (jar_list != NULL) FR_COMMAND_CLASS (fr_command_jar_parent_class)->add (comm, NULL, jar_list, tmp_dir, update, follow_links); fr_process_begin_command (proc, "rm"); fr_process_set_working_dir (proc, "/"); fr_process_add_arg (proc, "-r"); fr_process_add_arg (proc, "-f"); fr_process_add_arg (proc, tmp_dir); fr_process_end_command (proc); fr_process_set_sticky (proc, TRUE); for (scan = jardata_list; scan ; scan = scan->next) { JarData *jdata = scan->data; g_free (jdata->filename); g_free (jdata->package_minus_one_level); g_free (jdata->link_name); g_free (jdata->rel_path); } _g_string_list_free (jardata_list); _g_string_list_free (jar_list); _g_string_list_free (zip_list); g_free (tmp_dir); }
static void list__process_line (char *line, gpointer data) { FileData *fdata; FrCommand *comm = FR_COMMAND (data); char **fields; const char *name_field; char *name; int ofs = 0; g_return_if_fail (line != NULL); fdata = file_data_new (); #ifdef __sun fields = _g_str_split_line (line, 9); fdata->size = g_ascii_strtoull (fields[4], NULL, 10); fdata->modified = mktime_from_string (fields[5], fields[6], fields[8]); g_strfreev (fields); name_field = _g_str_get_last_field (line, 10); #else /* !__sun */ /* Handle char and block device files */ if ((line[0] == 'c') || (line[0] == 'b')) { fields = _g_str_split_line (line, 9); ofs = 1; fdata->size = 0; /* FIXME: We should also specify the content type */ } else { fields = _g_str_split_line (line, 8); fdata->size = g_ascii_strtoull (fields[4], NULL, 10); } fdata->modified = mktime_from_string (fields[5+ofs], fields[6+ofs], fields[7+ofs]); g_strfreev (fields); name_field = _g_str_get_last_field (line, 9+ofs); #endif /* !__sun */ fields = g_strsplit (name_field, " -> ", 2); if (fields[1] == NULL) { g_strfreev (fields); fields = g_strsplit (name_field, " link to ", 2); } fdata->dir = line[0] == 'd'; name = g_strcompress (fields[0]); if (*(fields[0]) == '/') { fdata->full_path = g_strdup (name); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", name, NULL); fdata->original_path = fdata->full_path + 1; } if (fdata->dir && (name[strlen (name) - 1] != '/')) { char *old_full_path = fdata->full_path; fdata->full_path = g_strconcat (old_full_path, "/", NULL); g_free (old_full_path); fdata->original_path = g_strdup (name); fdata->free_original_path = TRUE; } g_free (name); if (fields[1] != NULL) fdata->link = g_strcompress (fields[1]); g_strfreev (fields); if (fdata->dir) fdata->name = _g_path_get_dir_name (fdata->full_path); else fdata->name = g_strdup (_g_path_get_basename (fdata->full_path)); fdata->path = _g_path_remove_level (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_archive_add_file (FR_ARCHIVE (comm), fdata); }
static void list__process_line (char *line, gpointer data) { FrCommand7z *self = FR_COMMAND_7Z (data); FrArchive *archive = FR_ARCHIVE (data); char **fields; FileData *fdata; g_return_if_fail (line != NULL); if (! self->list_started) { if (strncmp (line, "p7zip Version ", 14) == 0) { const char *ver_start; int ver_len; char version[256]; ver_start = _g_str_eat_spaces (line + 14); ver_len = strchr (ver_start, ' ') - ver_start; strncpy (version, ver_start, ver_len); version[ver_len] = 0; if (strcmp (version, "4.55") < 0) self->old_style = TRUE; else self->old_style = FALSE; } else if (self->old_style && (strncmp (line, "Listing archive: ", 17) == 0)) self->list_started = TRUE; else if (! self->old_style && (strcmp (line, "----------") == 0)) self->list_started = TRUE; else if (strncmp (line, "Multivolume = ", 14) == 0) { fields = g_strsplit (line, " = ", 2); archive->multi_volume = (strcmp (fields[1], "+") == 0); g_strfreev (fields); } return; } if (strcmp (line, "") == 0) { if (self->fdata != NULL) { if (self->fdata->original_path == NULL) { file_data_free (self->fdata); self->fdata = NULL; } else { fdata = self->fdata; if (fdata->dir) fdata->name = _g_path_get_dir_name (fdata->full_path); else fdata->name = g_strdup (_g_path_get_basename (fdata->full_path)); fdata->path = _g_path_remove_level (fdata->full_path); fr_archive_add_file (archive, fdata); self->fdata = NULL; } } return; } if (self->fdata == NULL) self->fdata = file_data_new (); fields = g_strsplit (line, " = ", 2); if (g_strv_length (fields) < 2) { g_strfreev (fields); return; } fdata = self->fdata; if (strcmp (fields[0], "Path") == 0) { fdata->free_original_path = TRUE; fdata->original_path = g_strdup (fields[1]); fdata->full_path = g_strconcat ((fdata->original_path[0] != '/') ? "/" : "", fdata->original_path, (fdata->dir && (fdata->original_path[strlen (fdata->original_path) - 1] != '/')) ? "/" : "", NULL); } else if (strcmp (fields[0], "Folder") == 0) { fdata->dir = (strcmp (fields[1], "+") == 0); } else if (strcmp (fields[0], "Size") == 0) { fdata->size = g_ascii_strtoull (fields[1], NULL, 10); } else if (strcmp (fields[0], "Modified") == 0) { char **modified_fields; modified_fields = g_strsplit (fields[1], " ", 2); if (modified_fields[0] != NULL) fdata->modified = mktime_from_string (modified_fields[0], modified_fields[1]); g_strfreev (modified_fields); } else if (strcmp (fields[0], "Encrypted") == 0) { if (strcmp (fields[1], "+") == 0) fdata->encrypted = TRUE; } else if (strcmp (fields[0], "Method") == 0) { if (strstr (fields[1], "AES") != NULL) fdata->encrypted = TRUE; } else if (strcmp (fields[0], "Attributes") == 0) { if (fields[1][0] == 'D') fdata->dir = TRUE; } g_strfreev (fields); }