Index: trunk/psModules/src/objects/pmSourceIO.c
===================================================================
--- trunk/psModules/src/objects/pmSourceIO.c	(revision 12448)
+++ trunk/psModules/src/objects/pmSourceIO.c	(revision 12457)
@@ -3,6 +3,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-03-15 20:45:27 $
+ *  @version $Revision: 1.25 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-03-16 00:32:46 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -281,7 +281,26 @@
         }
 
-        // EXTNAME values used to for table data and image header segments
-        dataname = pmFPAfileNameFromRule (file->extrule, file, view);
-        headname = pmFPAfileNameFromRule (file->extxtra, file, view);
+        // lookup the EXTNAME values used for table data and image header segments
+        char *rule = NULL;
+	// Menu of EXTNAME rules
+        psMetadata *menu = psMetadataLookupMetadata(&status, file->camera, "EXTNAME.RULES"); 
+	if (!menu) {
+	    psError(PS_ERR_UNKNOWN, true, "missing EXTNAME.RULES in camera.config");
+	    return false;
+	}
+	// EXTNAME for image header
+	rule = psMetadataLookupStr(&status, menu, "CMF.HEAD"); 
+	if (!rule) {
+	    psError(PS_ERR_UNKNOWN, true, "missing entry for CMF.HEAD in EXTNAME.RULES in camera.config");
+	    return false;
+	}
+        headname = pmFPAfileNameFromRule (rule, file, view);
+	// EXTNAME for table data
+        rule = psMetadataLookupStr(&status, menu, "CMF.DATA"); 
+	if (!rule) {
+	    psError(PS_ERR_UNKNOWN, true, "missing entry for CMF.DATA in EXTNAME.RULES in camera.config");
+	    return false;
+	}
+        dataname = pmFPAfileNameFromRule (rule, file, view);
 
         // this header block is new, write it to disk
@@ -481,9 +500,8 @@
         if (!strcasecmp (file->filename, "@FILES")) {
             psFree (file->filename);
-            char *extra = pmFPAfileNameFromRule (file->filextra, file, view);
-            file->filename = psMetadataLookupStr (&status, file->names, extra);
-            psFree (extra);
-            if (file->filename == NULL)
-                return false;
+            char *filesrc = pmFPAfileNameFromRule (file->filesrc, file, view);
+            file->filename = psMetadataLookupStr (&status, file->names, filesrc);
+            psFree (filesrc);
+            if (file->filename == NULL) return false;
             // psMetadataLookupStr just returns a view, file->filename must be protected
             psMemIncrRefCounter (file->filename);
@@ -508,21 +526,44 @@
         // read in header, if not yet loaded
         hdu = pmFPAviewThisHDU (view, file->fpa);
+
+        // lookup the EXTNAME values used for table data and image header segments
+        char *rule = NULL;
+	// Menu of EXTNAME rules
+        psMetadata *menu = psMetadataLookupMetadata(&status, file->camera, "EXTNAME.RULES");
+	if (!menu) {
+	    psError(PS_ERR_UNKNOWN, true, "missing EXTNAME.RULES in camera.config");
+	    return false;
+	}
+	// EXTNAME for image header
+	rule = psMetadataLookupStr(&status, menu, "CMF.HEAD");
+	if (!rule) {
+	    psError(PS_ERR_UNKNOWN, true, "missing entry for CMF.HEAD in EXTNAME.RULES in camera.config");
+	    return false;
+	}
+        char *headname = pmFPAfileNameFromRule (rule, file, view);
+	// EXTNAME for table data
+        rule = psMetadataLookupStr(&status, menu, "CMF.DATA");
+	if (!rule) {
+	    psError(PS_ERR_UNKNOWN, true, "missing entry for CMF.DATA in EXTNAME.RULES in camera.config");
+	    return false;
+	}
+        char *dataname = pmFPAfileNameFromRule (rule, file, view);
+
+	// advance to the IMAGE HEADER extension
         if (hdu->header == NULL) {
-            char *headname = pmFPAfileNameFromRule (file->extxtra, file, view);
             psFitsMoveExtName (file->fits, headname);
             hdu->header = psFitsReadHeader (NULL, file->fits);
-            psFree (headname);
         }
 
         // we need to find the corresponding table EXTNAME.
         // first check the header
-        char *dataname = psMetadataLookupStr (NULL, hdu->header, "EXTDATA");
-        psMemIncrRefCounter (dataname); // so free below is safe
-        if (!dataname) {
-            // if it is not defined in the header, try the value in the filerule
-            dataname = pmFPAfileNameFromRule (file->extrule, file, view);
-            if (!dataname)
-                psAbort("cannot determine data EXTNAME");
-        }
+        char *extdata = psMetadataLookupStr (NULL, hdu->header, "EXTDATA");
+        if (extdata) {
+            // if EXTDATA is defined in the header, use that value for 'dataname'
+	    psFree (dataname);
+	    dataname = psMemIncrRefCounter (extdata);
+        }
+	
+	// advance to the table data extension
         if (!psFitsMoveExtName (file->fits, dataname)) {
             psAbort("cannot find data extension %s in %s", dataname, file->filename);
@@ -543,4 +584,5 @@
 	}
 
+	psFree (headname);
         psFree (dataname);
         break;
