Index: /trunk/Ohana/src/opihi/cmd.basic/file.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.basic/file.c	(revision 41404)
+++ /trunk/Ohana/src/opihi/cmd.basic/file.c	(revision 41405)
@@ -5,10 +5,45 @@
   /* usage: file (filename) [var] */
 
-  int status, vstat;
+  int status, vstat, N;
   struct stat fstats;
 
-  if (argc < 2) {
-    gprint (GP_ERR, "USAGE: file (filename) [var]\n");
+  int CAN_READ = FALSE;
+  if ((N = get_argument (argc, argv, "-can-read"))) {
+    remove_argument (N, &argc, argv);
+    CAN_READ = TRUE;
+  }
+  int CAN_WRITE = FALSE;
+  if ((N = get_argument (argc, argv, "-can-write"))) {
+    remove_argument (N, &argc, argv);
+    CAN_WRITE = TRUE;
+  }
+
+  if ((argc < 2) || (CAN_READ && CAN_WRITE)) {
+    gprint (GP_ERR, "USAGE: file (filename) [var] [-can-read] [-can-write]\n");
+    gprint (GP_ERR, "  NOTE: only one of -can-read or -can-write is allowed\n");
     return (FALSE);
+  }
+
+  if (CAN_READ) {
+    status = !access (argv[1], F_OK | R_OK);
+    if (argc == 3) {
+      set_int_variable (argv[2], status);
+    } else {
+      gprint (GP_ERR, "file %s can", argv[1]);
+      if (!status) gprint (GP_ERR, "not");
+      gprint (GP_ERR, " be read\n");
+    }
+    return TRUE;
+  }
+  if (CAN_WRITE) {
+    status = !access (argv[1], F_OK | R_OK | W_OK);
+    if (argc == 3) {
+      set_int_variable (argv[2], status);
+    } else {
+      gprint (GP_ERR, "file %s can", argv[1]);
+      if (!status) gprint (GP_ERR, "not");
+      gprint (GP_ERR, " be written\n");
+    }
+    return TRUE;
   }
 
@@ -18,13 +53,9 @@
 
   if (argc == 3) {
-      
     set_int_variable (argv[2], vstat);
-
   } else {
-
     gprint (GP_ERR, "file %s is ", argv[1]);
     if (!vstat) gprint (GP_ERR, "not ");
     gprint (GP_ERR, "found\n");
-    
   }
   return (TRUE);
