Got rid the bogus cache code and fix some unchecked errors.
diff --git a/Modules/imgfile.c b/Modules/imgfile.c
index bccfe85..7d71a35 100644
--- a/Modules/imgfile.c
+++ b/Modules/imgfile.c
@@ -22,7 +22,7 @@
 
 ******************************************************************/
 
-/* IMGFILE module - Interface to sgi libimg */
+/* IMGFILE module - Interface to sgi libimage */
 
 /* XXX This modele should be done better at some point. It should return
 ** an object of image file class, and have routines to manipulate these
@@ -35,16 +35,20 @@
 #include "modsupport.h"
 
 #include <gl/image.h>
+#include <errno.h>
 
-/* #include "sigtype.h" */
+static object * ImgfileError; /* Exception we raise for various trouble */
 
-static object * ImgfileError;
 
-static char gfname[1024];
-static IMAGE *image;
+/* The image library does not always call the error hander :-(,
+   therefore we have a global variable indicating that it was called.
+   It is cleared by imgfile_open(). */
 
 static int error_called;
 
+
+/* The error handler */
+
 static imgfile_error(str)
     char *str;
 {
@@ -53,27 +57,32 @@
     return;	/* To imglib, which will return a failure indictaor */
 }
 
-static
+
+/* Open an image file and return a pointer to it.
+   Make sure we raise an exception if we fail. */
+
+static IMAGE *
 imgfile_open(fname)
     char *fname;
 {
+    IMAGE *image;
     i_seterror(imgfile_error);
     error_called = 0;
-    if ( image != NULL && strcmp(fname, gfname) != 0 ) {
-	iclose(image);
-	image = NULL;
-	gfname[0] = '\0';
-    }
-    if ( (image=iopen(fname, "r")) == NULL ) {
+    errno = 0;
+    if ( (image = iopen(fname, "r")) == NULL ) {
 	/* Error may already be set by imgfile_error */
-	if ( !error_called )
-	  err_setstr(ImgfileError, "Cannot open image file");
-	return 0;
+	if ( !error_called ) {
+	    if (errno)
+	        err_errno(ImgfileError);
+	    else
+	        err_setstr(ImgfileError, "Can't open image file");
+        }
+	return NULL;
     }
-    strcpy(gfname, fname);
-    return 1;    
+    return image;
 }
 
+
 static object *
 imgfile_read(self, args)
     object *self;
@@ -86,33 +95,44 @@
     long *idatap;
     static short rs[8192], gs[8192], bs[8192];
     int x, y;
+    IMAGE *image;
     
     if ( !getargs(args, "s", &fname) )
-      return 0;
+      return NULL;
     
-    if ( !imgfile_open(fname) )
+    if ( (image = imgfile_open(fname)) == NULL )
       return NULL;
     
     if ( image->colormap != CM_NORMAL ) {
+	iclose(image);
 	err_setstr(ImgfileError, "Can only handle CM_NORMAL images");
 	return NULL;
     }
     if ( BPP(image->type) != 1 ) {
-	err_setstr(ImgfileError, "Cannot handle imgfiles with bpp!=1");
+	iclose(image);
+	err_setstr(ImgfileError, "Can't handle imgfiles with bpp!=1");
 	return NULL;
     }
     xsize = image->xsize;
     ysize = image->ysize;
     zsize = image->zsize;
     if ( zsize != 1 && zsize != 3) {
+	iclose(image);
 	err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels");
 	return NULL;
     }
+    if ( xsize > 8192 ) {
+	iclose(image);
+	err_setstr(ImgfileError, "Can't handle image with > 8192 columns");
+	return NULL;
+    }
 
     if ( zsize == 3 ) zsize = 4;
-    rv = newsizedstringobject(NULL, xsize*ysize*zsize);
-    if ( rv == NULL )
+    rv = newsizedstringobject((char *)NULL, xsize*ysize*zsize);
+    if ( rv == NULL ) {
+      iclose(image);
       return NULL;
+    }
     cdatap = getstringvalue(rv);
     idatap = (long *)cdatap;
     for ( y=0; y < ysize && !error_called; y++ ) {
@@ -138,6 +158,7 @@
     return rv;
 }
 
+
 static object *
 imgfile_readscaled(self, args)
     object *self;
@@ -153,35 +174,46 @@
     int xwtd, ywtd, xorig, yorig;
     float xfac, yfac;
     int cnt;
+    IMAGE *image;
     
     if ( !getargs(args, "(sii)", &fname, &xwtd, &ywtd) )
-      return 0;
+      return NULL;
 
-    if ( !imgfile_open(fname) )
+    if ( (image = imgfile_open(fname)) == NULL )
       return NULL;
     
     if ( image->colormap != CM_NORMAL ) {
+	iclose(image);
 	err_setstr(ImgfileError, "Can only handle CM_NORMAL images");
 	return NULL;
     }
     if ( BPP(image->type) != 1 ) {
-	err_setstr(ImgfileError, "Cannot handle imgfiles with bpp!=1");
+	iclose(image);
+	err_setstr(ImgfileError, "Can't handle imgfiles with bpp!=1");
 	return NULL;
     }
     xsize = image->xsize;
     ysize = image->ysize;
     zsize = image->zsize;
     if ( zsize != 1 && zsize != 3) {
+	iclose(image);
 	err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels");
 	return NULL;
     }
+    if ( xsize > 8192 ) {
+	iclose(image);
+	err_setstr(ImgfileError, "Can't handle image with > 8192 columns");
+	return NULL;
+    }
 
     if ( zsize == 3 ) zsize = 4;
     rv = newsizedstringobject(NULL, xwtd*ywtd*zsize);
+    if ( rv == NULL ) {
+      iclose(image);
+      return NULL;
+    }
     xfac = (float)xsize/(float)xwtd;
     yfac = (float)ysize/(float)ywtd;
-    if ( rv == NULL )
-      return NULL;
     cdatap = getstringvalue(rv);
     idatap = (long *)cdatap;
     for ( y=0; y < ywtd && !error_called; y++ ) {
@@ -203,6 +235,7 @@
 	  }
 	}
     }
+    iclose(image);
     if ( error_called ) {
 	DECREF(rv);
 	return NULL;
@@ -210,6 +243,7 @@
     return rv;
 }
 
+
 static object *
 imgfile_getsizes(self, args)
     object *self;
@@ -217,21 +251,19 @@
 {
     char *fname;
     object *rv;
+    IMAGE *image;
     
     if ( !getargs(args, "s", &fname) )
-      return 0;
+      return NULL;
     
-    if ( !imgfile_open(fname) )
+    if ( (image = imgfile_open(fname)) == NULL )
       return NULL;
-    rv = newtupleobject(3);
-    if ( rv == NULL )
-      return NULL;
-    settupleitem(rv, 0, newintobject(image->xsize));
-    settupleitem(rv, 1, newintobject(image->ysize));
-    settupleitem(rv, 2, newintobject(image->zsize));
+    rv = mkvalue("(iii)", image->xsize, image->ysize, image->zsize);
+    iclose(image);
     return rv;
 }
 
+
 static object *
 imgfile_write(self, args)
     object *self;
@@ -249,23 +281,32 @@
 
     if ( !getargs(args, "(ss#iii)",
 		  &fname, &cdatap, &len, &xsize, &ysize, &zsize) )
-      return 0;
+      return NULL;
     
     if ( zsize != 1 && zsize != 3 ) {
 	err_setstr(ImgfileError, "Can only handle 1 or 3 byte pixels");
-	return 0;
+	return NULL;
     }
-    if ( (zsize == 1 && len != xsize*ysize) ||
-	 (zsize == 3 && len != xsize*ysize*4) ) {
+    if ( len != xsize * ysize * (zsize == 1 ? 1 : 4) ) {
 	err_setstr(ImgfileError, "Data does not match sizes");
-	return 0;
+	return NULL;
+    }
+    if ( xsize > 8192 ) {
+	err_setstr(ImgfileError, "Can't handle image with > 8192 columns");
+	return NULL;
     }
 
+    error_called = 0;
+    errno = 0;
     image =iopen(fname, "w", RLE(1), 3, xsize, ysize, zsize);
     if ( image == 0 ) {
-	if ( ! error_called )
-	  err_setstr(ImgfileError, "Cannot create image file");
-	return 0;
+	if ( ! error_called ) {
+	    if (errno)
+		err_errno(ImgfileError);
+	    else
+	        err_setstr(ImgfileError, "Can't create image file");
+	}
+	return NULL;
     }
 
     idatap = (long *)cdatap;
@@ -292,18 +333,19 @@
     }
     iclose(image);
     if ( error_called )
-      return 0;
+      return NULL;
     INCREF(None);
     return None;
     
 }
 
+
 static struct methodlist imgfile_methods[] = {
     { "getsizes",	imgfile_getsizes },
     { "read",		imgfile_read },
     { "readscaled",	imgfile_readscaled },
     { "write",		imgfile_write },
-    { 0,          0 }
+    { NULL,		NULL } /* Sentinel */
 };
 
 
@@ -314,6 +356,6 @@
 	m = initmodule("imgfile", imgfile_methods);
 	d = getmoduledict(m);
 	ImgfileError = newstringobject("imgfile.error");
-	if ( ImgfileError == NULL || dictinsert(d,"error",ImgfileError) )
+	if ( ImgfileError == NULL || dictinsert(d, "error", ImgfileError) )
 	    fatal("can't define imgfile.error");
 }