Принтер довольно неплохо работает вместе с CUPS, но однако, получить статус работы или ошибку, в случае, если печать по каким-то причинам происходит (к примеру - отсутствие бумаги), не представляется возможным. Вместо этого, любая вышедшая на печать работа тот час же считается завершенной. С другими принтерами (как, например, с моим HP Desjket 1100) такой проблемы не наблюдается. В чем же состоит типовое решение проблемы?

В коде CUPS, однако, есть фрагмент, отвечающий за загрузку задания на печать в принтер и, вроде как, способный отлавливать подобные ошибки.
Код:
/*
* backend/runloop.c...
*/
if (print_bytes && FD_ISSET(device_fd, &output))
{
if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0)
{
/*
* Write error - bail if we don't see an error we can retry...
*/
if (errno == ENOSPC)
{
if (paperout != 1)
{
fputs("STATE: +media-empty-error\n", stderr);
_cupsLangPuts(stderr, _("ERROR: Out of paper!\n"));
paperout = 1;
}
}
else if (errno == ENXIO)
{
if (offline != 1)
{
fputs("STATE: +offline-error\n", stderr);
_cupsLangPuts(stderr, _("INFO: Printer is currently off-line.\n"));
offline = 1;
}
}
else if (errno != EAGAIN && errno != EINTR && errno != ENOTTY)
{
fprintf(stderr, _("ERROR: Unable to write print data: %s\n"),
strerror(errno));
return (-1);
}
}
else
{
if (paperout)
{
fputs("STATE: -media-empty-error\n", stderr);
paperout = 0;
}
if (offline)
{
fputs("STATE: -offline-error\n", stderr);
_cupsLangPuts(stderr, _("INFO: Printer is now on-line.\n"));
offline = 0;
}
fprintf(stderr, "DEBUG: Wrote %d bytes of print data...\n", (int)bytes);
print_bytes -= bytes;
print_ptr += bytes;
total_bytes += bytes;
}
однако, вызов FD_ISSET в условии всегда возвращает 0, показывая, что никакой обратной информации от принтера не приходит. Аналогичная ситуация проявляется и во многих остальных частях кода. Такое ощущение, что к принтеру надо как-то... по-особому обращаться, чтобы заставить его говорить. Как-то так же... как виндовый драйвер.
Интересно так же, встречаются ли такие проблемы с другими принтерами, и как они решаются (и решаются ли линуксоидами вообще?) в таких ситуациях.