gint pan_is_link_loop(const gchar *s) { gchar *sl; struct stat st; gint ret = FALSE; sl = path_from_utf8(s); if (lstat(sl, &st) == 0 && S_ISLNK(st.st_mode)) { gchar *buf; gint l; buf = g_malloc(st.st_size + 1); l = readlink(sl, buf, st.st_size); if (l == st.st_size) { buf[l] = '\0'; parse_out_relatives(buf); l = strlen(buf); parse_out_relatives(sl); if (buf[0] == '/') { if (strncmp(sl, buf, l) == 0 && (sl[l] == '\0' || sl[l] == '/' || l == 1)) ret = TRUE; } else { gchar *link_path; link_path = concat_dir_and_file(sl, buf); parse_out_relatives(link_path); if (strncmp(sl, link_path, l) == 0 && (sl[l] == '\0' || sl[l] == '/' || l == 1)) ret = TRUE; g_free(link_path); } } g_free(buf); } g_free(sl); return ret; }
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 void cache_manager_render_start_cb(GenericDialog *fd, gpointer data) { CleanData *cd = data; gchar *path; if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return; path = remove_trailing_slash((gtk_entry_get_text(GTK_ENTRY(cd->entry)))); parse_out_relatives(path); if (!isdir(path)) { warning_dialog(_("Invalid folder"), _("The specified folder can not be found."), GTK_STOCK_DIALOG_WARNING, cd->gd->dialog); } else { FileData *dir_fd; gtk_widget_set_sensitive(cd->group, FALSE); gtk_widget_set_sensitive(cd->button_start, FALSE); gtk_widget_set_sensitive(cd->button_stop, TRUE); gtk_widget_set_sensitive(cd->button_close, FALSE); spinner_set_interval(cd->spinner, SPINNER_SPEED); dir_fd = file_data_new_dir(path); cache_manager_render_folder(cd, dir_fd); file_data_unref(dir_fd); while (cache_manager_render_file(cd)); } g_free(path); }
static void layout_path_entry_cb(const gchar *path, gpointer data) { LayoutWindow *lw = data; gchar *buf; buf = g_strdup(path); parse_out_relatives(buf); layout_set_path(lw, buf); g_free(buf); }