Commit facb67f8 authored by Christian Hesse's avatar Christian Hesse
Browse files

global initialization for libmagic

Add a global `magic_t magic` and initialize it just once.

Also `feh_is_image()` now calls itself to check compressed files, saving
some duplicate code.
parent 4affafe9
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -145,6 +145,10 @@ void init_slideshow_mode(void);
void init_list_mode(void);
void init_loadables_mode(void);
void init_unloadables_mode(void);
#ifdef HAVE_LIBMAGIC
void uninit_magic(void);
void init_magic(void);
#endif
void feh_clean_exit(void);
int feh_should_ignore_image(Imlib_Image * im);
int feh_load_image(Imlib_Image * im, feh_file * file);
+54 −40
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

#ifdef HAVE_LIBMAGIC
#include <magic.h>

magic_t magic = NULL;
#endif

Display *disp = NULL;
@@ -239,6 +241,33 @@ void feh_print_load_error(char *file, winwidget w, Imlib_Load_Error err, enum fe
	}
}

#ifdef HAVE_LIBMAGIC
void uninit_magic(void)
{
	if (!magic) {
		return;
	}

	magic_close(magic);
	magic = NULL;
}
void init_magic(void)
{
	if (getenv("FEH_SKIP_MAGIC")) {
		return;
	}

	if (!(magic = magic_open(MAGIC_NONE))) {
		weprintf("unable to initialize magic library\n");
		return;
	}

	if (magic_load(magic, NULL) != 0) {
		weprintf("cannot load magic database: %s\n", magic_error(magic));
		uninit_magic();
	}
}

/*
 * This is a workaround for an Imlib2 regression, causing unloadable image
 * detection to be excessively slow (and, thus, causing feh to hang for a while
@@ -247,62 +276,47 @@ void feh_print_load_error(char *file, winwidget w, Imlib_Load_Error err, enum fe
 * <https://phab.enlightenment.org/T8739> and
 * <https://github.com/derf/feh/issues/505>.
 */
int feh_is_image(feh_file * file)
int feh_is_image(feh_file * file, int magic_flags)
{
#ifdef HAVE_LIBMAGIC
	magic_t magic;
	const char * mime_type;
	int is_image = 0;
	const char * mime_type = NULL;

	if (getenv("FEH_SKIP_MAGIC")) {
	if (!magic) {
		return 1;
	}

	if (!(magic = magic_open(MAGIC_MIME_TYPE | MAGIC_SYMLINK))) {
		weprintf("unable to initialize magic library\n");
		return 0;
	}
	magic_setflags(magic, MAGIC_MIME_TYPE | MAGIC_SYMLINK | magic_flags);
	mime_type = magic_file(magic, file->filename);

	if (magic_load(magic, NULL) != 0) {
		weprintf("cannot load magic database: %s\n", magic_error(magic));
		magic_close(magic);
	if (!mime_type) {
		return 0;
	}

	mime_type = magic_file(magic, file->filename);

	if (mime_type) {
	D(("file %s has mime type: %s\n", file->filename, mime_type));

	if (strncmp(mime_type, "image/", 6) == 0) {
			is_image = 1;
		return 1;
	}

	/* no infinite loop on compressed content, please */
	if (magic_flags) {
		return 0;
	}

	/* imlib2 supports loading compressed images, let's have a look inside */
	if (strcmp(mime_type, "application/gzip") == 0 ||
	    strcmp(mime_type, "application/x-bzip2") == 0 ||
	    strcmp(mime_type, "application/x-xz") == 0) {
			magic_setflags(magic, magic_getflags(magic) | MAGIC_COMPRESS);
			mime_type = magic_file(magic, file->filename);

			if (mime_type) {
				D(("uncompressed file %s has mime type: %s\n", file->filename, mime_type));

				if (strncmp(mime_type, "image/", 6) == 0) {
					is_image = 1;
				}
		return feh_is_image(file, MAGIC_COMPRESS);
	}
		}
	}

	magic_close(magic);

	return is_image;
	return 0;
}
#else
	(void)file;
int feh_is_image(__attribute__((unused)) feh_file * file, __attribute__((unused)) int magic_flags)
{
	return 1;
#endif
}
#endif

int feh_load_image(Imlib_Image * im, feh_file * file)
{
@@ -326,7 +340,7 @@ int feh_load_image(Imlib_Image * im, feh_file * file)
		}
	}
	else {
		if (feh_is_image(file)) {
		if (feh_is_image(file, 0)) {
			*im = imlib_load_image_with_error_return(file->filename, &err);
		} else {
			feh_err = LOAD_ERROR_MAGICBYTES;
+8 −0
Original line number Diff line number Diff line
@@ -69,6 +69,10 @@ int main(int argc, char **argv)
#endif
	}

#ifdef HAVE_LIBMAGIC
	init_magic();
#endif

	feh_event_init();

	if (opt.index)
@@ -262,6 +266,10 @@ void feh_clean_exit(void)
	if(disp)
		XCloseDisplay(disp);

#ifdef HAVE_LIBMAGIC
	uninit_magic();
#endif

	/*
	 * Only restore the old terminal settings if
	 * - we changed them in the first place