Index: trunk/Ohana/src/opihi/cmd.data/wd.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/wd.c	(revision 41673)
+++ trunk/Ohana/src/opihi/cmd.data/wd.c	(revision 41674)
@@ -1,3 +1,4 @@
 # include "data.h"
+FILE *gfits_open_and_extend (char *filename);
 
 int wd (int argc, char **argv) {
@@ -98,47 +99,14 @@
   // it updates NEXTEND and set EXTEND to TRUE, and modifies the PHU header (neither should happen)
   // if those keywords do not exist...
-  if (Extend) {
-    Header Xhead;
-    FILE *f;
-    off_t nbytes;
-    int status, Nextend;
-
-    /* assume failure means non-existent file */
-    if (!gfits_read_header (argv[2], &Xhead)) {
-
-      gfits_init_header (&Xhead);
-      Xhead.bitpix = 16;
-      Xhead.extend = TRUE;
-      gfits_create_header (&Xhead);
-
-      gfits_modify (&Xhead, "NEXTEND", "%d", 1, 0);
-      f = fopen (argv[2], "w");
-      fclose (f);
-    }
-
-    gfits_modify_alt (&Xhead, "EXTEND", "%t", 1, TRUE);
-
-    Nextend = 0;
-    gfits_scan (&Xhead, "NEXTEND", "%d", 1, &Nextend);
-    Nextend ++;
-    gfits_modify (&Xhead, "NEXTEND", "%d", 1, Nextend);
-
-    /* write the main header to the start of the file */
-    f = fopen (argv[2], "r+");
-    if (f == NULL) {
-      gprint (GP_ERR, "failed to write file\n");
+  if (Extend && !CompressMode) {
+    int status = TRUE;
+
+    FILE *f = gfits_open_and_extend (argv[2]);
+    if (!f) {
+      gprint (GP_ERR, "failed to extend file %s\n", argv[2]);
       status = FALSE;
       goto done1;
     }
-    
-    /* position to begining of file to write header */
-    fseeko (f, 0LL, SEEK_SET);
-    nbytes = fwrite (Xhead.buffer, 1, Xhead.datasize, f);
-    if (nbytes != Xhead.datasize) {
-      gprint (GP_ERR, "ERROR: failed writing data to image header\n");
-      status = FALSE;
-      goto done1;
-    }
-    
+
     /* fix up header */
     {
@@ -153,20 +121,23 @@
     /* position to end of file to write new extend */
     fseeko (f, 0LL, SEEK_END);
-    nbytes = fwrite (temp_header.buffer, 1, temp_header.datasize, f);
-    fclose (f);
+    off_t nbytes = fwrite (temp_header.buffer, 1, temp_header.datasize, f);
     if (nbytes != temp_header.datasize) {
+      fclose (f);
       gprint (GP_ERR, "failed to write file\n");
       status = FALSE;
       goto done1;
     }
+
     /* write the matrix buffer (automatically goes to end of file */
-    if (!gfits_write_matrix (argv[2], &temp_matrix)) {
+    if (!gfits_fwrite_matrix (f, &temp_matrix)) {
+      fclose (f);
       gprint (GP_ERR, "failed to write file\n");
       status = FALSE;
       goto done1;
     }
+    fclose (f);
     status = TRUE;
+
   done1:
-    gfits_free_header (&Xhead);
     gfits_free_header (&temp_header);
     gfits_free_matrix (&temp_matrix);
@@ -180,19 +151,28 @@
     Matrix myMatrix;
 
-    FILE *f = fopen (argv[2], "w");
-    if (!f) {
-      fprintf (stderr, "ERROR: cannot open image subset file for output %s\n", argv[2]);
-      FREE (CompressMode);
-      return FALSE;
-    }
-    
-    gfits_init_header (&myHeader);
-    myHeader.extend = TRUE;
-    gfits_create_header (&myHeader);
-    gfits_create_matrix (&myHeader, &myMatrix);
-    gfits_fwrite_header  (f, &myHeader);
-    gfits_fwrite_matrix  (f, &myMatrix);
-    gfits_free_header (&myHeader);
-    gfits_free_matrix (&myMatrix);
+    FILE *f;
+
+    if (Extend) {
+      // keeps an existing file
+      f = gfits_open_and_extend (argv[2]);
+      fseeko (f, 0LL, SEEK_END);
+    } else {
+      // replaces an existing file
+      f = fopen (argv[2], "w");
+      if (!f) {
+	fprintf (stderr, "ERROR: cannot open image subset file for output %s\n", argv[2]);
+	FREE (CompressMode);
+	return FALSE;
+      }
+   
+      gfits_init_header (&myHeader);
+      myHeader.extend = TRUE;
+      gfits_create_header (&myHeader);
+      gfits_create_matrix (&myHeader, &myMatrix);
+      gfits_fwrite_header  (f, &myHeader);
+      gfits_fwrite_matrix  (f, &myMatrix);
+      gfits_free_header (&myHeader);
+      gfits_free_matrix (&myMatrix);
+    }
 
     FTable ftable;
@@ -236,2 +216,84 @@
   return (TRUE);
 }
+
+// prepare the file to add an extension:
+// read the PHU, update NEXTEND, write back header
+// return the file pointer open and ready for write
+FILE *gfits_open_and_extend (char *filename) {
+
+  Header Xhead;
+  FILE *f = NULL;
+  struct stat filestat;
+
+  // does the file already exist?
+  int status = stat (filename, &filestat);
+  if (status == 0) { /* file exists, are permissions OK? */
+    f = fopen (filename, "r+");
+    if (f == NULL) {
+      gprint (GP_ERR, "failed to open file %s for write\n", filename);
+      return NULL;
+    }
+
+    status = gfits_fread_header (f, &Xhead);
+    if (!status) {
+      gprint (GP_ERR, "failed to read header for existing file %s\n", filename);
+      return NULL;
+    }
+  } else {
+    f = fopen (filename, "w");
+    if (f == NULL) {
+      gprint (GP_ERR, "failed to create file %s for write\n", filename);
+      return NULL;
+    }
+
+    // create an empty header
+    gfits_init_header (&Xhead);
+    Xhead.bitpix = 16;
+    Xhead.extend = TRUE;
+    gfits_create_header (&Xhead);
+
+    gfits_modify (&Xhead, "NEXTEND", "%d", 1, 0);
+  }
+
+  gfits_modify_alt (&Xhead, "EXTEND", "%t", 1, TRUE);
+
+  int Nextend = 0;
+  gfits_scan (&Xhead, "NEXTEND", "%d", 1, &Nextend);
+  Nextend ++;
+  gfits_modify (&Xhead, "NEXTEND", "%d", 1, Nextend);
+
+  /* position to begining of file to write header */
+  fseeko (f, 0LL, SEEK_SET);
+  off_t nbytes = fwrite (Xhead.buffer, 1, Xhead.datasize, f);
+  if (nbytes != Xhead.datasize) {
+    gfits_free_header (&Xhead);
+    gprint (GP_ERR, "ERROR: failed writing data to image header\n");
+    return NULL;
+  }
+  gfits_free_header (&Xhead);
+    
+  return (f);
+}
+
+
+///    /* fix up header */
+///    {
+///      static char simple[] = "XTENSION= 'IMAGE  '            / Image extension";
+///      int Ns, No;
+///      Ns = strlen (simple);
+///      No = 80 - Ns;
+///      strncpy (temp_header.buffer, simple, Ns);
+///      memset (&temp_header.buffer[Ns], ' ', No);
+///    }
+///
+///    /* position to end of file to write new extend */
+///    fseeko (f, 0LL, SEEK_END);
+///    nbytes = fwrite (temp_header.buffer, 1, temp_header.datasize, f);
+///    fclose (f);
+///    if (nbytes != temp_header.datasize) {
+///      gprint (GP_ERR, "failed to write file\n");
+///      status = FALSE;
+///      goto done1;
+///    }
+///
+///  }
