Index: /trunk/Ohana/src/addstar/Makefile
===================================================================
--- /trunk/Ohana/src/addstar/Makefile	(revision 6673)
+++ /trunk/Ohana/src/addstar/Makefile	(revision 6674)
@@ -87,5 +87,6 @@
 $(SRC)/match_refstars.$(ARCH).o \
 
-SERVER = \
+ADDSTARD = \
+$(SRC)/addstard.$(ARCH).o \
 $(SRC)/SocketOps.$(ARCH).o \
 $(SRC)/ConfigInit.$(ARCH).o \
@@ -130,5 +131,52 @@
 $(SRC)/NewRefcat.$(ARCH).o 
 
-CLIENT = \
+ADDSTART = \
+$(SRC)/addstart.$(ARCH).o \
+$(SRC)/DatasetOps.$(ARCH).o \
+$(SRC)/SocketOps.$(ARCH).o \
+$(SRC)/ConfigInit.$(ARCH).o \
+$(SRC)/args_server.$(ARCH).o \
+$(SRC)/CheckPassword.$(ARCH).o \
+$(SRC)/UpdateDatabase_Image.$(ARCH).o \
+$(SRC)/UpdateDatabase_Reflist.$(ARCH).o \
+$(SRC)/UpdateDatabase_Refcat.$(ARCH).o \
+$(SRC)/airmass.$(ARCH).o \
+$(SRC)/build_links.$(ARCH).o \
+$(SRC)/calibrate.$(ARCH).o \
+$(SRC)/find_matches.$(ARCH).o \
+$(SRC)/find_matches_closest.$(ARCH).o \
+$(SRC)/find_matches_refstars.$(ARCH).o \
+$(SRC)/find_subset.$(ARCH).o \
+$(SRC)/get2mass.$(ARCH).o \
+$(SRC)/get2mass_as.$(ARCH).o \
+$(SRC)/get2mass_dr2.$(ARCH).o \
+$(SRC)/getgsc.$(ARCH).o \
+$(SRC)/getusno.$(ARCH).o \
+$(SRC)/greference.$(ARCH).o \
+$(SRC)/gcatalog.$(ARCH).o \
+$(SRC)/gimages.$(ARCH).o \
+$(SRC)/image-db.$(ARCH).o \
+$(SRC)/in_image.$(ARCH).o \
+$(SRC)/load_pt_catalog.$(ARCH).o \
+$(SRC)/load_subpix.$(ARCH).o \
+$(SRC)/mkcatalog.$(ARCH).o \
+$(SRC)/replace_match.$(ARCH).o \
+$(SRC)/SetSignals.$(ARCH).o \
+$(SRC)/SkyRegionUtils.$(ARCH).o \
+$(SRC)/SkyListForStars.$(ARCH).o \
+$(SRC)/sort_lists.$(ARCH).o \
+$(SRC)/update_coords.$(ARCH).o \
+$(SRC)/wcatalog.$(ARCH).o \
+$(SRC)/Shutdown.$(ARCH).o \
+$(SRC)/edge_check.$(ARCH).o \
+$(SRC)/check_permissions.$(ARCH).o \
+$(SRC)/opening_angle.$(ARCH).o \
+$(SRC)/ListenClients_Thread.$(ARCH).o \
+$(SRC)/NewImage_Thread.$(ARCH).o \
+$(SRC)/NewReflist_Thread.$(ARCH).o \
+$(SRC)/NewRefcat_Thread.$(ARCH).o 
+
+ADDSTARC = \
+$(SRC)/addstarc.$(ARCH).o \
 $(SRC)/SocketOps.$(ARCH).o \
 $(SRC)/ConfigInit.$(ARCH).o \
@@ -143,9 +191,7 @@
 $(SRC)/args_client.$(ARCH).o
 
-ADDSTARC = $(SRC)/addstarc.$(ARCH).o $(CLIENT)
-ADDSTARD = $(SRC)/addstard.$(ARCH).o $(SERVER)
-
 $(ADDSTARC) : $(INC)/addstar.h
 $(ADDSTARD) : $(INC)/addstar.h
+$(ADDSTART) : $(INC)/addstar.h
 $(ADDSTAR)  : $(INC)/addstar.h
 
@@ -155,4 +201,9 @@
 addstard                : $(BIN)/addstard.$(ARCH)
 $(BIN)/addstard.$(ARCH) : $(ADDSTARD)
+
+addstart                : $(BIN)/addstart.$(ARCH)
+$(BIN)/addstart.$(ARCH) : $(ADDSTART)
+	@if [ ! -d $(BIN) ]; then mkdir -p $(BIN); fi
+	$(CC) $^ -o $@ $(LFLAGS) -lpthread
 
 addstarc                : $(BIN)/addstarc.$(ARCH)
Index: /trunk/Ohana/src/addstar/include/addstar.h
===================================================================
--- /trunk/Ohana/src/addstar/include/addstar.h	(revision 6673)
+++ /trunk/Ohana/src/addstar/include/addstar.h	(revision 6674)
@@ -20,4 +20,14 @@
     fprintf (stderr, "ERROR:  photcode %s not found in photcode table\n", NAME); \
     exit (0); }
+
+typedef struct {
+  int Nstars;
+  Stars *stars;
+  Image *image;
+  Coords *mosaic;
+  SkyRegion *patch;
+  AddstarClientOptions *options;
+  char *refcat;
+} DVO_DATA;
 
 typedef struct sockaddr_in SockAddress;
@@ -204,2 +214,10 @@
 int SkyListSetPath (SkyList *list, char *path);
 SkyTable *SkyTableLoadOptimal ();
+
+int InitDataset ();
+int PushDataset (DVO_DATA *data);
+DVO_DATA *PopDataset (void);
+void *ListenClients_Thread (void *data);
+int NewImage_Thread (int BindSocket);
+int NewRefcat_Thread (int BindSocket);
+int NewReflist_Thread (int BindSocket);
Index: /trunk/Ohana/src/addstar/src/DatasetOps.c
===================================================================
--- /trunk/Ohana/src/addstar/src/DatasetOps.c	(revision 6673)
+++ /trunk/Ohana/src/addstar/src/DatasetOps.c	(revision 6674)
@@ -1,3 +1,4 @@
 # include "addstar.h"
+# include <pthread.h>
 
 /* the init function is an alternative */
@@ -5,5 +6,4 @@
 pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
 
-static int lock = FALSE;
 static int Ndataset = 0;
 static int NDATASET = 0;
@@ -29,13 +29,13 @@
   int N;
 
-  pthread_mutex_lock(&mutex);
+  pthread_mutex_lock(&fastmutex);
 
   N = Ndataset;
   Ndataset ++;
-  CHECK_REALLOCATE (dataset, DVO_DATA, NDATASET, Ndataset, 100);
+  CHECK_REALLOCATE (dataset, DVO_DATA *, NDATASET, Ndataset, 100);
 
   dataset[N] = data;
 
-  pthread_mutex_unlock(&mutex);
+  pthread_mutex_unlock(&fastmutex);
   return (TRUE);
 }
@@ -44,10 +44,11 @@
 DVO_DATA *PopDataset (void) {
 
+  int i;
   DVO_DATA *data;
 
-  pthread_mutex_lock(&mutex);
+  pthread_mutex_lock(&fastmutex);
 
   if (Ndataset == 0) {
-    pthread_mutex_unlock(&mutex);
+    pthread_mutex_unlock(&fastmutex);
     return (NULL);
   }
@@ -61,8 +62,8 @@
   if ((Ndataset < NDATASET / 2) && (Ndataset > 50)) {
     NDATASET = Ndataset / 2;
-    REALLOCATE (dataset, DVO_DATA, NDATASET);
+    REALLOCATE (dataset, DVO_DATA *, NDATASET);
   }
 
-  pthread_mutex_unlock(&mutex);
+  pthread_mutex_unlock(&fastmutex);
   return (data);
 }
Index: /trunk/Ohana/src/addstar/src/ListenClients_Thread.c
===================================================================
--- /trunk/Ohana/src/addstar/src/ListenClients_Thread.c	(revision 6673)
+++ /trunk/Ohana/src/addstar/src/ListenClients_Thread.c	(revision 6674)
@@ -2,10 +2,9 @@
 
 /* wait for incoming messages from clients */
-int ListenClients_Thread () {
+void *ListenClients_Thread (void *data) {
 
   int status, InitSocket, BindSocket;
   SockAddress Address;
   IOBuffer message;
-  AddstarClientOptions options;
   
   /* if we have multiple threads, each one creates its own socket? */
Index: /trunk/Ohana/src/addstar/src/NewRefcat_Thread.c
===================================================================
--- /trunk/Ohana/src/addstar/src/NewRefcat_Thread.c	(revision 6673)
+++ /trunk/Ohana/src/addstar/src/NewRefcat_Thread.c	(revision 6674)
@@ -7,4 +7,5 @@
   IOBuffer message;
   SkyRegion *patch;
+  DVO_DATA *dataset;
 
   /* accept incoming data set */
Index: /trunk/Ohana/src/addstar/src/NewReflist_Thread.c
===================================================================
--- /trunk/Ohana/src/addstar/src/NewReflist_Thread.c	(revision 6673)
+++ /trunk/Ohana/src/addstar/src/NewReflist_Thread.c	(revision 6674)
@@ -6,4 +6,5 @@
   Stars *stars;
   AddstarClientOptions *options;
+  DVO_DATA *dataset;
 
   /* accept incoming data set */
Index: /trunk/Ohana/src/addstar/src/addstart.c
===================================================================
--- /trunk/Ohana/src/addstar/src/addstart.c	(revision 6673)
+++ /trunk/Ohana/src/addstar/src/addstart.c	(revision 6674)
@@ -1,10 +1,11 @@
 # include "addstar.h"
+# include <pthread.h>
 
 int main (int argc, char **argv) {
 
-  int status, InitSocket, BindSocket;
-  SockAddress Address;
-  IOBuffer message;
   AddstarClientOptions options;
+  pthread_t thread;
+  DVO_DATA *dataset;
+  // pthread_attr_t attr;
 
   options = ConfigInit (&argc, argv);
@@ -13,5 +14,5 @@
   /* store the sky table in a global for internal use */
   ServerSky = SkyTableLoadOptimal (CATDIR, SKY_TABLE, GSCFILE, SKY_DEPTH, VERBOSE);
-  SkyTableSetFilename (ServerSky, CATDIR, "cpt");
+  SkyTableSetFilenames (ServerSky, CATDIR, "cpt");
 
   VERBOSE = TRUE;
@@ -24,5 +25,5 @@
 
   /* decide if we need an argument to dbthread */
-  pthread_create (thread, attr, ListenClients_Thread, NULL);
+  pthread_create (&thread, NULL, &ListenClients_Thread, NULL);
 
   while (1) {
Index: /trunk/Ohana/src/addstar/src/load_pt_catalog.c
===================================================================
--- /trunk/Ohana/src/addstar/src/load_pt_catalog.c	(revision 6673)
+++ /trunk/Ohana/src/addstar/src/load_pt_catalog.c	(revision 6674)
@@ -3,5 +3,8 @@
 int load_pt_catalog (Catalog *catalog, SkyRegion *region) {
   
-  check_permissions (catalog[0].filename);
+  if (!check_file_access (catalog[0].filename, TRUE, TRUE)) {
+    exit (1);
+  }
+
   if (VERBOSE) fprintf (stderr, "adding to %s\n", catalog[0].filename);
     
Index: /trunk/Ohana/src/addstar/src/match_refstars.c
===================================================================
--- /trunk/Ohana/src/addstar/src/match_refstars.c	(revision 6673)
+++ /trunk/Ohana/src/addstar/src/match_refstars.c	(revision 6674)
@@ -13,5 +13,7 @@
     if (stars[i].found != -1) continue;
     gregion_star (&stars[i], &region);
-    check_permissions (region.filename);
+    if (!check_file_access (region.filename, TRUE, TRUE)) {
+      exit (0);
+    }
     make_backup (region.filename);
 
Index: /trunk/Ohana/src/elixir/src/LogOpen.c
===================================================================
--- /trunk/Ohana/src/elixir/src/LogOpen.c	(revision 6673)
+++ /trunk/Ohana/src/elixir/src/LogOpen.c	(revision 6674)
@@ -11,5 +11,7 @@
   if ((f == (FILE *) NULL) && (errno == ENOENT)) {
     path = pathname (filename);
-    if (!mkdirhier (path)) f = fopen (filename, "a");
+    if (!mkdirhier (path, S_IRWXU | S_IRWXG | S_IRWXO)) {
+      f = fopen (filename, "a");
+    }
   }
   if (f == (FILE *) NULL) {
Index: /trunk/Ohana/src/gastro2/src/extr2mass.c
===================================================================
--- /trunk/Ohana/src/gastro2/src/extr2mass.c	(revision 6673)
+++ /trunk/Ohana/src/gastro2/src/extr2mass.c	(revision 6674)
@@ -136,5 +136,5 @@
 
       path = pathname (filename);
-      mkdirhier (path);
+      mkdirhier (path, S_IRWXU | S_IRWXG | S_IRWXO);
       
       fout = fopen (filename, "a+");
Index: /trunk/Ohana/src/imregister/detrend/altpath.c
===================================================================
--- /trunk/Ohana/src/imregister/detrend/altpath.c	(revision 6673)
+++ /trunk/Ohana/src/imregister/detrend/altpath.c	(revision 6674)
@@ -141,5 +141,5 @@
   if (status == -1) {
     if (errno == ENOENT) {
-      if (mkdirhier (path) == -1) {
+      if (mkdirhier (path, S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
 	fprintf (stderr, "ERROR: can't create path %s\n", path);
 	return (FALSE);
Index: /trunk/Ohana/src/imregister/detrend/db_names.c
===================================================================
--- /trunk/Ohana/src/imregister/detrend/db_names.c	(revision 6673)
+++ /trunk/Ohana/src/imregister/detrend/db_names.c	(revision 6674)
@@ -25,5 +25,5 @@
   if (output.Modify) {
     if (status == -1) {
-      if (mkdirhier (dBPath) == -1) {
+      if (mkdirhier (dBPath, S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
 	fprintf (stderr, "ERROR: can't find or create path %s\n", dBPath);
 	exit (1);
@@ -34,5 +34,5 @@
     status = stat (dBTrash, &statbuf);
     if (status == -1) {
-      if (mkdirhier (dBTrash) == -1) {
+      if (mkdirhier (dBTrash, S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
 	fprintf (stderr, "ERROR: detrend dB trash not found %s\n", dBTrash);
 	exit (1);
Index: /trunk/Ohana/src/imregister/detrend/entry.c
===================================================================
--- /trunk/Ohana/src/imregister/detrend/entry.c	(revision 6673)
+++ /trunk/Ohana/src/imregister/detrend/entry.c	(revision 6674)
@@ -50,5 +50,5 @@
   if (status == -1) {
     if (errno == ENOENT) {
-      if (mkdirhier (fullpath) == -1) {
+      if (mkdirhier (fullpath, S_IRWXU | S_IRWXG | S_IRWXO) == -1) {
 	fprintf (stderr, "ERROR: can't create path %s\n", fullpath);
 	exit (1);
Index: /trunk/Ohana/src/kii/event/InterpretKeys.c
===================================================================
--- /trunk/Ohana/src/kii/event/InterpretKeys.c	(revision 6673)
+++ /trunk/Ohana/src/kii/event/InterpretKeys.c	(revision 6674)
@@ -3,21 +3,51 @@
 int InterpretKeys (Graphic *graphic, Layout *layout, XEvent *event) {
 
+  double X, Y;
   int    status;
   char   string[10];
   KeySym keysym;
   XComposeStatus  composestatus;
+  XKeyEvent *keyevent;
 
-  XLookupString ((XKeyEvent *)event, string, 9, &keysym, &composestatus);
+  keyevent = (XKeyEvent *) event;
+  XLookupString (keyevent, string, 9, &keysym, &composestatus);
+  
 
   switch (keysym) {
 
-  case XK_Tab:
-    MOVE_POINTER = MOVE_POINTER ^ TRUE;
-    if (MOVE_POINTER) UpdatePointer (graphic, layout, (XMotionEvent *)event);
-    status = TRUE;
-    break;
+    case XK_KP_Enter:
+    case XK_Return:
+      Screen_to_Image (&X, &Y, (double)keyevent[0].x, (double)keyevent[0].y, layout);
+      X = 0.5*layout[0].matrix.Naxis[0] - X;
+      Y = 0.5*layout[0].matrix.Naxis[1] - Y;
+      Reorient (graphic, layout, X, Y, 0);
+      break;
+    case XK_Prior:
+      Reorient (graphic, layout, layout[0].X, layout[0].Y, +1);
+      break;
+    case XK_Next:
+      Reorient (graphic, layout, layout[0].X, layout[0].Y, -1);
+      break;
+    case XK_Up:
+      Reorient (graphic, layout, layout[0].X, layout[0].Y + 50, 0);
+      break;
+    case XK_Down:
+      Reorient (graphic, layout, layout[0].X, layout[0].Y - 50, 0);
+      break;
+    case XK_Left:
+      Reorient (graphic, layout, layout[0].X + 50, layout[0].Y, 0);
+      break;
+    case XK_Right:
+      Reorient (graphic, layout, layout[0].X - 50, layout[0].Y, 0);
+      break;
 
-  default:
-    status = TRUE;
+    case XK_Tab:
+      MOVE_POINTER = MOVE_POINTER ^ TRUE;
+      if (MOVE_POINTER) UpdatePointer (graphic, layout, (XMotionEvent *)event);
+      status = TRUE;
+      break;
+
+    default:
+      status = TRUE;
   }
 
@@ -35,5 +65,5 @@
   this is all old, but a good example for putting in the cursor motion.
 
-    break;
+  break;
 */
 
Index: /trunk/Ohana/src/kii/event/InterpretPresses.c
===================================================================
--- /trunk/Ohana/src/kii/event/InterpretPresses.c	(revision 6673)
+++ /trunk/Ohana/src/kii/event/InterpretPresses.c	(revision 6674)
@@ -10,5 +10,5 @@
   
   if ((event[0].type == ButtonPress) && InPicture (event, &layout[0].picture)) {
-    Reorient (graphic, layout, event);
+    ReorientOnButton (graphic, layout, event);
   }
 
@@ -50,2 +50,24 @@
 }
 
+void ReorientOnButton (Graphic *graphic, Layout *layout, XButtonEvent *mouse_event) {
+
+  double X, Y;
+
+  Screen_to_Image (&X, &Y, (double)mouse_event[0].x, (double)mouse_event[0].y, layout);
+  X = 0.5*layout[0].matrix.Naxis[0] - X;
+  Y = 0.5*layout[0].matrix.Naxis[1] - Y;
+
+  switch (mouse_event[0].button) {
+    case 1:
+      Reorient (graphic, layout, X, Y, 0);
+      break;
+    case 2:
+      Reorient (graphic, layout, X, Y, -1);
+      break;
+    case 3:
+      Reorient (graphic, layout, X, Y, +1);
+      break;
+    default:
+      break;
+  }
+}
Index: /trunk/Ohana/src/kii/include/prototypes.h
===================================================================
--- /trunk/Ohana/src/kii/include/prototypes.h	(revision 6673)
+++ /trunk/Ohana/src/kii/include/prototypes.h	(revision 6674)
@@ -37,5 +37,6 @@
 void          Remap               PROTO((Graphic *, Layout *, Matrix  *));
 int           NewPicture          PROTO((Graphic *, Layout *));
-void          Reorient            PROTO((Graphic *, Layout *, XButtonEvent *));
+void          Reorient            PROTO((Graphic *, Layout *, double, double, int));
+void          ReorientOnButton    PROTO((Graphic *, Layout *, XButtonEvent *));
 int           UpdatePointer       PROTO((Graphic *, Layout *, XMotionEvent *));
 void          CrossHairs          PROTO((Graphic *, Layout *));
Index: /trunk/Ohana/src/kii/picture/Reorient.c
===================================================================
--- /trunk/Ohana/src/kii/picture/Reorient.c	(revision 6673)
+++ /trunk/Ohana/src/kii/picture/Reorient.c	(revision 6674)
@@ -1,26 +1,17 @@
 # include "Ximage.h"
 
-void Reorient (Graphic *graphic, Layout *layout, XButtonEvent *mouse_event) {
-
-  int x, y, dummy2;
-  double X0, Y0;
-  unsigned int dummy3;
-  Window dummy1;
+void Reorient (Graphic *graphic, Layout *layout, double X, double Y, int mode) {
 
   if (layout[0].expand == 0)
     layout[0].expand = 1;
 
-  Screen_to_Image (&X0, &Y0, (double)mouse_event[0].x, (double)mouse_event[0].y, layout);
-  X0 = 0.5*layout[0].matrix.Naxis[0] - X0;
-  Y0 = 0.5*layout[0].matrix.Naxis[1] - Y0;
-
-  switch (mouse_event[0].button) {
-  case 1:
-    if ((layout[0].X != X0) || (layout[0].Y != Y0)) {
-      layout[0].X = X0;
-      layout[0].Y = Y0;
+  switch (mode) {
+  case 0:
+    if ((layout[0].X != X) || (layout[0].Y != Y)) {
+      layout[0].X = X;
+      layout[0].Y = Y;
     }
     break;
-  case 2: 
+  case -1: 
     layout[0].expand--;
     if ((layout[0].expand == 0) || (layout[0].expand == -1))
@@ -31,8 +22,8 @@
       return;
     }
-    layout[0].X = X0;
-    layout[0].Y = Y0;
+    layout[0].X = X;
+    layout[0].Y = Y;
     break;
-  case 3:
+  case +1:
     layout[0].expand++;
     if ((layout[0].expand == 0) || (layout[0].expand == -1))
@@ -43,6 +34,6 @@
       return;
     }
-    layout[0].X = X0;
-    layout[0].Y = Y0;
+    layout[0].X = X;
+    layout[0].Y = Y;
     break;
   }
@@ -51,5 +42,8 @@
   Refresh (graphic, layout, 0);
  
-# ifndef NOWARP  /* the "warp" function seems to be a problem on SUNs for some reason */
+  XFlush (graphic[0].display);
+}
+
+# if (0) /* the "warp" function seems to be a problem on SUNs for some reason */
   XQueryPointer (graphic[0].display, graphic[0].window, &dummy1, &dummy1, &dummy2, &dummy2, &x, &y, &dummy3); 
   if ((x > layout[0].picture.x) && (x < layout[0].picture.x + layout[0].picture.dx) &&
@@ -62,4 +56,2 @@
 # endif
 
-  XFlush (graphic[0].display);
-}
Index: /trunk/Ohana/src/libdvo/src/dvo_image.c
===================================================================
--- /trunk/Ohana/src/libdvo/src/dvo_image.c	(revision 6673)
+++ /trunk/Ohana/src/libdvo/src/dvo_image.c	(revision 6674)
@@ -5,5 +5,5 @@
 
   /* lock the image catalog */
-  _check_permissions (filename);
+  if (!check_file_access (filename, FALSE, TRUE)) return (FALSE);
 
   db[0].lockstate = lockstate;
Index: /trunk/Ohana/src/libdvo/src/skyregion_io.c
===================================================================
--- /trunk/Ohana/src/libdvo/src/skyregion_io.c	(revision 6673)
+++ /trunk/Ohana/src/libdvo/src/skyregion_io.c	(revision 6674)
@@ -89,5 +89,4 @@
   struct stat filestat;
   SkyTable *sky;
-  int status;
 
   /* first option: CATDIR/SkyTable.fits */
Index: /trunk/Ohana/src/libohana/include/ohana.h
===================================================================
--- /trunk/Ohana/src/libohana/include/ohana.h	(revision 6673)
+++ /trunk/Ohana/src/libohana/include/ohana.h	(revision 6674)
@@ -116,7 +116,8 @@
 char   *fileextname            PROTO((char *file));
 char   *findexec               PROTO((int argc, char **argv));
-int     mkdirhier              PROTO((char *path));
+int     mkdirhier              PROTO((char *path, int mode));
 void    make_backup            PROTO((char *filename));
 int     check_file_access      PROTO((char *basefile, int backup, int verbose));
+int     check_file_exec        PROTO((char *filename));
 
 /* in glockfile.c */
Index: /trunk/Ohana/src/libohana/src/findexec.c
===================================================================
--- /trunk/Ohana/src/libohana/src/findexec.c	(revision 6673)
+++ /trunk/Ohana/src/libohana/src/findexec.c	(revision 6674)
@@ -1,5 +1,5 @@
 # include <ohana.h>
 
-int _check_permissions (char *filename) {
+int check_file_exec (char *filename) {
   
   struct stat filestat;
@@ -48,5 +48,5 @@
     if (VERBOSE) fprintf (stderr, "directory %s does not exist, creating...\n", path);
     cmode = S_IRWXU | S_IRWXG | S_IRWXO;
-    status = mkdir (path, cmode);
+    status = mkdirhier (path, cmode);
     if (status == -1) {
       if (VERBOSE) fprintf (stderr, "can't create %s\n", path);
@@ -212,5 +212,5 @@
   /* if given an absolute or relative path, use it */
   if (strchr (argv[0], '/') != (char *) NULL) {
-    status = _check_permissions (argv[0]);
+    status = check_file_exec (argv[0]);
     if (status) {
       if (realpath (argv[0], path) == (char *) NULL) return ((char *) NULL);
@@ -245,5 +245,5 @@
       }
       sprintf (name, "%s/%s", path, argv[0]);
-      status = _check_permissions (name);
+      status = check_file_exec (name);
 
       if (status) {
@@ -257,13 +257,16 @@
 }
 
-int mkdirhier (char *path) {
+/* make directory hierarchy, 0: success, -1: failure (just like mkdir) */
+int mkdirhier (char *path, int mode) {
 
   char *tpath;
 
-  if (mkdir (path, 0777)) {
+  /* force addition of user exec/read/write */
+  mode |= S_IRWXU;
+  if (mkdir (path, mode)) {
     if (errno == ENOENT) { 
       tpath = pathname (path);
-      if (!mkdirhier (tpath)) {
-	if (mkdir (path, 0777)) {
+      if (!mkdirhier (tpath, mode)) {
+	if (mkdir (path, mode)) {
 	  return (-1);
 	} else {
Index: /trunk/Ohana/src/markrock/src/markrock.c
===================================================================
--- /trunk/Ohana/src/markrock/src/markrock.c	(revision 6673)
+++ /trunk/Ohana/src/markrock/src/markrock.c	(revision 6674)
@@ -33,6 +33,6 @@
 
   /* if lockfile exists, program will complain and quit */
-  check_permissions (argv[1]);
-  check_permissions (RockCat);
+  if (!check_file_access (argv[1], TRUE, TRUE)) exit (1);
+  if (!check_file_access (RockCat, TRUE, TRUE)) exit (1);
 
   catalog.filename = argv[1];
