How to print from Windows XP to cups-lpd

Kai Lanz lanz at stanford.edu
Sun Sep 6 16:40:09 PDT 2009


> Kai Lanz wrote:
>
> > Short version: How do I print from a Windows XP client to cups-lpd?
> >
> > Then in /var/log/messages, we see an error from cups-lpd:
> >
> > Sep  4 14:07:18 pangea2 cups-lpd[2219]: Connection from a65pc20
> > (171.64.175.30)
> > Sep  4 14:07:18 pangea2 cups-lpd[2219]: Receive print job for a65-laserjet
> > Sep  4 14:07:18 pangea2 cups-lpd[2219]: Error while reading file - Success
> > Sep  4 14:07:18 pangea2 cups-lpd[2219]: Closing connection
> >
> > The odd-looking message, "Error while reading file - Success", comes from
> > cups-lpd.c (line 714, in the source for v1.1.23). It would seem to
> > indicate that the previous fread or write operation returned <1 byte,
> > though the operation itself did not fail (meaning, errno was set to 0). I
> > don't know what that implies about the file cups-lpd got from the PC.
>
> Can you manage to temporarily replace the cups-lpd by a smple script that
> dumps the input to a file and post (an URL to) that?
>
> If I can have a detailed look into such a dump, I could check if it is the
> same issue for which I patched cups-lpd for both 1.1.19 and 1.3.5 some time
> ago.
>
> Helge

That's a great idea, but the answer seems to be no, I haven't yet managed to
successfully replace cups-lpd by a program that dumps the input to a file. The
best I can manage is to capture the first line of the control file, I think:

00000000  02 61 36 35 2d 6c 61 73 65 72 6a 65 74 0a        .a65-laserjet.

This was obtained from the following little program that just reads everything
coming in on stdin and writes it to a file:

#include <string.h>
#include <sys/file.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    char buf[2];
    int fd;
    char name[] = "/var/tmp/cups.XXXXXX";

    daemon(1,1);
    fd = mkstemp(name);
        if (fd < 0){
            exit(1);
        }

    while((buf[0] = fgetc(stdin)) != EOF)
        write(fd,buf,1);

    close(fd);
    return 0;
}

This program works perfectly if I run it by hand, redirecting its input from
some random text-file. But I'm sure it's too simple-minded to do what we want
when called by xinetd as a replacement for lpd. Can you point me to a working example of such a script?

-- Kai




More information about the cups mailing list