Commit 9ba35b0c authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Handle URL-encoded components in "feh --start-at file://...."

Closes #584
parent 9353845a
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -28,6 +28,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <libexif/exif-data.h>
#endif

#ifdef HAVE_LIBCURL
#include <curl/curl.h>
#endif

#include "feh.h"
#include "filelist.h"
#include "signals.h"
@@ -678,3 +682,27 @@ void feh_save_filelist()
	free(tmpname);
	return;
}

#ifdef HAVE_LIBCURL

char *feh_http_unescape(char *url)
{
	CURL *curl = curl_easy_init();
	if (!curl) {
		return NULL;
	}
	char *tmp_url = curl_easy_unescape(curl, url, 0, NULL);
	char *new_url = estrdup(tmp_url);
	curl_free(tmp_url);
	curl_easy_cleanup(curl);
	return new_url;
}

#else

char *feh_http_unescape(char *url)
{
	return NULL;
}

#endif
+1 −0
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ gib_list *feh_read_filelist(char *filename);
char *feh_absolute_path(char *path);
gib_list *feh_file_remove_from_list(gib_list * list, gib_list * l);
void feh_save_filelist();
char *feh_http_unescape(char * url);

int feh_cmp_name(void *file1, void *file2);
int feh_cmp_dirname(void *file1, void *file2);
+18 −3
Original line number Diff line number Diff line
@@ -855,11 +855,26 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun)
		 */
		if (opt.start_list_at && path_is_url(opt.start_list_at) && (strlen(opt.start_list_at) <= 8 || strncmp(opt.start_list_at, "file:///", 8) != 0)) {
			add_file_to_filelist_recursively(opt.start_list_at, FILELIST_FIRST);
		/*
		 * Otherwise, make "feh --start-at dir/file.jpg" behave like
		 * "feh --start-at dir/file.jpg dir".
		 */
		} else if (opt.start_list_at && strrchr(opt.start_list_at, '/')) {
			/*
			 * feh can't candle urlencoded path components ("some%20dir" etc).
			 * Use libcurl to unescape them if --start-at is file://...
			 */
			if (strlen(opt.start_list_at) > 8 && strncmp(opt.start_list_at, "file:///", 8) == 0) {
				char *start_at_path = estrdup(opt.start_list_at + 7);
				char *unescaped_path = feh_http_unescape(opt.start_list_at);
				if (unescaped_path != NULL) {
					free(opt.start_list_at);
				opt.start_list_at = start_at_path;
					opt.start_list_at = estrdup(unescaped_path + 7);
					free(unescaped_path);
				} else {
					char *new_path = estrdup(opt.start_list_at + 7);
					free(opt.start_list_at);
					opt.start_list_at = new_path;
				}
			}
			char *target_directory = estrdup(opt.start_list_at);
			char *filename_start = strrchr(target_directory, '/');