#! /bin/sh -e
## 15_recover_errormsg.dpatch by Ian Jackson <sysadmin@chiark.greenend.org.uk>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Be a little bit more useful with recover's error messages

if [ $# -ne 1 ]; then
    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
    exit 1
fi
case "$1" in
    -patch) patch -f --no-backup-if-mismatch -p1 < $0;;
    -unpatch) patch -f --no-backup-if-mismatch -R -p1 < $0;;
    *)
        echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
        exit 1;;
esac

exit 0

--- nethack/util/recover.c~	2003-10-18 16:08:36.000000000 -0700
+++ nethack/util/recover.c	2003-10-18 16:18:46.000000000 -0700
@@ -39,7 +39,7 @@
 #define Fprintf	(void)nhce_message
 static void nhce_message(FILE*, const char*, ...);
 #endif
-
+#define Perror  (void)perror
 #define Close	(void)close
 
 #ifdef UNIX
@@ -65,6 +65,7 @@
 #endif
 char savename[SAVESIZE]; /* holds relative path of save file from playground */
 
+const char *dir = (char*)0;
 
 int
 main(argc, argv)
@@ -72,7 +73,6 @@
 char *argv[];
 {
 	int argno;
-	const char *dir = (char *)0;
 #ifdef AMIGA
 	char *startdir = (char *)0;
 #endif
@@ -138,7 +138,8 @@
 	startdir = getcwd(0,255);
 #endif
 	if (dir && chdir((char *) dir) < 0) {
-		Fprintf(stderr, "%s: cannot chdir to %s.\n", argv[0], dir);
+		Fprintf(stderr, "%s: cannot chdir:", argv[0]);
+                Perror(dir);
 		exit(EXIT_FAILURE);
 	}
 
@@ -275,7 +276,9 @@
 	  	Fprintf(stderr,
 			"\nTrouble accessing level 0 (errno = %d).\n", errno);
 #endif
-	    Fprintf(stderr, "Cannot open level 0 for %s.\n", basename);
+	    Fprintf(stderr, "Cannot open level 0 for %s in directory %s: ",
+                basename, dir);
+            Perror(lock);
 	    return(-1);
 	}
 	if (read(gfd, (genericptr_t) &hpid, sizeof hpid) != sizeof hpid) {
@@ -297,7 +300,8 @@
 		!= sizeof savename) ||
 	    (read(gfd, (genericptr_t) &version_data, sizeof version_data)
 		!= sizeof version_data)) {
-	    Fprintf(stderr, "Error reading %s -- can't recover.\n", lock);
+	    Fprintf(stderr, "Error reading, can't recover: ");
+            Perror(lock);
 	    Close(gfd);
 	    return(-1);
 	}
@@ -310,14 +314,16 @@
 	 */
 	sfd = create_savefile();
 	if (sfd < 0) {
-	    Fprintf(stderr, "Cannot create savefile %s.\n", savename);
+	    Fprintf(stderr, "Cannot create savefile in %s: ", dir);
+            Perror(savename);
 	    Close(gfd);
 	    return(-1);
 	}
 
 	lfd = open_levelfile(savelev);
 	if (lfd < 0) {
-	    Fprintf(stderr, "Cannot open level of save for %s.\n", basename);
+	    Fprintf(stderr, "Cannot open level of save for %s: ", basename);
+            Perror(lock);
 	    Close(gfd);
 	    Close(sfd);
 	    return(-1);
@@ -325,7 +331,8 @@
 
 	if (write(sfd, (genericptr_t) &version_data, sizeof version_data)
 		!= sizeof version_data) {
-	    Fprintf(stderr, "Error writing %s; recovery failed.\n", savename);
+	    Fprintf(stderr, "Error writing, recovery failed: ");
+            Perror(savename);
 	    Close(gfd);
 	    Close(sfd);
 	    return(-1);
