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 */