static void layout_path_entry_tab_cb(const gchar *path, gpointer data) { LayoutWindow *lw = data; gchar *buf; gchar *base; buf = g_strdup(path); parse_out_relatives(buf); base = remove_level_from_path(buf); if (isdir(buf)) { if ((!lw->path || strcmp(lw->path, buf) != 0) && layout_set_path(lw, buf)) { gint pos = -1; /* put the '/' back, if we are in tab completion for a dir and result was path change */ gtk_editable_insert_text(GTK_EDITABLE(lw->path_entry), "/", -1, &pos); gtk_editable_set_position(GTK_EDITABLE(lw->path_entry), strlen(gtk_entry_get_text(GTK_ENTRY(lw->path_entry)))); } } else if (lw->path && strcmp(lw->path, base) == 0) { layout_list_scroll_to_subpart(lw, filename_from_path(buf)); } g_free(base); g_free(buf); }
static char * get_temp_name (FrCommandTar *c_tar, const char *filepath) { char *dirname = remove_level_from_path (filepath); char *template; char *result = NULL; char *temp_name = NULL;
gchar * cache_get_location (CacheType type, const gchar * source, gint include_name, const gchar * ext, mode_t * mode) { gchar *path = NULL; gchar *base; gchar *name = NULL; if (!source) return NULL; base = remove_level_from_path (source); if (include_name) { name = g_strconcat ("/", filename_from_path (source), NULL); } else { ext = NULL; } if (type == CACHE_THUMBS) { if (conf.enable_thumb_dirs && access (base, W_OK) == 0) { path = g_strconcat (base, "/", PORNVIEW_CACHE_DIR, name, ext, NULL); if (mode) *mode = 0775; } if (!path) { path = g_strconcat (home_dir (), "/", PORNVIEW_RC_DIR_THUMBS, base, name, ext, NULL); if (mode) *mode = 0755; } } else { path = g_strconcat (home_dir (), "/", PORNVIEW_RC_DIR_COMMENTS, base, name, ext, NULL); if (mode) *mode = 0755; } g_free (base); if (name) g_free (name); return path; }
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 = 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); fr_command_add_file (FR_COMMAND (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); } }
void vf_notify_cb(FileData *fd, NotifyType type, gpointer data) { ViewFile *vf = data; gboolean refresh; NotifyType interested = NOTIFY_CHANGE | NOTIFY_REREAD | NOTIFY_GROUPING; if (vf->marks_enabled) interested |= NOTIFY_MARKS | NOTIFY_METADATA; /* FIXME: NOTIFY_METADATA should be checked by the keyword-to-mark functions and converted to NOTIFY_MARKS only if there was a change */ if (!(type & interested) || vf->refresh_idle_id || !vf->dir_fd) return; refresh = (fd == vf->dir_fd); if (!refresh) { gchar *base = remove_level_from_path(fd->path); refresh = (strcmp(base, vf->dir_fd->path) == 0); g_free(base); } if ((type & NOTIFY_CHANGE) && fd->change) { if (!refresh && fd->change->dest) { gchar *dest_base = remove_level_from_path(fd->change->dest); refresh = (strcmp(dest_base, vf->dir_fd->path) == 0); g_free(dest_base); } if (!refresh && fd->change->source) { gchar *source_base = remove_level_from_path(fd->change->source); refresh = (strcmp(source_base, vf->dir_fd->path) == 0); g_free(source_base); } } if (refresh) { DEBUG_1("Notify vf: %s %04x", fd->path, type); vf_refresh_idle(vf); } }
static gchar *cache_build_path_local(const gchar *source, const gchar *cache_local, const gchar *cache_ext) { gchar *path; gchar *base = remove_level_from_path(source); gchar *name = g_strconcat(filename_from_path(source), cache_ext, NULL); path = g_build_filename(base, cache_local, name, NULL); g_free(name); g_free(base); return path; }
void file_dialog_sync_history(FileDialog *fdlg, gboolean dir_only) { if (!fdlg->dest_path) return; if (!dir_only || (dir_only && isdir(fdlg->dest_path)) ) { tab_completion_append_to_history(fdlg->entry, fdlg->dest_path); } else { gchar *buf = remove_level_from_path(fdlg->dest_path); tab_completion_append_to_history(fdlg->entry, buf); g_free(buf); } }
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 convert_old_comment (char *real_file, char *rc_file, gpointer data) { char *comment_file; char *comment_dir; comment_file = comments_get_comment_filename (real_file, TRUE); comment_dir = remove_level_from_path (comment_file); ensure_dir_exists (comment_dir, 0755); file_copy (rc_file, comment_file); g_free (comment_dir); g_free (comment_file); }
static void fr_command_iso_extract (FrCommand *comm, const char *from_file, GList *file_list, const char *dest_dir, gboolean overwrite, gboolean skip_older, gboolean junk_paths) { GList *scan; for (scan = file_list; scan; scan = scan->next) { char *path = scan->data; const char *filename; char *file_dir; char *temp_dest_dir = NULL; filename = file_name_from_path (path); file_dir = remove_level_from_path (path); if ((file_dir != NULL) && (strcmp (file_dir, "/") != 0)) temp_dest_dir = g_build_filename (dest_dir, file_dir, NULL); else temp_dest_dir = g_strdup (dest_dir); g_free (file_dir); if (temp_dest_dir == NULL) continue; make_directory_tree_from_path (temp_dest_dir, 0700, NULL); fr_process_begin_command (comm->process, "sh"); fr_process_set_working_dir (comm->process, temp_dest_dir); fr_process_add_arg (comm->process, SHDIR "isoinfo.sh"); fr_process_add_arg (comm->process, "-i"); fr_process_add_arg (comm->process, comm->filename); fr_process_add_arg (comm->process, "-x"); fr_process_add_arg (comm->process, path); fr_process_add_arg (comm->process, filename); fr_process_end_command (comm->process); g_free (temp_dest_dir); } }
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); }
char * cache_get_nautilus_cache_name (const char *path) { char *parent; char *resolved_parent; char *resolved_path = NULL; GnomeVFSResult result; GnomeVFSURI *uri; char *uri_txt; char *retval; parent = remove_level_from_path (path); result = resolve_all_symlinks (parent, &resolved_parent); g_free (parent); if (result == GNOME_VFS_OK) resolved_path = g_strconcat (resolved_parent, "/", file_name_from_path (path), NULL); else resolved_path = g_strdup (path); uri = new_uri_from_path (resolved_path); g_free (resolved_path); g_free (resolved_parent); uri_txt = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE); gnome_vfs_uri_unref (uri); if (uri_txt == NULL) return NULL; retval = gnome_thumbnail_path_for_uri (uri_txt, GNOME_THUMBNAIL_SIZE_NORMAL); g_free (uri_txt); return retval; }
gchar *cache_get_location(CacheType type, const gchar *source, gint include_name, mode_t *mode) { gchar *path = NULL; gchar *base; gchar *name = NULL; const gchar *cache_rc; const gchar *cache_local; const gchar *cache_ext; if (!source) return NULL; cache_path_parts(type, &cache_rc, &cache_local, &cache_ext); base = remove_level_from_path(source); if (include_name) { name = g_strconcat(filename_from_path(source), cache_ext, NULL); } if (((type != CACHE_TYPE_METADATA && type != CACHE_TYPE_XMP_METADATA && options->thumbnails.cache_into_dirs) || ((type == CACHE_TYPE_METADATA || type == CACHE_TYPE_XMP_METADATA) && options->metadata.enable_metadata_dirs)) && access_file(base, W_OK)) { path = g_build_filename(base, cache_local, name, NULL); if (mode) *mode = 0775; } if (!path) { path = g_build_filename(cache_rc, base, name, NULL); if (mode) *mode = 0755; } g_free(base); if (name) g_free(name); return path; }
static gchar *thumb_std_cache_path(const gchar *path, const gchar *uri, gint local, const gchar *cache_subfolder) { gchar *result = NULL; gchar *cache_base; gchar *md5_text; guchar digest[16]; if (!path || !uri || !cache_subfolder) return NULL; if (local) { gchar *base; base = remove_level_from_path(path); cache_base = g_strconcat(base, "/", THUMB_FOLDER, "/", cache_subfolder, NULL); g_free(base); } else { cache_base = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", cache_subfolder, NULL); } md5_get_digest((guchar *)uri, strlen(uri), digest); md5_text = md5_digest_to_text(digest); if (cache_base && md5_text) { result = g_strconcat(cache_base, "/", md5_text, THUMB_NAME_EXTENSION, NULL); } g_free(cache_base); g_free(md5_text); return result; }
static void thumb_loader_std_save(ThumbLoaderStd *tl, GdkPixbuf *pixbuf) { gchar *base_path; gchar *tmp_path; gint fail; if (!tl->cache_enable || tl->cache_hit) return; if (tl->thumb_path) return; if (!pixbuf) { /* local failures are not stored */ if (tl->cache_local) return; pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 1, 1); fail = TRUE; } else { g_object_ref(G_OBJECT(pixbuf)); fail = FALSE; } tl->thumb_path = thumb_loader_std_cache_path(tl, tl->cache_local, pixbuf, fail); if (!tl->thumb_path) { g_object_unref(G_OBJECT(pixbuf)); return; } tl->thumb_path_local = tl->cache_local; /* create thumbnail dir if needed */ base_path = remove_level_from_path(tl->thumb_path); if (tl->cache_local) { if (!isdir(base_path)) { struct stat st; gchar *source_base; source_base = remove_level_from_path(tl->source_path); if (stat_utf8(source_base, &st)) { cache_ensure_dir_exists(base_path, st.st_mode); } g_free(source_base); } } else { cache_ensure_dir_exists(base_path, THUMB_PERMS_FOLDER); } g_free(base_path); if (debug) { printf("thumb saving: %s\n", tl->source_path); printf(" saved: %s\n", tl->thumb_path); } /* save thumb, using a temp file then renaming into place */ tmp_path = unique_filename(tl->thumb_path, ".tmp", "_", 2); if (tmp_path) { const gchar *mark_uri; gchar *mark_app; gchar *mark_mtime; gchar *pathl; gint success; mark_uri = (tl->cache_local) ? tl->local_uri :tl->thumb_uri; mark_app = g_strdup_printf("GQview %s", VERSION); mark_mtime = g_strdup_printf("%lu", tl->source_mtime); pathl = path_from_utf8(tmp_path); success = gdk_pixbuf_save(pixbuf, pathl, "png", NULL, THUMB_MARKER_URI, mark_uri, THUMB_MARKER_MTIME, mark_mtime, THUMB_MARKER_APP, mark_app, NULL); if (success) { chmod(pathl, (tl->cache_local) ? tl->source_mode : THUMB_PERMS_THUMB); success = rename_file(tmp_path, tl->thumb_path); } g_free(pathl); g_free(mark_mtime); g_free(mark_app); g_free(tmp_path); if (!success && debug) { printf("thumb save failed: %s\n", tl->source_path); printf(" thumb: %s\n", tl->thumb_path); } } g_object_unref(G_OBJECT(pixbuf)); }
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); }
gint layout_set_path(LayoutWindow *lw, const gchar *path) { gint have_file = FALSE; if (!layout_valid(&lw)) return FALSE; if (!path || !isname(path)) return FALSE; if (lw->path && path && strcmp(path, lw->path) == 0) { return TRUE; } if (isdir(path)) { g_free(lw->path); lw->path = g_strdup(path); } else { gchar *base; base = remove_level_from_path(path); if (lw->path && strcmp(lw->path, base) == 0) { g_free(base); } else if (isdir(base)) { g_free(lw->path); lw->path = base; } else { g_free(base); return FALSE; } if (isfile(path)) have_file = TRUE; } if (lw->path_entry) tab_completion_append_to_history(lw->path_entry, lw->path); layout_sync_path(lw); if (have_file) { gint row; row = layout_list_get_index(lw, path); if (row >= 0) { layout_image_set_index(lw, row); } else { layout_image_set_path(lw, path); } } else if (!lazy_image_sync) { layout_image_set_index(lw, 0); } return TRUE; }
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) { 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++; }
void dlg_prop (FrWindow *window) { DialogData *data; GtkWidget *ok_button; GtkWidget *help_button; GtkWidget *label_label; GtkWidget *label; char *s; goffset size, uncompressed_size; char *utf8_name; char *title_txt; double ratio; data = g_new (DialogData, 1); data->builder = _gtk_builder_new_from_file ("properties.ui"); if (data->builder == NULL) { g_free (data); return; } /* Get the widgets. */ data->dialog = _gtk_builder_get_widget (data->builder, "prop_dialog"); ok_button = _gtk_builder_get_widget (data->builder, "p_ok_button"); help_button = _gtk_builder_get_widget (data->builder, "p_help_button"); /* Set widgets data. */ label_label = _gtk_builder_get_widget (data->builder, "p_path_label_label"); /* Translators: after the colon there is a folder name. */ set_label (label_label, _("Location:")); label = _gtk_builder_get_widget (data->builder, "p_path_label"); s = remove_level_from_path (fr_window_get_archive_uri (window)); utf8_name = g_filename_display_name (s); gtk_label_set_text (GTK_LABEL (label), utf8_name); g_free (utf8_name); g_free (s); /**/ label_label = _gtk_builder_get_widget (data->builder, "p_name_label_label"); set_label (label_label, C_("File", "Name:")); label = _gtk_builder_get_widget (data->builder, "p_name_label"); utf8_name = g_uri_display_basename (fr_window_get_archive_uri (window)); gtk_label_set_text (GTK_LABEL (label), utf8_name); title_txt = g_strdup_printf (_("%s Properties"), utf8_name); gtk_window_set_title (GTK_WINDOW (data->dialog), title_txt); g_free (title_txt); g_free (utf8_name); /**/ label_label = _gtk_builder_get_widget (data->builder, "p_date_label_label"); set_label (label_label, _("Last modified:")); label = _gtk_builder_get_widget (data->builder, "p_date_label"); s = get_time_string (get_file_mtime (fr_window_get_archive_uri (window))); gtk_label_set_text (GTK_LABEL (label), s); g_free (s); /**/ label_label = _gtk_builder_get_widget (data->builder, "p_size_label_label"); set_label (label_label, _("Archive size:")); label = _gtk_builder_get_widget (data->builder, "p_size_label"); size = get_file_size (fr_window_get_archive_uri (window)); s = g_format_size (size); gtk_label_set_text (GTK_LABEL (label), s); g_free (s); /**/ label_label = _gtk_builder_get_widget (data->builder, "p_uncomp_size_label_label"); set_label (label_label, _("Content size:")); uncompressed_size = 0; if (fr_window_archive_is_present (window)) { int i; for (i = 0; i < window->archive->command->files->len; i++) { FileData *fd = g_ptr_array_index (window->archive->command->files, i); uncompressed_size += fd->size; } } label = _gtk_builder_get_widget (data->builder, "p_uncomp_size_label"); s = g_format_size (uncompressed_size); gtk_label_set_text (GTK_LABEL (label), s); g_free (s); /**/ label_label = _gtk_builder_get_widget (data->builder, "p_cratio_label_label"); set_label (label_label, _("Compression ratio:")); label = _gtk_builder_get_widget (data->builder, "p_cratio_label"); if (uncompressed_size != 0) ratio = (double) uncompressed_size / size; else ratio = 0.0; s = g_strdup_printf ("%0.2f", ratio); gtk_label_set_text (GTK_LABEL (label), s); g_free (s); /**/ label_label = _gtk_builder_get_widget (data->builder, "p_files_label_label"); set_label (label_label, _("Number of files:")); label = _gtk_builder_get_widget (data->builder, "p_files_label"); s = g_strdup_printf ("%d", window->archive->command->n_regular_files); gtk_label_set_text (GTK_LABEL (label), s); g_free (s); /* Set the signals handlers. */ g_signal_connect (G_OBJECT (data->dialog), "destroy", G_CALLBACK (destroy_cb), data); g_signal_connect_swapped (G_OBJECT (ok_button), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (data->dialog)); g_signal_connect (G_OBJECT (help_button), "clicked", G_CALLBACK (help_cb), data); /* Run dialog. */ gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (window)); gtk_window_set_modal (GTK_WINDOW (data->dialog), TRUE); gtk_widget_show (data->dialog); }
static void handle_method_call (GDBusConnection *connection, const char *sender, const char *object_path, const char *interface_name, const char *method_name, GVariant *parameters, GDBusMethodInvocation *invocation, gpointer user_data) { update_registered_commands_capabilities (); if (g_strcmp0 (method_name, "GetSupportedTypes") == 0) { char *action; int *supported_types = NULL; g_variant_get (parameters, "(s)", &action); if (g_strcmp0 (action, "create") == 0) { supported_types = save_type; } else if (g_strcmp0 (action, "create_single_file") == 0) { supported_types = single_file_save_type; } else if (g_strcmp0 (action, "extract") == 0) { supported_types = open_type; } if (supported_types == NULL) { g_dbus_method_invocation_return_error (invocation, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "Action not valid %s, valid values are: create, create_single_file, extract", action); } else { GVariantBuilder builder; int i; g_variant_builder_init (&builder, G_VARIANT_TYPE ("(aa{ss})")); g_variant_builder_open (&builder, G_VARIANT_TYPE ("aa{ss}")); for (i = 0; supported_types[i] != -1; i++) { g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{ss}")); g_variant_builder_add (&builder, "{ss}", "mime-type", mime_type_desc[supported_types[i]].mime_type); g_variant_builder_add (&builder, "{ss}", "default-extension", mime_type_desc[supported_types[i]].default_ext); g_variant_builder_add (&builder, "{ss}", "description", _(mime_type_desc[supported_types[i]].name)); g_variant_builder_close (&builder); } g_variant_builder_close (&builder); g_dbus_method_invocation_return_value (invocation, g_variant_builder_end (&builder)); } g_free (action); } else if (g_strcmp0 (method_name, "AddToArchive") == 0) { char *archive; char **files; gboolean use_progress_dialog; int i; GList *file_list = NULL; GtkWidget *window; g_variant_get (parameters, "(s^asb)", &archive, &files, &use_progress_dialog); for (i = 0; files[i] != NULL; i++) file_list = g_list_prepend (file_list, files[i]); file_list = g_list_reverse (file_list); window = fr_window_new (); fr_window_use_progress_dialog (FR_WINDOW (window), use_progress_dialog); g_signal_connect (window, "progress", G_CALLBACK (window_progress_cb), connection); g_signal_connect (window, "ready", G_CALLBACK (window_ready_cb), invocation); fr_window_new_batch (FR_WINDOW (window)); fr_window_set_batch__add (FR_WINDOW (window), archive, file_list); fr_window_append_batch_action (FR_WINDOW (window), FR_BATCH_ACTION_QUIT, NULL, NULL); fr_window_start_batch (FR_WINDOW (window)); g_free (archive); gtk_main (); } else if (g_strcmp0 (method_name, "Compress") == 0) { char **files; char *destination; gboolean use_progress_dialog; int i; GList *file_list = NULL; GtkWidget *window; g_variant_get (parameters, "(^assb)", &files, &destination, &use_progress_dialog); for (i = 0; files[i] != NULL; i++) file_list = g_list_prepend (file_list, files[i]); file_list = g_list_reverse (file_list); if ((destination == NULL) || (strcmp (destination, "") == 0)) destination = remove_level_from_path (file_list->data); window = fr_window_new (); fr_window_use_progress_dialog (FR_WINDOW (window), use_progress_dialog); fr_window_set_default_dir (FR_WINDOW (window), destination, TRUE); g_signal_connect (window, "progress", G_CALLBACK (window_progress_cb), connection); g_signal_connect (window, "ready", G_CALLBACK (window_ready_cb), invocation); fr_window_new_batch (FR_WINDOW (window)); fr_window_set_batch__add (FR_WINDOW (window), NULL, file_list); fr_window_append_batch_action (FR_WINDOW (window), FR_BATCH_ACTION_QUIT, NULL, NULL); fr_window_start_batch (FR_WINDOW (window)); g_free (destination); gtk_main (); } else if (g_strcmp0 (method_name, "Extract") == 0) { char *archive; char *destination; gboolean use_progress_dialog; GtkWidget *window; g_variant_get (parameters, "(ssb)", &archive, &destination, &use_progress_dialog); window = fr_window_new (); fr_window_use_progress_dialog (FR_WINDOW (window), use_progress_dialog); if ((destination != NULL) & (strcmp (destination, "") != 0)) fr_window_set_default_dir (FR_WINDOW (window), destination, TRUE); g_signal_connect (window, "progress", G_CALLBACK (window_progress_cb), connection); g_signal_connect (window, "ready", G_CALLBACK (window_ready_cb), invocation); fr_window_new_batch (FR_WINDOW (window)); fr_window_set_batch__extract (FR_WINDOW (window), archive, destination); fr_window_append_batch_action (FR_WINDOW (window), FR_BATCH_ACTION_QUIT, NULL, NULL); fr_window_start_batch (FR_WINDOW (window)); g_free (destination); g_free (archive); gtk_main (); } else if (g_strcmp0 (method_name, "ExtractHere") == 0) { char *archive; gboolean use_progress_dialog; GtkWidget *window; g_variant_get (parameters, "(sb)", &archive, &use_progress_dialog); window = fr_window_new (); fr_window_use_progress_dialog (FR_WINDOW (window), use_progress_dialog); g_signal_connect (window, "progress", G_CALLBACK (window_progress_cb), connection); g_signal_connect (window, "ready", G_CALLBACK (window_ready_cb), invocation); fr_window_new_batch (FR_WINDOW (window)); fr_window_set_batch__extract_here (FR_WINDOW (window), archive); fr_window_append_batch_action (FR_WINDOW (window), FR_BATCH_ACTION_QUIT, NULL, NULL); fr_window_start_batch (FR_WINDOW (window)); g_free (archive); gtk_main (); } }
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 fr_command_jar_add (FrCommand *comm, const char *from_file, GList *file_list, const char *base_dir, gboolean update, gboolean recursive) { 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 = build_uri (base_dir, filename, NULL); char *package = NULL; if (file_extension_is (filename, ".java")) package = get_package_name_from_java_file (path); else if (file_extension_is (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 = remove_level_from_path (package); newdata->link_name = g_strdup (file_name_from_path (package)); newdata->rel_path = remove_level_from_path (filename); newdata->filename = g_strdup (file_name_from_path (filename)); jardata_list = g_list_append (jardata_list, newdata); } g_free (package); g_free (path); } tmp_dir = get_temp_work_dir (NULL); for (scan = jardata_list; scan ; scan = scan->next) { JarData *jdata = scan->data; char *pack_path; char *old_link; char *link_name; int retval; pack_path = build_uri (tmp_dir, jdata->package_minus_one_level, NULL); if (! make_directory_tree_from_path (pack_path, 0755, NULL)) { g_free (pack_path); continue; } old_link = build_uri (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_free (pack_path); } if (zip_list != NULL) parent_class->add (comm, NULL, zip_list, base_dir, update, FALSE); if (jar_list != NULL) parent_class->add (comm, NULL, jar_list, tmp_dir, update, FALSE); 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); } path_list_free (jardata_list); path_list_free (jar_list); path_list_free (zip_list); g_free (tmp_dir); }
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 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 gchar *thumb_loader_std_cache_path(ThumbLoaderStd *tl, gint local, GdkPixbuf *pixbuf, gint fail) { #if 0 gchar *result = NULL; gchar *cache_base; #endif const gchar *folder_size; #if 0 const gchar *uri; gchar *md5_text; guchar digest[16]; #endif gint w, h; if (!tl->source_path || !tl->thumb_uri) return NULL; if (pixbuf) { w = gdk_pixbuf_get_width(pixbuf); h = gdk_pixbuf_get_height(pixbuf); } else { w = tl->requested_width; h = tl->requested_height; } if (fail) { folder_size = THUMB_FOLDER_FAIL; } else if (w > THUMB_SIZE_NORMAL || h > THUMB_SIZE_NORMAL) { folder_size = THUMB_FOLDER_LARGE; } else { folder_size = THUMB_FOLDER_NORMAL; } return thumb_std_cache_path(tl->source_path, (local) ? tl->local_uri : tl->thumb_uri, local, folder_size); #if 0 if (local) { gchar *base; base = remove_level_from_path(tl->source_path); cache_base = g_strconcat(base, "/", THUMB_FOLDER, "/", folder_size, NULL); g_free(base); } else { cache_base = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", folder_size, NULL); } uri = (local) ? tl->local_uri : tl->thumb_uri; md5_get_digest(uri, strlen(uri), digest); md5_text = md5_digest_to_text(digest); if (cache_base && md5_text) { result = g_strconcat(cache_base, "/", md5_text, THUMB_NAME_EXTENSION, NULL); } g_free(cache_base); g_free(md5_text); return result; #endif }
static EditorFlags editor_command_one(const EditorDescription *editor, GList *list, EditorData *ed) { gchar *command; FileData *fd = (ed->flags & EDITOR_NO_PARAM) ? NULL : list->data;; GPid pid; gint standard_output; gint standard_error; gboolean ok; ed->pid = -1; ed->flags = editor->flags; ed->flags |= editor_command_parse(editor, list, TRUE, &command); ok = !EDITOR_ERRORS(ed->flags); if (ok) { ok = (options->shell.path && *options->shell.path); if (!ok) log_printf("ERROR: empty shell command\n"); if (ok) { ok = (access(options->shell.path, X_OK) == 0); if (!ok) log_printf("ERROR: cannot execute shell command '%s'\n", options->shell.path); } if (!ok) ed->flags |= EDITOR_ERROR_CANT_EXEC; } if (ok) { gchar *working_directory; gchar *args[4]; guint n = 0; working_directory = fd ? remove_level_from_path(fd->path) : g_strdup(ed->working_directory); args[n++] = options->shell.path; if (options->shell.options && *options->shell.options) args[n++] = options->shell.options; args[n++] = command; args[n] = NULL; if ((ed->flags & EDITOR_DEST) && fd->change && fd->change->dest) /* FIXME: error handling */ { g_setenv("GEEQIE_DESTINATION", fd->change->dest, TRUE); } else { g_unsetenv("GEEQIE_DESTINATION"); } ok = g_spawn_async_with_pipes(working_directory, args, NULL, G_SPAWN_DO_NOT_REAP_CHILD, /* GSpawnFlags */ NULL, NULL, &pid, NULL, ed->vd ? &standard_output : NULL, ed->vd ? &standard_error : NULL, NULL); g_free(working_directory); if (!ok) ed->flags |= EDITOR_ERROR_CANT_EXEC; } if (ok) { g_child_watch_add(pid, editor_child_exit_cb, ed); ed->pid = pid; } if (ed->vd) { if (!ok) { gchar *buf; buf = g_strdup_printf(_("Failed to run command:\n%s\n"), editor->file); editor_verbose_window_fill(ed->vd, buf, strlen(buf)); g_free(buf); } else { GIOChannel *channel_output; GIOChannel *channel_error; channel_output = g_io_channel_unix_new(standard_output); g_io_channel_set_flags(channel_output, G_IO_FLAG_NONBLOCK, NULL); g_io_channel_set_encoding(channel_output, NULL, NULL); g_io_add_watch_full(channel_output, G_PRIORITY_HIGH, G_IO_IN | G_IO_ERR | G_IO_HUP, editor_verbose_io_cb, ed, NULL); g_io_channel_unref(channel_output); channel_error = g_io_channel_unix_new(standard_error); g_io_channel_set_flags(channel_error, G_IO_FLAG_NONBLOCK, NULL); g_io_channel_set_encoding(channel_error, NULL, NULL); g_io_add_watch_full(channel_error, G_PRIORITY_HIGH, G_IO_IN | G_IO_ERR | G_IO_HUP, editor_verbose_io_cb, ed, NULL); g_io_channel_unref(channel_error); } } g_free(command); return EDITOR_ERRORS(ed->flags); }
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); }