Blob Blame History Raw
diff -rup less-436-orig/filename.c less-436/filename.c
--- less-436-orig/filename.c	2009-07-06 22:52:23.000000000 +0200
+++ less-436/filename.c	2011-02-09 16:36:59.508940154 +0100
@@ -843,6 +843,16 @@ open_altfile(filename, pf, pfd)
 #else
 		lessopen++;
 		returnfd = 1;
+
+		if (*lessopen == '|') {
+			/*
+			 * If there is another vertical bar |, after
+			 * the first one, it indicates a "pipe preprocessor"
+			 * with correct exit status.
+			 */
+			lessopen++;
+			returnfd = 2;
+		}
 #endif
 	}
 	if (*lessopen == '-') {
@@ -879,17 +888,32 @@ open_altfile(filename, pf, pfd)
 		 */
 		f = fileno(fd);
 		SET_BINARY(f);
+		*pfd = (void *) fd;
+		*pf = f;
 		if (read(f, &c, 1) != 1)
 		{
 			/*
-			 * Pipe is empty.  This means there is no alt file.
+			 * Error or pipe is empty. Close it and eventually
+			 * check exit status of the pipe process.
 			 */
-			pclose(fd);
+			if (pclose(fd) == 0 && returnfd == 2) {
+				/*
+				 * Exit status was zero, so the EOF was correct
+				 * empty output. Let the program open /dev/null
+				 * instead, as the pipe is already closed.
+				 * Set force_open to omit bad_file() check
+				 * failure, as it is special 'c' pseudo-device.
+				 */
+				*pf = 0;
+				*pfd = NULL;
+				force_open = 1;
+				return (save("/dev/null"));
+			}
+			*pf = 0;
+			*pfd = NULL;
 			return (NULL);
 		}
 		ch_ungetchar(c);
-		*pfd = (void *) fd;
-		*pf = f;
 		return (save("-"));
 	}
 #endif
diff -rup less-436-orig/less.nro less-436/less.nro
--- less-436-orig/less.nro	2011-02-09 16:00:12.520936431 +0100
+++ less-436/less.nro	2011-02-09 16:30:33.161235986 +0100
@@ -1147,11 +1147,26 @@ lesspipe.sh:
 .br
 		;;
 .br
+	*)	exit 1
+.br
+		;;
+.br
 	esac
 .br
+	exit $?
+.br
 .PP
 To use this script, put it where it can be executed and set
 LESSOPEN="|lesspipe.sh %s".
+.PP
+The script should return zero if the output was valid and non-zero
+otherwise, so less could detect even a valid empty output
+(for example while uncompressing gzipped empty file).
+For backward-compatibility, this is not required by default. To turn
+this functionality there should be another vertical bar (|) straight
+after the first one in the LESSOPEN environment variable, eg.
+LESSOPEN="||lesspipe.sh %s".
+.PP
 When an input pipe is used, a LESSCLOSE postprocessor can be used,
 but it is usually not necessary since there is no replacement file
 to clean up.