static void list__process_line (char *line, gpointer data) { FileData *fdata; FrCommand *comm = FR_COMMAND (data); FrCommandIso *comm_iso = FR_COMMAND_ISO (comm); char **fields; const char *name_field; g_return_if_fail (line != NULL); if (line[0] == 'd') /* Ignore directories. */ return; if (line[0] == 'D') { g_free (comm_iso->cur_path); comm_iso->cur_path = g_strdup (get_last_field (line, 4)); } else if (line[0] == '-') { /* Is file */ const char *last_field, *first_bracket; fdata = file_data_new (); fields = split_line (line, 8); fdata->size = g_ascii_strtoull (fields[4], NULL, 10); fdata->modified = mktime_from_string (fields[5], fields[6], fields[7]); g_strfreev (fields); /* Full path */ last_field = get_last_field (line, 9); first_bracket = strchr (last_field, ']'); if (first_bracket == NULL) { file_data_free (fdata); return; } name_field = eat_spaces (first_bracket + 1); if ((name_field == NULL) || (strcmp (name_field, ".") == 0) || (strcmp (name_field, "..") == 0)) { file_data_free (fdata); return; } if (comm_iso->cur_path[0] != '/') fdata->full_path = g_strstrip (g_strconcat ("/", comm_iso->cur_path, name_field, NULL)); else fdata->full_path = g_strstrip (g_strconcat (comm_iso->cur_path, name_field, NULL)); fdata->original_path = fdata->full_path; fdata->name = g_strdup (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); fr_command_add_file (comm, fdata); } }
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 fr_command_cfile_list (FrCommand *comm) { FrCommandCFile *comm_cfile = FR_COMMAND_CFILE (comm); if (is_mime_type (comm->mime_type, "application/x-gzip")) { /* gzip let us known the uncompressed size */ fr_process_set_out_line_func (FR_COMMAND (comm)->process, list__process_line, comm); fr_process_begin_command (comm->process, "gzip"); fr_process_add_arg (comm->process, "-l"); fr_process_add_arg (comm->process, "-q"); fr_process_add_arg (comm->process, comm->filename); fr_process_end_command (comm->process); fr_process_start (comm->process); } else { /* ... other compressors do not support this feature so * simply use the archive size, suboptimal but there is no * alternative. */ FileData *fdata; char *filename; fdata = file_data_new (); filename = remove_extension_from_path (comm->filename); fdata->full_path = g_strconcat ("/", file_name_from_path (filename), NULL); g_free (filename); fdata->original_path = fdata->full_path + 1; fdata->link = NULL; fdata->size = get_file_size_for_path (comm->filename); fdata->modified = get_file_mtime_for_path (comm->filename); fdata->name = g_strdup (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_command_add_file (comm, fdata); comm_cfile->error.type = FR_PROC_ERROR_NONE; comm_cfile->error.status = 0; g_signal_emit_by_name (G_OBJECT (comm), "done", comm->action, &comm_cfile->error); } }
GList* file_data_list_from_uri_list (GList *list) { GList *result = NULL; GList *scan; for (scan = list; scan; scan = scan->next) { char *path = scan->data; result = g_list_prepend (result, file_data_new (path, NULL)); } return g_list_reverse (result); }
FileData * file_data_new_from_local_path (const char *path) { FileData *fd; char *uri; uri = get_uri_from_local_path (path); fd = file_data_new (uri, NULL); file_data_update (fd); g_free (uri); return fd; }
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; FrCommand *comm = FR_COMMAND (data); char **fields; const char *name_field; g_return_if_fail (line != NULL); fdata = file_data_new (); fields = split_line_lha (line); fdata->size = g_ascii_strtoull (fields[2], NULL, 10); fdata->modified = mktime_from_string (fields[4], fields[5], fields[6]); g_strfreev (fields); /* Full path */ name_field = get_last_field_lha (line); if (name_field && *name_field == '/') { fdata->full_path = g_strdup (name_field); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", name_field, NULL); fdata->original_path = fdata->full_path + 1; } fdata->link = NULL; fdata->dir = line[0] == 'd'; if (fdata->dir) fdata->name = dir_name_from_path (fdata->full_path); else fdata->name = g_strdup (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_command_add_file (comm, fdata); }
static void list__process_line (char *line, gpointer data) { FrCommand *comm = FR_COMMAND (data); FileData *fdata; char **fields; char *filename; fdata = file_data_new (); fields = split_line (line, 2); if (strcmp (fields[1], "-1") != 0) fdata->size = g_ascii_strtoull (fields[1], NULL, 10); g_strfreev (fields); if (fdata->size == 0) fdata->size = get_file_size (comm->filename); filename = get_uncompressed_name_from_archive (comm, comm->filename); if (filename == NULL) filename = remove_extension_from_path (comm->filename); fdata->full_path = g_strconcat ("/", file_name_from_path (filename), NULL); g_free (filename); fdata->original_path = fdata->full_path + 1; fdata->link = NULL; fdata->modified = get_file_mtime_for_path (comm->filename); fdata->name = g_strdup (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_command_add_file (comm, fdata); }
static void process_metadata_line (char *line, FrCommand *comm) { FileData *fdata; char **fields; char *name; g_return_if_fail (line != NULL); fields = split_line (line, 6); if (!fields[1] || !g_str_equal (fields[1], "bytes,")) { g_strfreev (fields); return; } fdata = file_data_new (); fdata->size = g_ascii_strtoull (fields[0], NULL, 10); if (fields[5] && g_str_equal (fields[4],"*")) { name = g_strdup (fields[5]); } else { name = g_strdup (get_last_field (line, 5)); } g_strstrip (name); fdata->full_path = g_strconcat ("/DEBIAN/", name, NULL); fdata->original_path = fdata->full_path + 1; g_strfreev (fields); g_free (name); fdata->name = g_strdup (name); fdata->path = g_strdup ("DEBIAN"); fr_command_add_file (comm, fdata); }
gint filelist_read(const gchar *path, GList **files, GList **dirs) { DIR *dp; struct dirent *dir; struct stat ent_sbuf; gchar *pathl; GList *dlist; GList *flist; dlist = NULL; flist = NULL; pathl = path_from_utf8(path); if (!pathl || (dp = opendir(pathl)) == NULL) { g_free(pathl); if (files) *files = NULL; if (dirs) *dirs = NULL; return FALSE; } /* root dir fix */ if (pathl[0] == '/' && pathl[1] == '\0') { g_free(pathl); pathl = g_strdup(""); } while ((dir = readdir(dp)) != NULL) { gchar *name = dir->d_name; if (show_dot_files || !ishidden(name)) { gchar *filepath = g_strconcat(pathl, "/", name, NULL); if (stat(filepath, &ent_sbuf) >= 0) { if (S_ISDIR(ent_sbuf.st_mode)) { /* we ignore the .thumbnails dir for cleanliness */ if ((dirs) && !(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) && strcmp(name, GQVIEW_CACHE_LOCAL_THUMB) != 0 && strcmp(name, GQVIEW_CACHE_LOCAL_METADATA) != 0 && strcmp(name, THUMB_FOLDER_LOCAL) != 0) { dlist = g_list_prepend(dlist, file_data_new(filepath, &ent_sbuf)); } } else { if ((files) && filter_name_exists(name)) { flist = g_list_prepend(flist, file_data_new(filepath, &ent_sbuf)); } } } g_free(filepath); } } closedir(dp); g_free(pathl); if (dirs) *dirs = dlist; if (files) *files = flist; return TRUE; }
static void process_data_line (char *line, gpointer data) { FileData *fdata; FrCommand *comm = FR_COMMAND (data); char **fields; char **tmfields; struct tm tm = {0, }; const char *name; g_return_if_fail (line != NULL); if (line[0] == ' ') { /* This is the output of dpkg-deb -I */ process_metadata_line (line, comm); return; } fdata = file_data_new (); fields = split_line (line, 5); fdata->size = g_ascii_strtoull (fields[2], NULL, 10); tmfields = g_strsplit(fields[3], "-", 3); if (tmfields[2]) { tm.tm_year = atoi (tmfields[0]) - 1900; tm.tm_mon = atoi (tmfields[1]); tm.tm_mday = atoi (tmfields[2]); } g_strfreev (tmfields); tmfields = g_strsplit (fields[4], ":", 2); if (tmfields[1]) { tm.tm_hour = atoi (tmfields[0]); tm.tm_min = atoi (tmfields[1]); } g_strfreev (tmfields); fdata->modified = mktime (&tm); g_strfreev (fields); name = get_last_field (line, 6); fields = g_strsplit (name, " -> ", 2); fdata->dir = line[0] == 'd'; name = fields[0]; if (g_str_has_prefix (name, "./")) { /* Should generally be the case */ fdata->full_path = g_strdup (name + 1); fdata->original_path = fdata->full_path + 1; } else if (name[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; } if (fields[1] != NULL) fdata->link = g_strdup (fields[1]); g_strfreev (fields); if (fdata->dir) fdata->name = dir_name_from_path (fdata->full_path); else fdata->name = g_strdup (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_command_add_file (comm, fdata); }
static void list__process_line (char *line, gpointer data) { FrCommand *comm = FR_COMMAND (data); FrCommandArj *arj_comm = FR_COMMAND_ARJ (comm); g_return_if_fail (line != NULL); if (! arj_comm->list_started) { if (strncmp (line, "--------", 8) == 0) { arj_comm->list_started = TRUE; arj_comm->line_no = 1; } return; } if (strncmp (line, "--------", 8) == 0) { arj_comm->list_started = FALSE; return; } if (g_regex_match (arj_comm->filename_line_regex, line, 0, NULL)) { /* Read the filename. */ FileData *fdata; const char *name_field; arj_comm->line_no = 1; arj_comm->fdata = fdata = file_data_new (); name_field = get_last_field (line, 2); if (*name_field == '/') { fdata->full_path = g_strdup (name_field); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", name_field, NULL); fdata->original_path = fdata->full_path + 1; } fdata->link = NULL; fdata->name = g_strdup (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); } else if (arj_comm->line_no == 2) { /* Read file size and date. */ FileData *fdata; char **fields; fdata = arj_comm->fdata; /* read file info. */ fields = split_line (line, 10); fdata->size = g_ascii_strtoull (fields[2], NULL, 10); fdata->modified = mktime_from_string (fields[5], fields[6]); if ((strcmp (fields[1], "MS-DOS") == 0) || (strcmp (fields[1], "WIN32") == 0)) fdata->encrypted = (g_ascii_strcasecmp (fields[7], "11") == 0); else fdata->encrypted = (g_ascii_strcasecmp (fields[9], "11") == 0); g_strfreev (fields); if (*fdata->name == 0) file_data_free (fdata); else fr_command_add_file (comm, fdata); arj_comm->fdata = NULL; } arj_comm->line_no++; }
static void process_line (char *line, gpointer data) { FrCommand *comm = FR_COMMAND (data); FrCommandUnstuff *unstuff_comm = FR_COMMAND_UNSTUFF (comm); const char *str_start; char *filename, *real_filename; int i; FileData *fdata; g_return_if_fail (line != NULL); if (strstr (line, "progressEvent - ")) { const char *ssize; guint size; ssize = strstr (line, "progressEvent - ") + strlen ("progressEvent - "); if (ssize[0] == '\0') size = 0; else size = g_ascii_strtoull (ssize, NULL, 10); if (unstuff_comm->fdata != NULL) unstuff_comm->fdata->size = size; return; } if (strstr (line, "fileEvent") == NULL) return; if (strstr (line, unstuff_comm->target_dir + 1) == NULL) return; /* Look for the filename, ends with a comma */ str_start = strstr (line, unstuff_comm->target_dir + 1); str_start = str_start + strlen (unstuff_comm->target_dir) - 1; if (str_start[0] != '/') str_start--; if (str_start[0] == '.') str_start--; i = 0; while (str_start[i] != '\0' && str_start[i] != ',') { i++; } /* This is not supposed to happen */ g_return_if_fail (str_start[i] != '\0'); filename = g_strndup (str_start, i); /* Same thing with the real filename */ str_start = strstr (line, unstuff_comm->target_dir); i = 0; while (str_start[i] != '\0' && str_start[i] != ',') { i++; } real_filename = g_strndup (str_start, i); fdata = file_data_new (); fdata->full_path = filename; fdata->original_path = filename; fdata->link = NULL; fdata->name = g_strdup (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); fdata->size = 0; fdata->modified = time (NULL); unstuff_comm->fdata = fdata; fr_command_add_file (comm, fdata); unlink (real_filename); g_free (real_filename); }
static void process_line (char *line, gpointer data) { FileData *fdata; FrCommandAce *ace_comm = FR_COMMAND_ACE (data); FrCommand *comm = FR_COMMAND (data); char **fields = NULL; const char *field_name = NULL; 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 = split_line (line, 5); if ((fields == NULL) || (fields[0] == NULL) || (n_fields (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 = get_last_field (line, 6); g_assert (field_name != NULL); 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 (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_command_add_file (comm, fdata); }
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 = 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 = get_last_field (line, 10); #else /* !__sun */ /* Handle char and block device files */ if ((line[0] == 'c') || (line[0] == 'b')) { fields = split_line (line, 9); ofs = 1; fdata->size = 0; /* FIXME: We should also specify the content type */ } else { fields = 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 = 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 = dir_name_from_path (fdata->full_path); else fdata->name = g_strdup (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_command_add_file (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); }
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 process_line (char *line, gpointer data) { FileData *fdata; FrCommand *comm = FR_COMMAND (data); char **fields; int date_idx; char *field_month, *field_day, *field_time, *field_year; char *field_size, *field_name; g_return_if_fail (line != NULL); fdata = file_data_new (); date_idx = file_list__get_index_from_pattern (line, "%c%c%c %a%n %n%n:%n%n %n%n%n%n"); field_size = file_list__get_prev_field (line, date_idx, 1); fdata->size = g_ascii_strtoull (field_size, NULL, 10); g_free (field_size); field_month = file_list__get_next_field (line, date_idx, 1); field_day = file_list__get_next_field (line, date_idx, 2); field_time = file_list__get_next_field (line, date_idx, 3); field_year = file_list__get_next_field (line, date_idx, 4); fdata->modified = mktime_from_string (field_time, field_day, field_month, field_year); g_free (field_day); g_free (field_month); g_free (field_year); g_free (field_time); /* Full path */ field_name = ar_get_last_field (line, date_idx, 5); fields = g_strsplit (field_name, " -> ", 2); if (fields[0] == NULL) { g_strfreev (fields); g_free (field_name); file_data_free (fdata); return; } if (fields[1] == NULL) { g_strfreev (fields); fields = g_strsplit (field_name, " link to ", 2); } if (*(fields[0]) == '/') { fdata->full_path = g_strdup (fields[0]); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", fields[0], NULL); fdata->original_path = fdata->full_path + 1; } if (fields[1] != NULL) fdata->link = g_strdup (fields[1]); g_strfreev (fields); g_free (field_name); fdata->name = g_strdup (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_command_add_file (comm, fdata); }
static void list__process_line (char *line, gpointer data) { FileData *fdata; FrCommand *comm = FR_COMMAND (data); char **fields; const char *name_field; gint line_l; g_return_if_fail (line != NULL); /* check whether unzip gave the empty archive warning. */ if (FR_COMMAND_ZIP (comm)->is_empty) return; line_l = strlen (line); if (line_l == 0) return; if (strcmp (line, EMPTY_ARCHIVE_WARNING) == 0) { FR_COMMAND_ZIP (comm)->is_empty = TRUE; return; } /* ignore lines that do not describe a file or a * directory. */ if ((line[0] != '?') && (line[0] != 'd') && (line[0] != '-')) return; /**/ fdata = file_data_new (); fields = split_line (line, 7); fdata->size = g_ascii_strtoull (fields[3], NULL, 10); fdata->modified = mktime_from_string (fields[6]); fdata->encrypted = (*fields[4] == 'B') || (*fields[4] == 'T'); g_strfreev (fields); /* Full path */ name_field = get_last_field (line, 8); if (*name_field == '/') { fdata->full_path = g_strdup (name_field); fdata->original_path = fdata->full_path; } else { fdata->full_path = g_strconcat ("/", name_field, NULL); fdata->original_path = fdata->full_path + 1; } fdata->link = NULL; fdata->dir = line[0] == 'd'; if (fdata->dir) fdata->name = dir_name_from_path (fdata->full_path); else fdata->name = g_strdup (file_name_from_path (fdata->full_path)); fdata->path = remove_level_from_path (fdata->full_path); if (*fdata->name == 0) file_data_free (fdata); else fr_command_add_file (comm, fdata); }