File ghostscript-8.61-pipe.dif of Package ghostscript-library

--- src/gsdevice.c
+++ src/gsdevice.c	2005-03-17 00:00:00.000000000 +0100
@@ -882,7 +882,7 @@ gx_device_open_output_file(const gx_devi
 	if (!parsed.fname)
 	    return_error(gs_error_undefinedfilename);
 	strcpy(fmode, gp_fmode_wb);
-  	if (positionable)
+  	if (positionable && strcmp(parsed.iodev->dname, "%pipe%"))
   	    strcat(fmode, "+");
  	code = parsed.iodev->procs.fopen(parsed.iodev, parsed.fname, fmode,
   					 pfile, NULL, 0);
--- src/imainarg.c
+++ src/imainarg.c	2007-11-06 10:42:50.073965358 +0000
@@ -248,9 +248,10 @@ gs_main_run_start(gs_main_instance * min
 static int
 swproc(gs_main_instance * minst, const char *arg, arg_list * pal)
 {
+    struct stat rstat;
     char sw = arg[1];
     ref vtrue;
-    int code = 0;
+    int code = 0, fd;
 #undef initial_enter_name
 #define initial_enter_name(nstr, pvalue)\
   i_initial_enter_name(minst->i_ctx_p, nstr, pvalue)
@@ -262,7 +263,10 @@ swproc(gs_main_instance * minst, const c
 	    return 1;
 	case 0:		/* read stdin as a file char-by-char */
 	    /* This is a ******HACK****** for Ghostview. */
+	    fd = fileno(minst->heap->gs_lib_ctx->fstdin);
 	    minst->heap->gs_lib_ctx->stdin_is_interactive = true;
+	    if ((fd == 0) && (fstat(fd, &rstat) == 0) && !S_ISCHR(rstat.st_mode))
+		minst->heap->gs_lib_ctx->stdin_is_interactive = false;
 	    goto run_stdin;
 	case '_':	/* read stdin with normal buffering */
 	    minst->heap->gs_lib_ctx->stdin_is_interactive = false;
--- src/ziodevsc.c
+++ src/ziodevsc.c	2007-11-06 11:30:32.369550149 +0000
@@ -26,6 +26,8 @@
 #include "ifilter.h"
 #include "store.h"
 
+#include <sys/ioctl.h>
+
 /* Define the special devices. */
 const char iodev_dtype_stdio[] = "Special";
 #define iodev_special(dname, init, open) {\
@@ -95,11 +97,19 @@ s_stdin_read_process(stream_state * st, 
     if (wcount <= 0)
 	return 0;
 
+    count = 0;
+    if (mem->gs_lib_ctx->stdin_is_interactive) {
+	(void)ioctl(fileno(mem->gs_lib_ctx->fstdin), FIONREAD, &count);
+	if (count == 0)
+	    count++;
+	if (wcount > count)
+	    wcount = count;
+    }
+
     /* do the callout */
     if (mem->gs_lib_ctx->stdin_fn)
 	count = (*mem->gs_lib_ctx->stdin_fn)
-	    (mem->gs_lib_ctx->caller_handle, (char *)pw->ptr + 1,
-	     mem->gs_lib_ctx->stdin_is_interactive ? 1 : wcount);
+	    (mem->gs_lib_ctx->caller_handle, (char *)pw->ptr + 1, wcount);
     else
 	count = gp_stdin_read((char *)pw->ptr + 1, wcount,
 		      mem->gs_lib_ctx->stdin_is_interactive,
--- src/ziodevs.c
+++ src/ziodevs.c	2007-11-06 11:31:28.124646326 +0000
@@ -24,6 +24,8 @@
 #include "files.h"
 #include "store.h"
 
+#include <sys/ioctl.h>
+
 /* Define the special devices. */
 const char iodev_dtype_stdio[] = "Special";
 #define iodev_special(dname, init, open) {\
@@ -92,6 +94,16 @@ s_stdin_read_process(stream_state * st, 
 
     if (wcount <= 0)
 	return 0;
+
+    count = 0;
+    if (st->memory->gs_lib_ctx->stdin_is_interactive) {
+        (void)ioctl(fileno(st->memory->gs_lib_ctx->fstdin), FIONREAD, &count);
+        if (count == 0)
+            count++;
+        if (wcount > count)
+            wcount = count;
+    }
+
     count = gp_stdin_read( (char*) pw->ptr + 1, wcount,
 			   st->memory->gs_lib_ctx->stdin_is_interactive, file);
     pw->ptr += (count < 0) ? 0 : count;
openSUSE Build Service is sponsored by