Index: ChangeLog
===================================================================
--- ChangeLog	(revision 4e0f5458d2de9b38d7b040e5b8768536a61e4ec6)
+++ ChangeLog	(revision 95474d77b95d322778b31415b2c82ac723b35fa8)
@@ -4,6 +4,11 @@
 	Don't crash doing zlocate with bad tickets. [BZ 12]
 	Metion the path for the owlconf in intro.txt [BZ 54]
-	Print Better error message if startup fails due to unreadable
+	Print better error message if startup fails due to unreadable
 	   .owlconf [BZ 57]
+	In load-subs: Print an error message if the file is unreadable or
+	  doesn't exist, UNLESS load-subs is called with no arguments.  In
+	  that case only print an error if the file exists but isn't
+	  readable.  Still prints an error either way if zephyr reports a
+	  failure. [BZ 19]
 
 2.1.10
Index: functions.c
===================================================================
--- functions.c	(revision 82321497e7e8de1e9b5233d3003c271cc90569f6)
+++ functions.c	(revision 95474d77b95d322778b31415b2c82ac723b35fa8)
@@ -854,9 +854,24 @@
 }
 
+
+/* Load zephyr subscriptions from the named 'file' and load zephyr's
+ * default subscriptions as well.  An error message is printed if
+ * 'file' can't be opened or if zephyr reports an error in
+ * subscribing.
+ *
+ * If 'file' is NULL, this look for the default filename
+ * $HOME/.zephyr.subs.  If the file can not be opened in this case
+ * only, no error message is printed.
+ */
 void owl_function_loadsubs(char *file)
 {
   int ret, ret2;
-
-  ret=owl_zephyr_loadsubs(file);
+  char *foo;
+
+  if (file==NULL) {
+    ret=owl_zephyr_loadsubs(NULL, 0);
+  } else {
+    ret=owl_zephyr_loadsubs(file, 1);
+  }
 
   /* for backwards compatibility for now */
@@ -864,10 +879,16 @@
 
   if (!owl_context_is_interactive(owl_global_get_context(&g))) return;
-  if (ret==0) {
-    owl_function_makemsg("Subscribed to messages from file.");
+
+  foo=file?file:"file";
+  if (ret==0 && ret2==0) {
+    if (!file) {
+      owl_function_makemsg("Subscribed to messages.");
+    } else {
+      owl_function_makemsg("Subscribed to messages from %s", file);
+    }
   } else if (ret==-1) {
-    owl_function_error("Could not open file.");
+    owl_function_error("Could not read %s", foo);
   } else {
-    owl_function_error("Error subscribing to messages from file.");
+    owl_function_error("Error subscribing to messages");
   }
 }
Index: owl.c
===================================================================
--- owl.c	(revision 4e0f5458d2de9b38d7b040e5b8768536a61e4ec6)
+++ owl.c	(revision 95474d77b95d322778b31415b2c82ac723b35fa8)
@@ -373,5 +373,5 @@
     
     /* load subscriptions from subs file */
-    ret2=owl_zephyr_loadsubs(NULL);
+    ret2=owl_zephyr_loadsubs(NULL, 0);
 
     if (ret || ret2) {
Index: zephyr.c
===================================================================
--- zephyr.c	(revision 667a1b616e153b8d8b6996016985c530c56d4b1f)
+++ zephyr.c	(revision 95474d77b95d322778b31415b2c82ac723b35fa8)
@@ -67,9 +67,13 @@
 }
 
-/* return 0  on success
- *        -1 on file error
- *        -2 on subscription error
+/* Load zephyr subscriptions form 'filename'.  If 'filename' is NULL,
+ * the default file $HOME/.zephyr.subs will be used.
+ *
+ * Returns 0 on success.  If the file does not exist, return -1 if
+ * 'error_on_nofile' is 1, otherwise return 0.  Return -1 if the file
+ * exists but can not be read.  Return -2 if there is a failure from
+ * zephyr to load the subscriptions.
  */
-int owl_zephyr_loadsubs(char *filename)
+int owl_zephyr_loadsubs(char *filename, int error_on_nofile)
 {
 #ifdef HAVE_LIBZEPHYR
@@ -88,7 +92,8 @@
 
   ret=stat(subsfile, &statbuff);
-  if (ret) return(0);
-
-  ret=0;
+  if (ret) {
+    if (error_on_nofile==1) return(-1);
+    return(0);
+  }
 
   ZResetAuthentication();
@@ -96,38 +101,35 @@
   count=0;
   file=fopen(subsfile, "r");
-  if (file) {
-    while ( fgets(buffer, 1024, file)!=NULL ) {
-      if (buffer[0]=='#' || buffer[0]=='\n' || buffer[0]=='\n') continue;
-
-      if (buffer[0]=='-') {
-	start=buffer+1;
-      } else {
-	start=buffer;
-      }
-      
-      if (count >= 3000) break; /* also tell the user */
-
-      /* add it to the list of subs */
-      if ((tmp=(char *) strtok(start, ",\n\r"))==NULL) continue;
-      subs[count].zsub_class=owl_strdup(tmp);
-      if ((tmp=(char *) strtok(NULL, ",\n\r"))==NULL) continue;
-      subs[count].zsub_classinst=owl_strdup(tmp);
-      if ((tmp=(char *) strtok(NULL, " \t\n\r"))==NULL) continue;
-      subs[count].zsub_recipient=owl_strdup(tmp);
-
-      /* if it started with '-' then add it to the global punt list */
-      if (buffer[0]=='-') {
-	owl_function_zpunt(subs[count].zsub_class, subs[count].zsub_classinst, subs[count].zsub_recipient, 0);
-      }
-      
-      count++;
-    }
-    fclose(file);
-  } else {
-    count=0;
-    ret=-1;
-  }
+  if (!file) return(-1);
+  while ( fgets(buffer, 1024, file)!=NULL ) {
+    if (buffer[0]=='#' || buffer[0]=='\n' || buffer[0]=='\n') continue;
+    
+    if (buffer[0]=='-') {
+      start=buffer+1;
+    } else {
+      start=buffer;
+    }
+    
+    if (count >= 3000) break; /* also tell the user */
+    
+    /* add it to the list of subs */
+    if ((tmp=(char *) strtok(start, ",\n\r"))==NULL) continue;
+    subs[count].zsub_class=owl_strdup(tmp);
+    if ((tmp=(char *) strtok(NULL, ",\n\r"))==NULL) continue;
+    subs[count].zsub_classinst=owl_strdup(tmp);
+    if ((tmp=(char *) strtok(NULL, " \t\n\r"))==NULL) continue;
+    subs[count].zsub_recipient=owl_strdup(tmp);
+    
+    /* if it started with '-' then add it to the global punt list */
+    if (buffer[0]=='-') {
+      owl_function_zpunt(subs[count].zsub_class, subs[count].zsub_classinst, subs[count].zsub_recipient, 0);
+    }
+    
+    count++;
+  }
+  fclose(file);
 
   /* sub without defaults */
+  ret=0;
   if (ZSubscribeToSansDefaults(subs,count,0) != ZERR_NONE) {
     owl_function_error("Error subscribing to zephyr notifications.");
