This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository legacy-imlib2.

View the commit online.

commit e55208f4d67f4516af7fc5cb281d7e3b270f5750
Author: Kim Woelders <[email protected]>
AuthorDate: Sun Mar 27 10:28:03 2022 +0200

    loading: Introduce __imlib_ImageFileContextPush/Pop()
    
    Makes dealing with nested file contexts much easier.
---
 src/lib/Imlib2_Loader.h               |  12 ++-
 src/lib/image.c                       | 158 ++++++++++++++++++++++------------
 src/lib/image.h                       |  19 ++--
 src/modules/loaders/decompress_load.c |   9 +-
 src/modules/loaders/loader_argb.c     |  11 +--
 src/modules/loaders/loader_bmp.c      |  11 +--
 src/modules/loaders/loader_ff.c       |  11 +--
 src/modules/loaders/loader_gif.c      |   7 +-
 src/modules/loaders/loader_heif.c     |  11 +--
 src/modules/loaders/loader_ico.c      |  10 ++-
 src/modules/loaders/loader_id3.c      |   8 +-
 src/modules/loaders/loader_j2k.c      |  14 +--
 src/modules/loaders/loader_jpeg.c     |   9 +-
 src/modules/loaders/loader_jxl.c      |   7 +-
 src/modules/loaders/loader_lbm.c      |   7 +-
 src/modules/loaders/loader_png.c      |  13 +--
 src/modules/loaders/loader_pnm.c      |   9 +-
 src/modules/loaders/loader_ps.c       |   7 +-
 src/modules/loaders/loader_svg.c      |   9 +-
 src/modules/loaders/loader_tga.c      |  19 ++--
 src/modules/loaders/loader_tiff.c     |  13 +--
 src/modules/loaders/loader_webp.c     |  11 +--
 src/modules/loaders/loader_xbm.c      |  15 ++--
 src/modules/loaders/loader_xpm.c      |   9 +-
 24 files changed, 242 insertions(+), 167 deletions(-)

diff --git a/src/lib/Imlib2_Loader.h b/src/lib/Imlib2_Loader.h
index 8808711..4dccfdc 100644
--- a/src/lib/Imlib2_Loader.h
+++ b/src/lib/Imlib2_Loader.h
@@ -114,6 +114,13 @@ unsigned int        __imlib_time_us(void);
 #define LOAD_BADIMAGE   -3      /* Image is corrupt                    */
 #define LOAD_BADFRAME   -4      /* Requested frame not found           */
 
+typedef struct _ImlibImageFileInfo {
+   struct _ImlibImageFileInfo *next;
+   char               *name;
+   FILE               *fp;
+   off_t               fsize;
+} ImlibImageFileInfo;
+
 typedef struct _imlibldctx ImlibLdCtx;
 
 typedef struct _ImlibImageTag {
@@ -125,10 +132,7 @@ typedef struct _ImlibImageTag {
 } ImlibImageTag;
 
 struct _ImlibImage {
-   char               *real_file;
-   FILE               *fp;
-   off_t               fsize;
-
+   ImlibImageFileInfo *fi;
    ImlibLdCtx         *lc;
 
    int                 w, h;
diff --git a/src/lib/image.c b/src/lib/image.c
index ac1222c..a7844b2 100644
--- a/src/lib/image.c
+++ b/src/lib/image.c
@@ -74,6 +74,77 @@ __imlib_ReplaceData(ImlibImage * im, unsigned int *new_data)
    im->data_memory_func = NULL;
 }
 
+static int
+__imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp, off_t fsize)
+{
+   struct stat         st;
+
+   if (fp)
+     {
+        fi->keep_fp = true;
+        fi->fp = fp;
+     }
+   else
+     {
+        fi->fp = fopen(fi->name, "rb");
+        if (!fi->fp)
+           return -1;
+     }
+
+   if (fi->fsize == 0)
+     {
+        if (fsize == 0)
+          {
+             __imlib_FileStat(fi->name, &st);
+             fsize = st.st_size;
+          }
+        fi->fsize = fsize;
+     }
+
+   return 0;
+}
+
+static void
+__imlib_FileContextClose(ImlibImageFileInfo * fi)
+{
+   if (!fi->keep_fp)
+     {
+        if (fi->fp)
+          {
+             fclose(fi->fp);
+             fi->fp = NULL;
+          }
+     }
+}
+
+static int
+__imlib_ImageFileContextPush(ImlibImage * im, bool load, char *file)
+{
+   ImlibImageFileInfo *fi;
+
+   fi = calloc(1, sizeof(ImlibImageFileInfo));
+   if (!fi)
+      return -1;
+
+   fi->name = file;             /* file must have been alloced, will be freed */
+
+   fi->next = im->fi;
+   im->fi = fi;
+
+   return 0;
+}
+
+static void
+__imlib_ImageFileContextPop(ImlibImage * im)
+{
+   ImlibImageFileInfo *fi = im->fi;
+
+   im->fi = fi->next;
+
+   free(fi->name);
+   free(fi);
+}
+
 /* create an image data struct and fill it in */
 static ImlibImage  *
 __imlib_ProduceImage(void)
@@ -96,14 +167,16 @@ __imlib_ConsumeImage(ImlibImage * im)
 
    __imlib_FreeAllTags(im);
 
-   if (im->real_file && im->real_file != im->file)
-      free(im->real_file);
-   free(im->file);
+   if (im->fi && im->fi->name && im->fi->name != im->file)
+      free(im->file);
    free(im->key);
    if (im->data && !IM_FLAG_ISSET(im, F_DONT_FREE_DATA))
       __imlib_FreeData(im);
    free(im->format);
 
+   if (im->fi)
+      __imlib_ImageFileContextPop(im);
+
    free(im);
 }
 
@@ -127,7 +200,7 @@ __imlib_FindCachedImage(const char *file, int frame)
                   im->next = images;
                   images = im;
                }
-             DP(" got %p: '%s' frame %d\n", im, im->real_file, im->frame_num);
+             DP(" got %p: '%s' frame %d\n", im, im->fi->name, im->frame_num);
              return im;
           }
      }
@@ -139,7 +212,7 @@ __imlib_FindCachedImage(const char *file, int frame)
 static void
 __imlib_AddImageToCache(ImlibImage * im)
 {
-   DP("%s: %p: '%s' frame %d\n", __func__, im, im->real_file, im->frame_num);
+   DP("%s: %p: '%s' frame %d\n", __func__, im, im->fi->name, im->frame_num);
    im->next = images;
    images = im;
 }
@@ -151,7 +224,7 @@ __imlib_RemoveImageFromCache(ImlibImage * im_del)
    ImlibImage         *im, *im_prev;
 
    im = im_del;
-   DP("%s: %p: '%s' frame %d\n", __func__, im, im->real_file, im->frame_num);
+   DP("%s: %p: '%s' frame %d\n", __func__, im, im->fi->name, im->frame_num);
 
    for (im = images, im_prev = NULL; im; im_prev = im, im = im->next)
      {
@@ -278,7 +351,7 @@ __imlib_LoadImageWrapper(const ImlibLoader * l, ImlibImage * im, int load_data)
    int                 rc;
 
    DP("%s: fmt='%s' file='%s'(%s), imm=%d\n", __func__,
-      l->name, im->file, im->real_file, load_data);
+      l->name, im->file, im->fi->name, load_data);
 
 #if IMLIB2_DEBUG
    unsigned int        t0 = __imlib_time_us();
@@ -286,22 +359,10 @@ __imlib_LoadImageWrapper(const ImlibLoader * l, ImlibImage * im, int load_data)
 
    if (l->module->load)
      {
-        FILE               *fp = NULL;
-
-        if (!im->fp)
-          {
-             fp = im->fp = fopen(im->real_file, "rb");
-             if (!im->fp)
-                return 0;
-          }
-
         if (!im->format)
            im->format = strdup(l->name);
 
         rc = l->module->load(im, load_data);
-
-        if (fp)
-           fclose(fp);
      }
    else
      {
@@ -309,7 +370,7 @@ __imlib_LoadImageWrapper(const ImlibLoader * l, ImlibImage * im, int load_data)
      }
 
    DP("%s: %-4s: %s: Elapsed time: %.3f ms\n", __func__,
-      l->name, im->file, 1e-3 * (__imlib_time_us() - t0));
+      l->name, im->fi->name, 1e-3 * (__imlib_time_us() - t0));
 
    if (rc <= LOAD_FAIL)
      {
@@ -389,7 +450,7 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
 
                   current_modified_time = ila->fp ?
                      __imlib_FileModDateFd(fileno(ila->fp)) :
-                     __imlib_FileModDate(im->real_file);
+                     __imlib_FileModDate(im->fi->name);
                   /* if the file on disk is newer than the cached one */
                   if (current_modified_time != im->moddate)
                     {
@@ -450,17 +511,11 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
    /* so produce a new one and load an image into that */
    im = __imlib_ProduceImage();
    im->file = strdup(file);
-   im->fsize = st.st_size;
-   im->real_file = im_file ? im_file : im->file;
    im->key = im_key;
    im->frame_num = ila->frame;
 
-   if (ila->fp)
-      im->fp = ila->fp;
-   else
-      im->fp = fopen(im->real_file, "rb");
-
-   if (!im->fp)
+   if (__imlib_ImageFileContextPush(im, true, im_file ? im_file : im->file) ||
+       __imlib_FileContextOpen(im->fi, ila->fp, st.st_size))
      {
         ila->err = errno;
         __imlib_ConsumeImage(im);
@@ -478,7 +533,7 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
      }
 
    /* take a guess by extension on the best loader to use */
-   best_loader = __imlib_FindBestLoader(im->real_file, NULL, 0);
+   best_loader = __imlib_FindBestLoader(im->fi->name, NULL, 0);
 
    loader_ret = LOAD_FAIL;
    loaders = NULL;
@@ -527,8 +582,8 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
 
           case LOAD_FAIL:
              /* Image was not recognized by loader - try next */
-             fflush(im->fp);
-             rewind(im->fp);
+             fflush(im->fi->fp);
+             rewind(im->fi->fp);
              continue;
 
           default:             /* We should not go here */
@@ -548,8 +603,7 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
    im->lc = NULL;
 
    if (!ila->fp)
-      fclose(im->fp);
-   im->fp = NULL;
+      __imlib_FileContextClose(im->fi);
 
    if (loader_ret <= LOAD_FAIL)
      {
@@ -585,8 +639,13 @@ __imlib_LoadImageData(ImlibImage * im)
    if (!im->loader)
       return IMLIB_ERR_INTERNAL;
 
+   err = __imlib_FileContextOpen(im->fi, NULL, 0);
+   if (err)
+      return err;
    err = __imlib_LoadImageWrapper(im->loader, im, 1);
 
+   __imlib_FileContextClose(im->fi);
+
    return __imlib_LoadErrorToErrno(err, 0);
 }
 
@@ -595,29 +654,19 @@ __imlib_LoadEmbedded(ImlibLoader * l, ImlibImage * im, const char *file,
                      int load_data)
 {
    int                 rc;
-   struct stat         st;
-   char               *file_save;
-   FILE               *fp_save;
-   off_t               fsize_save;
 
    if (!l || !im)
       return 0;
 
-   /* remember the original filename */
-   file_save = im->real_file;
-   im->real_file = strdup(file);
-   fp_save = im->fp;
-   im->fp = NULL;
-   fsize_save = im->fsize;
-   __imlib_FileStat(file, &st);
-   im->fsize = st.st_size;
+   __imlib_ImageFileContextPush(im, true, strdup(file));
+   rc = __imlib_FileContextOpen(im->fi, NULL, 0);
+   if (rc)
+      return LOAD_FAIL;
 
    rc = __imlib_LoadImageWrapper(l, im, load_data);
 
-   im->fp = fp_save;
-   free(im->real_file);
-   im->real_file = file_save;
-   im->fsize = fsize_save;
+   __imlib_FileContextClose(im->fi);
+   __imlib_ImageFileContextPop(im);
 
    return rc;
 }
@@ -720,7 +769,6 @@ void
 __imlib_SaveImage(ImlibImage * im, const char *file, ImlibLoadArgs * ila)
 {
    ImlibLoader        *l;
-   char               *pfile;
    ImlibLdCtx          ilc;
    int                 loader_ret;
 
@@ -742,16 +790,12 @@ __imlib_SaveImage(ImlibImage * im, const char *file, ImlibLoadArgs * ila)
    if (ila->pfunc)
       __imlib_LoadCtxInit(im, &ilc, ila->pfunc, ila->pgran);
 
-   /* set the filename to the user supplied one */
-   pfile = im->real_file;
-   im->real_file = strdup(file);
+   __imlib_ImageFileContextPush(im, false, strdup(file));
 
    /* call the saver */
    loader_ret = l->module->save(im);
 
-   /* set the filename back to the laoder image filename */
-   free(im->real_file);
-   im->real_file = pfile;
+   __imlib_ImageFileContextPop(im);
 
    im->lc = NULL;
 
diff --git a/src/lib/image.h b/src/lib/image.h
index e3989a0..b2dee40 100644
--- a/src/lib/image.h
+++ b/src/lib/image.h
@@ -7,8 +7,6 @@
 
 #include "types.h"
 
-typedef struct _imlibldctx ImlibLdCtx;
-
 typedef void        (*ImlibDataDestructorFunction)(ImlibImage * im, void *data);
 typedef void       *(*ImlibImageDataMemoryFunction)(void *, size_t size);
 
@@ -28,6 +26,18 @@ typedef int         (*ImlibProgressFunction)(ImlibImage * im, char percent,
 #define FF_FRAME_DISPOSE_CLEAR  (1 << 2)        /* Clear before rendering next frame  */
 #define FF_FRAME_DISPOSE_PREV   (1 << 3)        /* Revert before rendering next frame */
 
+typedef struct _ImlibImageFileInfo {
+   struct _ImlibImageFileInfo *next;
+   char               *name;
+   FILE               *fp;
+   off_t               fsize;
+   /* vvv Private vvv */
+   char                keep_fp;
+   /* ^^^ Private ^^^ */
+} ImlibImageFileInfo;
+
+typedef struct _imlibldctx ImlibLdCtx;
+
 typedef struct {
    int                 left, right, top, bottom;
 } ImlibBorder;
@@ -41,10 +51,7 @@ typedef struct _ImlibImageTag {
 } ImlibImageTag;
 
 struct _ImlibImage {
-   char               *real_file;
-   FILE               *fp;
-   off_t               fsize;
-
+   ImlibImageFileInfo *fi;
    ImlibLdCtx         *lc;
 
    int                 w, h;
diff --git a/src/modules/loaders/decompress_load.c b/src/modules/loaders/decompress_load.c
index aeca4a9..a65a977 100644
--- a/src/modules/loaders/decompress_load.c
+++ b/src/modules/loaders/decompress_load.c
@@ -17,7 +17,7 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
 
    /* make sure this file ends in a known name and that there's another ext
     * (e.g. "foo.png.bz2") */
-   for (p = s = im->real_file, q = NULL; *s; s++)
+   for (p = s = im->fi->name, q = NULL; *s; s++)
      {
         if (*s != '.' && *s != '/')
            continue;
@@ -47,14 +47,15 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
    if (!loader)
       return rc;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
    if ((dest = mkstemp(tmp)) < 0)
       QUIT_WITH_RC(LOAD_OOM);
 
-   res = fdec(fdata, im->fsize, dest);
+   res = fdec(fdata, im->fi->fsize, dest);
 
    close(dest);
 
@@ -64,7 +65,7 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
    unlink(tmp);
 
  quit:
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_argb.c b/src/modules/loaders/loader_argb.c
index c66e923..f54061e 100644
--- a/src/modules/loaders/loader_argb.c
+++ b/src/modules/loaders/loader_argb.c
@@ -50,16 +50,17 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
-   mm_init(fdata, im->fsize);
+   mm_init(fdata, im->fi->fsize);
 
    /* header */
 
    fptr = fdata;
-   size = im->fsize > 31 ? 31 : im->fsize;      /* Look for \n in at most 31 byte */
+   size = im->fi->fsize > 31 ? 31 : im->fi->fsize;      /* Look for \n in at most 31 byte */
    row = memchr(fptr, '\n', size);
    if (!row)
       goto quit;
@@ -107,7 +108,7 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_SUCCESS;
 
  quit:
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
@@ -120,7 +121,7 @@ _save(ImlibImage * im)
    uint32_t           *ptr;
    int                 y, alpha = 0;
 
-   f = fopen(im->real_file, "wb");
+   f = fopen(im->fi->name, "wb");
    if (!f)
       return LOAD_FAIL;
 
diff --git a/src/modules/loaders/loader_bmp.c b/src/modules/loaders/loader_bmp.c
index f651112..86378f3 100644
--- a/src/modules/loaders/loader_bmp.c
+++ b/src/modules/loaders/loader_bmp.c
@@ -179,12 +179,13 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
    fptr = fdata;
-   mm_init(fdata, im->fsize);
+   mm_init(fdata, im->fi->fsize);
 
    /* Load header */
 
@@ -194,7 +195,7 @@ _load(ImlibImage * im, int load_data)
    if (bfh.header[0] != 'B' || bfh.header[1] != 'M')
       goto quit;
 
-   size = im->fsize;
+   size = im->fi->fsize;
 #define WORD_LE_32(p8) (((p8)[3] << 24) | ((p8)[2] << 16) | ((p8)[1] << 8) | (p8)[0])
    bfh_offset = WORD_LE_32(bfh.offs);
 
@@ -759,7 +760,7 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_SUCCESS;
 
  quit:
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
@@ -772,7 +773,7 @@ _save(ImlibImage * im)
    int                 i, j, pad;
    uint32_t            pixel;
 
-   f = fopen(im->real_file, "wb");
+   f = fopen(im->fi->name, "wb");
    if (!f)
       return LOAD_FAIL;
 
diff --git a/src/modules/loaders/loader_ff.c b/src/modules/loaders/loader_ff.c
index 4058886..c9f6591 100644
--- a/src/modules/loaders/loader_ff.c
+++ b/src/modules/loaders/loader_ff.c
@@ -6,7 +6,7 @@
 
 static const char  *const _formats[] = { "ff" };
 
-#define mm_check(p) ((const char *)(p) <= (const char *)fdata + im->fsize)
+#define mm_check(p) ((const char *)(p) <= (const char *)fdata + im->fi->fsize)
 
 typedef struct {
    unsigned char       magic[8];
@@ -25,10 +25,11 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   if (im->fsize < (long)sizeof(ff_hdr_t))
+   if (im->fi->fsize < (long)sizeof(ff_hdr_t))
       return rc;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
@@ -82,7 +83,7 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_SUCCESS;
 
  quit:
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
@@ -97,7 +98,7 @@ _save(ImlibImage * im)
    uint16_t           *row;
    uint8_t            *dat;
 
-   f = fopen(im->real_file, "wb");
+   f = fopen(im->fi->name, "wb");
    if (!f)
       return LOAD_FAIL;
 
diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index 0618fad..a152e77 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -68,14 +68,15 @@ _load(ImlibImage * im, int load_data)
    uint32_t            colormap[256];
    int                 fcount, frame, multiframe;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
    rc = LOAD_FAIL;
    rows = NULL;
 
-   mm_init(fdata, im->fsize);
+   mm_init(fdata, im->fi->fsize);
 
 #if GIFLIB_MAJOR >= 5
    gif = DGifOpen(NULL, mm_read, &err);
@@ -301,7 +302,7 @@ _load(ImlibImage * im, int load_data)
    DGifCloseFile(gif);
 #endif
 
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_heif.c b/src/modules/loaders/loader_heif.c
index a751d5d..86bf3db 100644
--- a/src/modules/loaders/loader_heif.c
+++ b/src/modules/loaders/loader_heif.c
@@ -36,15 +36,16 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_FAIL;
 
    /* input data needs to be atleast 12 bytes */
-   if (im->fsize < HEIF_BYTES_TO_CHECK)
+   if (im->fi->fsize < HEIF_BYTES_TO_CHECK)
       return rc;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
    /* check signature */
-   switch (heif_check_filetype(fdata, im->fsize))
+   switch (heif_check_filetype(fdata, im->fi->fsize))
      {
      case heif_filetype_no:
      case heif_filetype_yes_unsupported:
@@ -62,7 +63,7 @@ _load(ImlibImage * im, int load_data)
       goto quit;
 
    error = heif_context_read_from_memory_without_copy(ctx, fdata,
-                                                      im->fsize, NULL);
+                                                      im->fi->fsize, NULL);
    if (error.code != heif_error_Ok)
       goto quit;
 
@@ -155,7 +156,7 @@ _load(ImlibImage * im, int load_data)
    heif_context_free(ctx);
    heif_decoding_options_free(decode_opts);
 
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_ico.c b/src/modules/loaders/loader_ico.c
index 231d19f..20c8666 100644
--- a/src/modules/loaders/loader_ico.c
+++ b/src/modules/loaders/loader_ico.c
@@ -402,11 +402,12 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
-   mm_init(fdata, im->fsize);
+   mm_init(fdata, im->fi->fsize);
 
    ico.ie = NULL;
    if (mm_read(&ico.idir, sizeof(ico.idir)))
@@ -424,7 +425,7 @@ _load(ImlibImage * im, int load_data)
    if (!ico.ie)
       QUIT_WITH_RC(LOAD_OOM);
 
-   D("Loading '%s' Nicons = %d\n", im->real_file, ico.idir.icons);
+   D("Loading '%s' Nicons = %d\n", im->fi->name, ico.idir.icons);
 
    for (i = 0; i < ico.idir.icons; i++)
      {
@@ -443,7 +444,8 @@ _load(ImlibImage * im, int load_data)
 
  quit:
    ico_delete(&ico);
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
+
    return rc;
 }
 
diff --git a/src/modules/loaders/loader_id3.c b/src/modules/loaders/loader_id3.c
index 9c73caa..dcc54c1 100644
--- a/src/modules/loaders/loader_id3.c
+++ b/src/modules/loaders/loader_id3.c
@@ -287,8 +287,8 @@ get_options(lopt * opt, const ImlibImage * im)
      }
    if (handle)
       ctx = context_get(handle);
-   else if (!(ctx = context_get_by_name(im->real_file)) &&
-            !(ctx = context_create(im->real_file, im->fp)))
+   else if (!(ctx = context_get_by_name(im->fi->name)) &&
+            !(ctx = context_create(im->fi->name, im->fi->fp)))
       return 0;
 
    if (!index)
@@ -481,8 +481,8 @@ write_tags(ImlibImage * im, lopt * opt)
             <= id3_tag_get_numframes(opt->ctx->tag)
             && (opt->index + opt->traverse) > 0)
           {
-             buf = (char *)malloc((strlen(im->real_file) + 50) * sizeof(char));
-             sprintf(buf, "%s:index=%d,traverse=%d", im->real_file,
+             buf = (char *)malloc((strlen(im->fi->name) + 50) * sizeof(char));
+             sprintf(buf, "%s:index=%d,traverse=%d", im->fi->name,
                      opt->index + opt->traverse, opt->traverse);
           }
         __imlib_AttachTag(im, "next", 0, buf, destructor_data);
diff --git a/src/modules/loaders/loader_j2k.c b/src/modules/loaders/loader_j2k.c
index 16d98bb..4fa78bd 100644
--- a/src/modules/loaders/loader_j2k.c
+++ b/src/modules/loaders/loader_j2k.c
@@ -108,7 +108,8 @@ _load(ImlibImage * im, int load_data)
    OPJ_INT32          *pa, *pr, *pg, *pb;
    unsigned char       a, r, g, b;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
@@ -118,7 +119,7 @@ _load(ImlibImage * im, int load_data)
    jimage = NULL;
 
    /* Signature check */
-   if (im->fsize < 12)
+   if (im->fi->fsize < 12)
       goto quit;
 
    if (memcmp(fdata, JP2_MAGIC, 4) == 0 ||
@@ -155,8 +156,7 @@ _load(ImlibImage * im, int load_data)
 
    if (getenv("JP2_USE_FILE"))
      {
-        jstream =
-           opj_stream_create_default_file_stream(im->real_file, OPJ_TRUE);
+        jstream = opj_stream_create_default_file_stream(im->fi->name, OPJ_TRUE);
      }
    else
      {
@@ -164,9 +164,9 @@ _load(ImlibImage * im, int load_data)
         if (!jstream)
            goto quit;
 
-        mm_init(fdata, im->fsize);
+        mm_init(fdata, im->fi->fsize);
         opj_stream_set_user_data(jstream, &mdata, NULL);
-        opj_stream_set_user_data_length(jstream, im->fsize);
+        opj_stream_set_user_data_length(jstream, im->fi->fsize);
         opj_stream_set_read_function(jstream, mm_read);
         opj_stream_set_skip_function(jstream, mm_seek_cur);
         opj_stream_set_seek_function(jstream, mm_seek_set);
@@ -275,7 +275,7 @@ _load(ImlibImage * im, int load_data)
       opj_stream_destroy(jstream);
    if (jcodec)
       opj_destroy_codec(jcodec);
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_jpeg.c b/src/modules/loaders/loader_jpeg.c
index 89751f6..5faa648 100644
--- a/src/modules/loaders/loader_jpeg.c
+++ b/src/modules/loaders/loader_jpeg.c
@@ -78,7 +78,8 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return rc;
 
@@ -88,7 +89,7 @@ _load(ImlibImage * im, int load_data)
       QUIT_WITH_RC(LOAD_FAIL);
 
    jpeg_create_decompress(&jds);
-   jpeg_mem_src(&jds, fdata, im->fsize);
+   jpeg_mem_src(&jds, fdata, im->fi->fsize);
    jpeg_save_markers(&jds, JPEG_APP0 + 1, 256);
    jpeg_read_header(&jds, TRUE);
 
@@ -251,7 +252,7 @@ _load(ImlibImage * im, int load_data)
  quit:
    jpeg_destroy_decompress(&jds);
    free(jdata.data);
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
@@ -277,7 +278,7 @@ _save(ImlibImage * im)
 
    rc = LOAD_FAIL;
 
-   f = fopen(im->real_file, "wb");
+   f = fopen(im->fi->name, "wb");
    if (!f)
       goto quit;
 
diff --git a/src/modules/loaders/loader_jxl.c b/src/modules/loaders/loader_jxl.c
index b3d4408..2fc4bee 100644
--- a/src/modules/loaders/loader_jxl.c
+++ b/src/modules/loaders/loader_jxl.c
@@ -55,7 +55,8 @@ _load(ImlibImage * im, int load_data)
    JxlParallelRunner  *runner = NULL;
 #endif
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
@@ -100,7 +101,7 @@ _load(ImlibImage * im, int load_data)
    if (jst != JXL_DEC_SUCCESS)
       goto quit;
 
-   jst = JxlDecoderSetInput(dec, fdata, im->fsize);
+   jst = JxlDecoderSetInput(dec, fdata, im->fi->fsize);
    if (jst != JXL_DEC_SUCCESS)
       goto quit;
 
@@ -213,7 +214,7 @@ _load(ImlibImage * im, int load_data)
 #endif
    if (dec)
       JxlDecoderDestroy(dec);
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_lbm.c b/src/modules/loaders/loader_lbm.c
index ac78537..2f72d0c 100644
--- a/src/modules/loaders/loader_lbm.c
+++ b/src/modules/loaders/loader_lbm.c
@@ -451,7 +451,8 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
@@ -462,7 +463,7 @@ _load(ImlibImage * im, int load_data)
    * Load the chunk(s) we're interested in. If load_data is not true, then we only
    * want the image size and format.
    *----------*/
-   if (!loadchunks(fdata, im->fsize, &ilbm, load_data))
+   if (!loadchunks(fdata, im->fi->fsize, &ilbm, load_data))
       goto quit;
 
    rc = LOAD_BADIMAGE;          /* Format accepted */
@@ -568,7 +569,7 @@ _load(ImlibImage * im, int load_data)
 
    freeilbm(&ilbm);
 
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_png.c b/src/modules/loaders/loader_png.c
index 84cd7d4..b020433 100644
--- a/src/modules/loaders/loader_png.c
+++ b/src/modules/loaders/loader_png.c
@@ -305,10 +305,11 @@ _load(ImlibImage * im, int load_data)
    /* read header */
    rc = LOAD_FAIL;
 
-   if (im->fsize < _PNG_MIN_SIZE)
+   if (im->fi->fsize < _PNG_MIN_SIZE)
       return rc;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
@@ -354,7 +355,7 @@ _load(ImlibImage * im, int load_data)
         len = htonl(chunk->hdr.len);
         D("Scan %3d: %06lx: %6d: %.4s: ", ic,
           fptr - (unsigned char *)fdata, len, chunk->hdr.name);
-        if (fptr + len - (unsigned char *)fdata > im->fsize)
+        if (fptr + len - (unsigned char *)fdata > im->fi->fsize)
            break;
 
         switch (chunk->hdr.type)
@@ -424,7 +425,7 @@ _load(ImlibImage * im, int load_data)
         len = htonl(chunk->hdr.len);
         D("Chunk %3d: %06lx: %6d: %.4s: ", ic,
           fptr - (unsigned char *)fdata, len, chunk->hdr.name);
-        if (fptr + len - (unsigned char *)fdata > im->fsize)
+        if (fptr + len - (unsigned char *)fdata > im->fi->fsize)
            break;
 
         switch (chunk->hdr.type)
@@ -566,7 +567,7 @@ _load(ImlibImage * im, int load_data)
 
  quit:
    png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
@@ -587,7 +588,7 @@ _save(ImlibImage * im)
    int                 pass, n_passes = 1;
    int                 has_alpha;
 
-   f = fopen(im->real_file, "wb");
+   f = fopen(im->fi->name, "wb");
    if (!f)
       return LOAD_FAIL;
 
diff --git a/src/modules/loaders/loader_pnm.c b/src/modules/loaders/loader_pnm.c
index d6d297e..71e35af 100644
--- a/src/modules/loaders/loader_pnm.c
+++ b/src/modules/loaders/loader_pnm.c
@@ -129,11 +129,12 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
-   mm_init(fdata, im->fsize);
+   mm_init(fdata, im->fi->fsize);
 
    /* read the header info */
 
@@ -464,7 +465,7 @@ _load(ImlibImage * im, int load_data)
  quit:
    free(idata);
    free(data);
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
@@ -478,7 +479,7 @@ _save(ImlibImage * im)
    uint32_t           *ptr;
    int                 x, y;
 
-   f = fopen(im->real_file, "wb");
+   f = fopen(im->fi->name, "wb");
    if (!f)
       return LOAD_FAIL;
 
diff --git a/src/modules/loaders/loader_ps.c b/src/modules/loaders/loader_ps.c
index 4e63ddf..2a0cba0 100644
--- a/src/modules/loaders/loader_ps.c
+++ b/src/modules/loaders/loader_ps.c
@@ -24,7 +24,8 @@ _load(ImlibImage * im, int load_data)
    uint32_t           *dst;
    int                 i, j;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
@@ -41,7 +42,7 @@ _load(ImlibImage * im, int load_data)
    if (!spdoc)
       goto quit;
 
-   spectre_document_load(spdoc, im->real_file);
+   spectre_document_load(spdoc, im->fi->name);
    spst = spectre_document_status(spdoc);
    if (spst != SPECTRE_STATUS_SUCCESS)
      {
@@ -137,7 +138,7 @@ _load(ImlibImage * im, int load_data)
       spectre_page_free(sppage);
    if (spdoc)
       spectre_document_free(spdoc);
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_svg.c b/src/modules/loaders/loader_svg.c
index c2cc802..6ff1db3 100644
--- a/src/modules/loaders/loader_svg.c
+++ b/src/modules/loaders/loader_svg.c
@@ -81,7 +81,8 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
@@ -91,10 +92,10 @@ _load(ImlibImage * im, int load_data)
    cr = NULL;
 
    /* Signature check */
-   if (_sig_check(fdata, im->fsize))
+   if (_sig_check(fdata, im->fi->fsize))
       goto quit;
 
-   rsvg = rsvg_handle_new_from_data(fdata, im->fsize, &error);
+   rsvg = rsvg_handle_new_from_data(fdata, im->fi->fsize, &error);
    if (!rsvg)
       goto quit;
 
@@ -241,7 +242,7 @@ _load(ImlibImage * im, int load_data)
       cairo_destroy(cr);
    if (rsvg)
       g_object_unref(rsvg);
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
diff --git a/src/modules/loaders/loader_tga.c b/src/modules/loaders/loader_tga.c
index eaa9912..61e678a 100644
--- a/src/modules/loaders/loader_tga.c
+++ b/src/modules/loaders/loader_tga.c
@@ -86,20 +86,21 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   if (im->fsize < (int)(sizeof(tga_header)) ||
-       (uintmax_t) im->fsize > SIZE_MAX)
+   if (im->fi->fsize < (int)(sizeof(tga_header)) ||
+       (uintmax_t) im->fi->fsize > SIZE_MAX)
       return rc;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
    fptr = fdata;
    header = fdata;
 
-   if (im->fsize > (int)(sizeof(tga_footer)))
+   if (im->fi->fsize > (int)(sizeof(tga_footer)))
      {
-        footer = (tga_footer *) (fptr + im->fsize - sizeof(tga_footer));
+        footer = (tga_footer *) (fptr + im->fi->fsize - sizeof(tga_footer));
 
         /* check the footer to see if we have a v2.0 TGA file */
         footer_present = memcmp(footer->signature, TGA_SIGNATURE,
@@ -110,7 +111,7 @@ _load(ImlibImage * im, int load_data)
         footer_present = 0;
      }
 
-   if ((size_t)im->fsize < sizeof(tga_header) + header->idLength +
+   if ((size_t)im->fi->fsize < sizeof(tga_header) + header->idLength +
        (footer_present ? sizeof(tga_footer) : 0))
       goto quit;
 
@@ -197,7 +198,7 @@ _load(ImlibImage * im, int load_data)
    /* find out how much data must be read from the file */
    /* (this is NOT simply width*height*4, due to compression) */
 
-   datasize = im->fsize - sizeof(tga_header) - header->idLength -
+   datasize = im->fi->fsize - sizeof(tga_header) - header->idLength -
       (footer_present ? sizeof(tga_footer) : 0);
 
    palette = NULL;
@@ -465,7 +466,7 @@ _load(ImlibImage * im, int load_data)
    rc = LOAD_SUCCESS;
 
  quit:
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
@@ -510,7 +511,7 @@ _save(ImlibImage * im)
    int                 y;
    tga_header          header;
 
-   f = fopen(im->real_file, "wb");
+   f = fopen(im->fi->name, "wb");
    if (!f)
       return LOAD_FAIL;
 
diff --git a/src/modules/loaders/loader_tiff.c b/src/modules/loaders/loader_tiff.c
index 2d2c000..40e43a5 100644
--- a/src/modules/loaders/loader_tiff.c
+++ b/src/modules/loaders/loader_tiff.c
@@ -349,10 +349,11 @@ _load(ImlibImage * im, int load_data)
    /* Do initial signature check */
 #define TIFF_BYTES_TO_CHECK sizeof(magic_number)
 
-   if (im->fsize < (int)TIFF_BYTES_TO_CHECK)
+   if (im->fi->fsize < (int)TIFF_BYTES_TO_CHECK)
       return rc;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
@@ -361,9 +362,9 @@ _load(ImlibImage * im, int load_data)
    if (magic_number != TIFF_BIGENDIAN && magic_number != TIFF_LITTLEENDIAN)
       return rc;
 
-   mm_init(fdata, im->fsize);
+   mm_init(fdata, im->fi->fsize);
 
-   tif = TIFFClientOpen(im->real_file, "r", NULL, _tiff_read, _tiff_write,
+   tif = TIFFClientOpen(im->fi->name, "r", NULL, _tiff_read, _tiff_write,
                         _tiff_seek, _tiff_close, _tiff_size,
                         _tiff_map, _tiff_unmap);
    if (!tif)
@@ -449,7 +450,7 @@ _load(ImlibImage * im, int load_data)
       TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
    if (tif)
       TIFFClose(tif);
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
@@ -472,7 +473,7 @@ _save(ImlibImage * im)
    int                 i;
    ImlibImageTag      *tag;
 
-   tif = TIFFOpen(im->real_file, "w");
+   tif = TIFFOpen(im->fi->name, "w");
    if (!tif)
       return LOAD_FAIL;
 
diff --git a/src/modules/loaders/loader_webp.c b/src/modules/loaders/loader_webp.c
index 4b8a9bc..e3e20db 100644
--- a/src/modules/loaders/loader_webp.c
+++ b/src/modules/loaders/loader_webp.c
@@ -21,15 +21,16 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   if (im->fsize < 12)
+   if (im->fi->fsize < 12)
       return rc;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
    webp_data.bytes = fdata;
-   webp_data.size = im->fsize;
+   webp_data.size = im->fi->fsize;
 
    /* Init (includes signature check) */
    demux = WebPDemux(&webp_data);
@@ -101,7 +102,7 @@ _load(ImlibImage * im, int load_data)
  quit:
    if (demux)
       WebPDemuxDelete(demux);
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
@@ -116,7 +117,7 @@ _save(ImlibImage * im)
    uint8_t            *fdata;
    size_t              encoded_size;
 
-   f = fopen(im->real_file, "wb");
+   f = fopen(im->fi->name, "wb");
    if (!f)
       return LOAD_FAIL;
 
diff --git a/src/modules/loaders/loader_xbm.c b/src/modules/loaders/loader_xbm.c
index 505e27f..a004336 100644
--- a/src/modules/loaders/loader_xbm.c
+++ b/src/modules/loaders/loader_xbm.c
@@ -94,21 +94,22 @@ _load(ImlibImage * im, int load_data)
 
    rc = LOAD_FAIL;
 
-   if (im->fsize < 64)
+   if (im->fi->fsize < 64)
       return rc;                /* Not XBM */
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
    /* Signature check ("#define") allow longish initial comment */
    s = fdata;
    nlen = s[0] == '/' && s[1] == '*' ? 4096 : 256;
-   nlen = im->fsize > nlen ? nlen : im->fsize;
+   nlen = im->fi->fsize > nlen ? nlen : im->fi->fsize;
    if (!memmem(s, nlen, "#define", 7))
       goto quit;
 
-   mm_init(fdata, im->fsize);
+   mm_init(fdata, im->fi->fsize);
 
    ptr = NULL;
    x = y = 0;
@@ -211,7 +212,7 @@ _load(ImlibImage * im, int load_data)
       rc = LOAD_SUCCESS;
 
  quit:
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }
@@ -226,13 +227,13 @@ _save(ImlibImage * im)
    int                 i, k, x, y, bits, nval, val;
    uint32_t           *ptr;
 
-   f = fopen(im->real_file, "wb");
+   f = fopen(im->fi->name, "wb");
    if (!f)
       return LOAD_FAIL;
 
    rc = LOAD_SUCCESS;
 
-   name = im->real_file;
+   name = im->fi->name;
    if ((s = strrchr(name, '/')) != 0)
       name = s + 1;
 
diff --git a/src/modules/loaders/loader_xpm.c b/src/modules/loaders/loader_xpm.c
index e8f138c..c447b8b 100644
--- a/src/modules/loaders/loader_xpm.c
+++ b/src/modules/loaders/loader_xpm.c
@@ -174,16 +174,17 @@ _load(ImlibImage * im, int load_data)
    line = NULL;
    cmap = NULL;
 
-   fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
+   fdata =
+      mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
    if (fdata == MAP_FAILED)
       return LOAD_BADFILE;
 
-   if (!memmem(fdata, im->fsize <= 256 ? im->fsize : 256, " XPM */", 7))
+   if (!memmem(fdata, im->fi->fsize <= 256 ? im->fi->fsize : 256, " XPM */", 7))
       goto quit;
 
    rc = LOAD_BADIMAGE;          /* Format accepted */
 
-   mm_init(fdata, im->fsize);
+   mm_init(fdata, im->fi->fsize);
 
    j = 0;
    w = 10;
@@ -472,7 +473,7 @@ _load(ImlibImage * im, int load_data)
 
    xpm_parse_done();
 
-   munmap(fdata, im->fsize);
+   munmap(fdata, im->fi->fsize);
 
    return rc;
 }

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to