Bob Krzaczek wrote:
> I'm investigating the netatalk PAP daemon and psf filter, with an eye
> towards speeding them up, optionally turning off the blasted CR->NL
> conversion, and handling PostScript binary/binary-tagged data correctly
> (our users don't always remember to select "ASCII" in their printer
> setups, and changing the PPD's language level to "1" doesn't always do
> the trick for some programs, unfortunately).

Hi!
I'm working in DTP studio. We take many PS jobs to print on our imagesetter.
Several jobs printed through linux/netatalk spooler aren't go well because
of cr/lf mangling doing by papd. So I maded patch that preventing papd to
change line ending and several other things like removing ctrl-d char after
EOF. This patch include better handling of large binary jobs done by one
person in this mailinglist (sorry, but forget his name). I'm using it over
a year so assume its quite stable :) and I don't seen any job refusing print
by papd.
See attachment.
-- 
.-.  .-.----.----.----.    ---         ,               ---
| |/\| | -- | ---| -- |    --- Piotr Waskiewicz * WasP ---
|  /\  | ,. |--- | ,--'    ---     UIN: 5654159        ---
`-'  `-'-'`-'----'-'       ---   [EMAIL PROTECTED]   ---
diff -udr netatalk.orig/etc/papd/file.c netatalk/etc/papd/file.c
--- netatalk.orig/etc/papd/file.c       Thu Nov  5 08:59:56 1998
+++ netatalk/etc/papd/file.c    Sun Nov 15 09:55:27 1998
@@ -24,6 +24,7 @@
     /* get a line */
     for ( p = pf->pf_cur; p < pf->pf_end; p++ ) {
-       if ( *p == '\n' || *p == '\r' ) {
+       if ( *p == '\n' || *p == '\r' || ((p - pf->pf_cur)>4096) ) {
+           if ( *(p+1) == '\n' ) p++;
            break;
        }
     }
diff -udr netatalk.orig/etc/papd/headers.c netatalk/etc/papd/headers.c
--- netatalk.orig/etc/papd/headers.c    Fri May 30 02:29:48 1997
+++ netatalk/etc/papd/headers.c Tue Nov 17 15:39:06 1998
@@ -26,31 +26,31 @@
 
     for ( p = start; p < stop; p++ ) {
        if ( *p == ':' ) {
-           break;
+           p++; break;
        }
     }
 
     for ( ; p < stop; p++ ) {
-       if ( *p == '(' ) {
+       if ( *p == '(' || *p > ' ') {
            break;
        }
     }
 
     for ( q = p; q < stop; q++ ) {
-       if ( *q == ')' ) {
+       if ( *q == ')' || *q < ' ') {
            break;
        }
     }
 
     if ( q < stop && p < stop ) {
-       p++;
+       if ( *p == '(' ) p++;
        c = *q;
        *q = '\0';
        lp_job( p );
        *q = c;
     }
 
-    *stop = '\n';
+/*    *stop = '\n'; */
     lp_write( start, stop - start + 1 );
     compop();
     consumetomark( start, stop, in );
diff -udr netatalk.orig/etc/papd/lp.c netatalk/etc/papd/lp.c
--- netatalk.orig/etc/papd/lp.c Thu Jun 26 22:48:43 1997
+++ netatalk/etc/papd/lp.c      Tue Nov 17 15:34:04 1998
@@ -150,7 +150,8 @@
     char       *p, *q;
 
     if ( lp.lp_job != NULL ) {
-       free( lp.lp_job );
+       /*free( lp.lp_job );*/
+       return;
     }
     if (( lp.lp_job = (char *)malloc( strlen( job ) + 1 )) == NULL ) {
        syslog( LOG_ERR, "malloc: %m" );
diff -udr netatalk.orig/etc/papd/magics.c netatalk/etc/papd/magics.c
--- netatalk.orig/etc/papd/magics.c     Fri May 30 02:28:03 1997
+++ netatalk/etc/papd/magics.c  Thu Nov 12 14:56:26 1998
@@ -57,7 +57,7 @@
            }
 
            /* write to file */
-           *stop = '\n';
+           /* *stop = '\n'; */
            lp_write( start, stop - start + 1 );
            consumetomark( start, stop, infile );
        }
@@ -126,7 +126,7 @@
            }
        }
 
-       *stop = '\n';
+       /* *stop = '\n'; */
        lp_write( start, stop - start + 1 );
        consumetomark( start, stop, in );
     }
diff -udr netatalk.orig/etc/papd/session.c netatalk/etc/papd/session.c
--- netatalk.orig/etc/papd/session.c    Thu Nov  5 08:56:55 1998
+++ netatalk/etc/papd/session.c Tue Nov 17 13:10:58 1998
@@ -162,10 +162,10 @@
                 * If we're in the middle of a file, clean up.
                 */
                if (( infile.pf_state & PF_BOT ) ||
-                       ( PF_BUFSIZ( &infile ) == 0 &&
-                       ( infile.pf_state & PF_EOF ))) {
-                   lp_print();
-               } else {
+               ((PF_BUFSIZ(&infile) == 0 || PF_BUFSIZ(&infile) == 1) && 
+                       ( infile.pf_state & PF_EOF ))) { /* this 1 is added */
+                   lp_print();                          /*to handle ctrl-d */
+               } else {                                 /*after %%EOF      */
                    lp_cancel();
                }
 
diff -udr netatalk.orig/etc/psf/psf.c netatalk/etc/psf/psf.c
--- netatalk.orig/etc/psf/psf.c Wed Apr  8 19:43:31 1998
+++ netatalk/etc/psf/psf.c      Sun Nov 15 18:24:44 1998
@@ -252,6 +252,10 @@
        } else if ( inlen >= 2 && inbuf[ 0 ] == '\033' && inbuf[ 1 ] == '%' ) {
            syslog( LOG_INFO, "PostScript w/PJL" );
            rc = copyio();      /* PostScript */
+       } else if ( inlen >= 2 && inbuf[ 0 ] == '\004' && inbuf[ 1 ] == '%' ) {
+           inbuf[ 0 ] = ' ';
+           syslog( LOG_INFO, "PostScript. Ctrl-d removed!" );
+           rc = copyio();      /* PostScript */
        } else {
            syslog( LOG_INFO, "straight text" );
            rc = textps();      /* straight text */

Reply via email to