예제 #1
0
/* 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;
}
예제 #2
0
파일: copy.c 프로젝트: DeforaOS/Browser
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;
}
예제 #3
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;
}