Loading src/filelist.c +28 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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 src/filelist.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading src/options.c +18 −3 Original line number Diff line number Diff line Loading @@ -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, '/'); Loading Loading
src/filelist.c +28 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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
src/filelist.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
src/options.c +18 −3 Original line number Diff line number Diff line Loading @@ -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, '/'); Loading