/* browser_vfs_mime_type */ char const * browser_vfs_mime_type(Mime * mime, char const * filename, mode_t mode) { char const * ret = NULL; struct stat st; struct stat pst; char * p = NULL; if(mode == 0 && filename != NULL && browser_vfs_lstat(filename, &st) == 0) mode = st.st_mode; if(S_ISDIR(mode)) { /* look for mountpoints */ if(filename != NULL && (p = strdup(filename)) != NULL && browser_vfs_lstat(filename, &st) == 0 && browser_vfs_lstat(dirname(p), &pst) == 0 && (st.st_dev != pst.st_dev || st.st_ino == pst.st_ino)) ret = "inode/mountpoint"; else ret = "inode/directory"; free(p); return ret; } else if(S_ISBLK(mode)) return "inode/blockdevice"; else if(S_ISCHR(mode)) return "inode/chardevice"; else if(S_ISFIFO(mode)) return "inode/fifo"; else if(S_ISLNK(mode)) return "inode/symlink"; #ifdef S_ISSOCK else if(S_ISSOCK(mode)) return "inode/socket"; #endif if(mime != NULL && filename != NULL) ret = mime_type(mime, filename); if(ret == NULL && (mode & S_IXUSR) != 0) ret = "application/x-executable"; return ret; }
static int _copy_single(Copy * copy, char const * src, char const * dst) { int ret; char * p; struct stat st; struct stat st2; guint timeout; if((p = g_filename_to_utf8(src, -1, NULL, NULL, NULL)) != NULL) gtk_label_set_text(GTK_LABEL(copy->flabel), p); else gtk_label_set_text(GTK_LABEL(copy->flabel), src); free(p); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(copy->fprogress), 0.0); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(copy->fprogress), ""); if(*(copy->prefs) & PREFS_P) { /* do not follow symlinks */ if(browser_vfs_lstat(src, &st) != 0 && errno == ENOENT) return _copy_filename_error(copy, src, 1); } else if(browser_vfs_stat(src, &st) != 0 && errno == ENOENT) /* follow symlinks */ return _copy_filename_error(copy, src, 1); if(browser_vfs_lstat(dst, &st2) == 0) { if(st.st_dev == st2.st_dev && st.st_ino == st2.st_ino) { fprintf(stderr, "%s: %s: \"%s\"%s\n", PROGNAME_COPY, dst, src, _(" is identical (not copied)")); return 0; } if(*(copy->prefs) & PREFS_i && _copy_filename_confirm(copy, dst) != 1) return 0; if(unlink(dst) != 0) return _copy_filename_error(copy, dst, 1); } if(S_ISDIR(st.st_mode)) ret = _single_dir(copy, src, dst, st.st_mode & 0777); else if(S_ISFIFO(st.st_mode)) ret = _single_fifo(copy, dst, st.st_mode & 0666); else if(S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) ret = _single_nod(copy, src, dst, st.st_mode, st.st_rdev); else if(S_ISLNK(st.st_mode)) ret = _single_symlink(copy, src, dst); else if(S_ISREG(st.st_mode)) { ret = _single_regular(copy, src, dst, st.st_mode & 0777); timeout = g_timeout_add(250, _single_timeout, copy); gtk_main(); /* XXX ugly */ g_source_remove(timeout); } else { errno = ENOSYS; return _copy_error(copy, src, 1); } if(ret != 0) return ret; if(*(copy->prefs) & PREFS_p) /* XXX TOCTOU */ _single_p(copy, dst, &st); return 0; }
static GdkPixbuf * _mime_icon_folder(Mime * mime, char const * filename, struct stat * lst, struct stat * st, int size) { GdkPixbuf * ret = NULL; char const * icon = NULL; struct stat ls; struct stat ps; char * p; size_t i; struct { char const * name; char const * icon; } name_icon[] = { { "DCIM", "folder-pictures" }, { "Desktop", "user-desktop" }, { "Documents", "folder-documents" }, { "Download", "folder-download" }, { "Downloads", "folder-download" }, { "Music", "folder-music" }, { "Pictures", "folder-pictures" }, { "public_html","folder-publicshare" }, { "Templates", "folder-templates" }, { "Video", "folder-videos" }, { "Videos", "folder-videos" }, }; GtkIconTheme * icontheme; const unsigned int flags = GTK_ICON_LOOKUP_FORCE_SIZE; if(lst == NULL && browser_vfs_lstat(filename, &ls) == 0) lst = &ls; /* check if the folder is special */ if((p = strdup(filename)) != NULL && (lst == NULL || !S_ISLNK(lst->st_mode)) && st != NULL && browser_vfs_lstat(dirname(p), &ps) == 0) { if(st->st_dev != ps.st_dev || st->st_ino == ps.st_ino) icon = "mount-point"; else if(_mime_icon_folder_is_home(st)) icon = "folder_home"; else if(_mime_icon_folder_in_home(&ps)) /* check if the folder is special */ for(i = 0; i < sizeof(name_icon) / sizeof(*name_icon); i++) if(strcasecmp(basename(p), name_icon[i].name) == 0) { icon = name_icon[i].icon; break; } } free(p); if(icon != NULL) { icontheme = gtk_icon_theme_get_default(); ret = gtk_icon_theme_load_icon(icontheme, icon, size, flags, NULL); } /* generic fallback */ if(ret == NULL) mime_icons(mime, "inode/directory", size, &ret, -1); return ret; }