summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Pielmeier <billie@gentoo.org>2012-04-11 18:33:38 +0000
committerDaniel Pielmeier <billie@gentoo.org>2012-04-11 18:33:38 +0000
commit107363258422cfe73a6e41f3fd3271a1f02af652 (patch)
tree58c7436170897297457f04e1cd5a1cf255e0447b /net-print/hplip
parentMask USE=jit on libzpaq for non-x86/amd64. (diff)
downloadgentoo-2-107363258422cfe73a6e41f3fd3271a1f02af652.tar.gz
gentoo-2-107363258422cfe73a6e41f3fd3271a1f02af652.tar.bz2
gentoo-2-107363258422cfe73a6e41f3fd3271a1f02af652.zip
Version bump.
(Portage version: 2.1.10.49/cvs/Linux i686)
Diffstat (limited to 'net-print/hplip')
-rw-r--r--net-print/hplip/ChangeLog9
-rw-r--r--net-print/hplip/files/hplip-3.12.4-cupsddk.patch14
-rw-r--r--net-print/hplip/files/hplip-3.12.4-desktop.patch18
-rw-r--r--net-print/hplip/files/hplip-3.12.4-fast-pp.patch855
-rw-r--r--net-print/hplip/files/hplip-3.12.4-htmldir.patch109
-rw-r--r--net-print/hplip/hplip-3.12.4.ebuild264
6 files changed, 1268 insertions, 1 deletions
diff --git a/net-print/hplip/ChangeLog b/net-print/hplip/ChangeLog
index 246d316a28f4..a18962e2b611 100644
--- a/net-print/hplip/ChangeLog
+++ b/net-print/hplip/ChangeLog
@@ -1,6 +1,13 @@
# ChangeLog for net-print/hplip
# Copyright 1999-2012 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/net-print/hplip/ChangeLog,v 1.219 2012/04/11 18:19:01 billie Exp $
+# $Header: /var/cvsroot/gentoo-x86/net-print/hplip/ChangeLog,v 1.220 2012/04/11 18:33:38 billie Exp $
+
+*hplip-3.12.4 (11 Apr 2012)
+
+ 11 Apr 2012; Daniel Pielmeier <billie@gentoo.org> +hplip-3.12.4.ebuild,
+ +files/hplip-3.12.4-cupsddk.patch, +files/hplip-3.12.4-desktop.patch,
+ +files/hplip-3.12.4-fast-pp.patch, +files/hplip-3.12.4-htmldir.patch:
+ Version bump.
11 Apr 2012; Daniel Pielmeier <billie@gentoo.org>
-files/hplip-3.11.1-udev-attrs.patch:
diff --git a/net-print/hplip/files/hplip-3.12.4-cupsddk.patch b/net-print/hplip/files/hplip-3.12.4-cupsddk.patch
new file mode 100644
index 000000000000..968ae47e6d27
--- /dev/null
+++ b/net-print/hplip/files/hplip-3.12.4-cupsddk.patch
@@ -0,0 +1,14 @@
+--- installer/core_install.py.old 2012-04-11 19:19:24.788467395 +0200
++++ installer/core_install.py 2012-04-11 19:22:31.548172475 +0200
+@@ -1063,9 +1063,8 @@
+ def check_cupsddk(self):
+ log.debug("Checking for cups-ddk...")
+ # TODO: Compute these paths some way or another...
+- #return check_tool("/usr/lib/cups/driver/drv list") and os.path.exists("/usr/share/cupsddk/include/media.defs")
+- return (check_file('drv', "/usr/lib/cups/driver") or check_file('drv', "/usr/lib64/cups/driver")) and \
+- check_file('media.defs', "/usr/share/cupsddk/include")
++ #return check_tool(commands.getoutput("cups-config --serverbin") + "/driver/drv list") and os.path.exists("/usr/share/cupsddk/include/media.defs")
++ return check_file('drv', commands.getoutput("cups-config --serverbin") + "/driver") and check_file('media.defs', "/usr/share/cupsddk/include")
+
+
+ def check_policykit(self):
diff --git a/net-print/hplip/files/hplip-3.12.4-desktop.patch b/net-print/hplip/files/hplip-3.12.4-desktop.patch
new file mode 100644
index 000000000000..d14e9a1d7c5e
--- /dev/null
+++ b/net-print/hplip/files/hplip-3.12.4-desktop.patch
@@ -0,0 +1,18 @@
+--- Makefile.am.old 2012-04-10 10:35:14.000000000 +0200
++++ Makefile.am 2012-04-11 19:17:34.276681669 +0200
+@@ -341,6 +341,7 @@
+ hppgsz_CFLAGS = $(libapdk_la_CFLAGS)
+ hppgsz_LDADD = libapdk.la -ljpeg -ldl
+
++if GUI_BUILD
+ # hplip.desktop
+ hplip_desktopdir = $(icondir)
+ hplip_desktop_DATA = hplip.desktop
+@@ -348,6 +349,7 @@
+ # hplip-systray.desktop
+ hplip_systraydir = $(systraydir)
+ hplip_systray_DATA = hplip-systray.desktop
++endif
+
+ # hpipjs (CUPS filter)
+ hplipjsdir = $(cupsfilterdir)
diff --git a/net-print/hplip/files/hplip-3.12.4-fast-pp.patch b/net-print/hplip/files/hplip-3.12.4-fast-pp.patch
new file mode 100644
index 000000000000..f809993292eb
--- /dev/null
+++ b/net-print/hplip/files/hplip-3.12.4-fast-pp.patch
@@ -0,0 +1,855 @@
+Speed up HPLIP's parallel port I/O
+
+HPLIP should stop emulating IEE1284 ECP in userspace; that requires so many
+ioctls that it's uncomfortably (and sometimes unusably) slow, even on fast
+systems. Instead, it should use ppdev read/write calls, working around ppdev
+quirks/bugs as necessary.
+
+Until now, we avoided this because we feared that using ppdev would make us
+susceptible to variations in PC parallel port hardware. However, it turns out
+that the kernel already addresses that problem: on PCs, the kernel defaults to
+software-emulated ECP, which is exactly what the current HPLIP code does.
+Using the kernel code avoids the massive ioctl overhead, and it makes it
+possible to use hardware-accelerated ECP in those cases where it works.
+
+To apply this patch, 'cd' into the unpacked hplip source directory and run:
+$ patch -p1 <../hplip-fast-pp-v2.patch
+$ libtoolize --force
+$ AUTOMAKE="automake --foreign" autoreconf
+(Remember to use the --enable-pp-build option with ./configure)
+
+Patch by Daniel Gnoutcheff <daniel@gnoutcheff.name>
+Thanks to Daniel Pielmeir for figuring out the autotools bits
+
+diff -ur hplip-3.12.2/configure.in hplip-3.12.2-fast-pp/configure.in
+--- hplip-3.12.2/configure.in 2012-02-01 06:56:29.000000000 -0500
++++ hplip-3.12.2-fast-pp/configure.in 2012-02-20 21:09:45.850744922 -0500
+@@ -222,6 +222,7 @@
+ else
+ AC_MSG_RESULT(no)
+ fi
++AM_CONDITIONAL(PP_BUILD, test x$pp_build = xyes)
+
+ AC_MSG_CHECKING([for scanner build])
+ AC_ARG_ENABLE(scan_build,
+diff -ur hplip-3.12.2/io/hpmud/pp.c hplip-3.12.2-fast-pp/io/hpmud/pp.c
+--- hplip-3.12.2/io/hpmud/pp.c 2012-02-01 06:53:52.000000000 -0500
++++ hplip-3.12.2-fast-pp/io/hpmud/pp.c 2012-02-20 19:28:27.990747569 -0500
+@@ -28,6 +28,8 @@
+
+ #include "hpmud.h"
+ #include "hpmudi.h"
++#include <signal.h>
++#include <time.h>
+
+ mud_device_vf __attribute__ ((visibility ("hidden"))) pp_mud_device_vf =
+ {
+@@ -67,17 +69,6 @@
+ .channel_read = musb_dot4_channel_read
+ };
+
+-static int frob_control(int fd, unsigned char mask, unsigned char val)
+-{
+- struct ppdev_frob_struct frob;
+-
+- /* Convert ieee1284 control values to PC-style (invert Strobe, AutoFd and Select) . */
+- frob.val = val ^ (mask & (PARPORT_CONTROL_STROBE | PARPORT_CONTROL_AUTOFD | PARPORT_CONTROL_SELECT));
+-
+- frob.mask = mask;
+- return ioctl(fd, PPFCONTROL, &frob);
+-}
+-
+ static unsigned char read_status(int fd)
+ {
+ unsigned char status;
+@@ -88,493 +79,6 @@
+ return (status ^ PARPORT_STATUS_BUSY);
+ }
+
+-static int wait_status(int fd, unsigned char mask, unsigned char val, int usec)
+-{
+- struct timeval tmo, now;
+- struct timespec min;
+- unsigned char status;
+- int cnt=0;
+-
+- gettimeofday (&tmo, NULL);
+- tmo.tv_usec += usec;
+- tmo.tv_sec += tmo.tv_usec / 1000000;
+- tmo.tv_usec %= 1000000;
+-
+- min.tv_sec = 0;
+- min.tv_nsec = 5000000; /* 5ms */
+-
+- while (1)
+- {
+- status = read_status(fd);
+- if ((status & mask) == val)
+- {
+- // bug("found status=%x mask=%x val=%x cnt=%d: %s %d\n", status, mask, val, cnt, __FILE__, __LINE__);
+- return 0;
+- }
+- cnt++;
+- // nanosleep(&min, NULL);
+- gettimeofday(&now, NULL);
+- if ((now.tv_sec > tmo.tv_sec) || (now.tv_sec == tmo.tv_sec && now.tv_usec > tmo.tv_usec))
+- {
+- DBG("wait_status timeout status=%x mask=%x val=%x us=%d\n", status, mask, val, usec);
+- return -1; /* timeout */
+- }
+- }
+-}
+-
+-static int wait(int usec)
+-{
+- struct timeval tmo, now;
+- int cnt=0;
+-
+- gettimeofday (&tmo, NULL);
+- tmo.tv_usec += usec;
+- tmo.tv_sec += tmo.tv_usec / 1000000;
+- tmo.tv_usec %= 1000000;
+-
+- while (1)
+- {
+- cnt++;
+- gettimeofday(&now, NULL);
+- if ((now.tv_sec > tmo.tv_sec) || (now.tv_sec == tmo.tv_sec && now.tv_usec > tmo.tv_usec))
+- {
+- return 0; /* timeout */
+- }
+- }
+-}
+-
+-static int ecp_is_fwd(int fd)
+-{
+- unsigned char status;
+-
+- status = read_status(fd);
+- if ((status & PARPORT_STATUS_PAPEROUT) == PARPORT_STATUS_PAPEROUT)
+- return 1;
+- return 0;
+-}
+-
+-static int ecp_is_rev(int fd)
+-{
+- unsigned char status;
+-
+- status = read_status(fd);
+- if ((status & PARPORT_STATUS_PAPEROUT) == 0)
+- return 1;
+- return 0;
+-}
+-
+-static int ecp_rev_to_fwd(int fd)
+-{
+- int dir=0;
+-
+- if (ecp_is_fwd(fd))
+- return 0;
+-
+- /* Event 47: write NReverseRequest/nInit=1 */
+- frob_control(fd, PARPORT_CONTROL_INIT, PARPORT_CONTROL_INIT);
+-
+- /* Event 48: wait PeriphClk/nAck=1, PeriphAck/Busy=0 */
+- // wait_status(fd, PARPORT_STATUS_PAPEROUT | PARPORT_STATUS_BUSY, PARPORT_STATUS_PAPEROUT, SIGNAL_TIMEOUT);
+-
+- /* Event 49: wait nAckReverse/PError=1 */
+- wait_status(fd, PARPORT_STATUS_PAPEROUT, PARPORT_STATUS_PAPEROUT, PP_SIGNAL_TIMEOUT);
+-
+- ioctl(fd, PPDATADIR, &dir);
+-
+- return 0;
+-}
+-
+-static int ecp_fwd_to_rev(int fd)
+-{
+- int dir=1;
+-
+- if (ecp_is_rev(fd))
+- return 0;
+-
+- /* Event 33: NPeriphRequest/nFault=0, PeriphAck/Busy=0 */
+- wait_status(fd, PARPORT_STATUS_BUSY | PARPORT_STATUS_ERROR, 0, PP_DEVICE_TIMEOUT);
+-
+- /* Event 38: write HostAck/nAutoFd=0 */
+- ioctl(fd, PPDATADIR, &dir);
+- frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+- wait(PP_SETUP_TIMEOUT);
+-
+- /* Event 39: write NReverseRequest/nInit=0 (start bus reversal) */
+- frob_control(fd, PARPORT_CONTROL_INIT, 0);
+-
+- /* Event 40: wait nAckReverse/PError=0 */
+- wait_status(fd, PARPORT_STATUS_PAPEROUT, 0, PP_SIGNAL_TIMEOUT);
+-
+- return 0;
+-}
+-
+-static int ecp_write_addr(int fd, unsigned char data)
+-{
+- int cnt=0, len=0;
+- unsigned d=(data | 0x80); /* set channel address bit */
+-
+- ecp_rev_to_fwd(fd);
+-
+- /* Event 33: PeriphAck/Busy=0 */
+- if (wait_status(fd, PARPORT_STATUS_BUSY, 0, PP_SIGNAL_TIMEOUT))
+- {
+- BUG("ecp_write_addr transfer stalled\n");
+- goto bugout;
+- }
+-
+- while (1)
+- {
+- /* Event 34: write HostAck/nAutoFD=0 (channel command), data */
+- frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+- ioctl(fd, PPWDATA, &d);
+-
+- /* Event 35: write HostClk/NStrobe=0 */
+- frob_control(fd, PARPORT_CONTROL_STROBE, 0);
+-
+- /* Event 36: wait PeriphAck/Busy=1 */
+- if (wait_status(fd, PARPORT_STATUS_BUSY, PARPORT_STATUS_BUSY, PP_SIGNAL_TIMEOUT))
+- {
+-
+- /* Event 72: write NReverseRequest/nInit=0 (Host Transfer Recovery) */
+- frob_control(fd, PARPORT_CONTROL_INIT, 0);
+-
+- /* Event 73: wait nAckReverse/PError=0 */
+- wait_status(fd, PARPORT_STATUS_PAPEROUT, 0, PP_SIGNAL_TIMEOUT);
+-
+- /* Event 74: write NReverseRequest/nInit=1 */
+- frob_control(fd, PARPORT_CONTROL_INIT, PARPORT_CONTROL_INIT);
+-
+- /* Event 75: wait nAckReverse/PError=1 */
+- wait_status(fd, PARPORT_STATUS_PAPEROUT, PARPORT_STATUS_PAPEROUT, PP_SIGNAL_TIMEOUT);
+-
+- cnt++;
+- if (cnt > 4)
+- {
+- BUG("ecp_write_addr transfer stalled\n");
+- goto bugout;
+- }
+- BUG("ecp_write_addr host transfer recovery cnt=%d\n", cnt);
+- continue; /* retry */
+- }
+- break; /* done */
+- } /* while (1) */
+-
+- len = 1;
+-
+-bugout:
+-
+- /* Event 37: write HostClk/NStrobe=1 */
+- frob_control(fd, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE);
+-
+- return len;
+-}
+-
+-static int ecp_write_data(int fd, unsigned char data)
+-{
+- int cnt=0, len=0;
+-
+- // ecp_rev_to_fwd(fd);
+-
+- /* Event 33: check PeriphAck/Busy=0 */
+- if (wait_status(fd, PARPORT_STATUS_BUSY, 0, PP_SIGNAL_TIMEOUT))
+- {
+- BUG("ecp_write_data transfer stalled\n");
+- goto bugout;
+- }
+-
+- while (1)
+- {
+- /* Event 34: write HostAck/nAutoFD=1 (channel data), data */
+- frob_control(fd, PARPORT_CONTROL_AUTOFD, PARPORT_CONTROL_AUTOFD);
+- ioctl(fd, PPWDATA, &data);
+-
+- /* Event 35: write HostClk/NStrobe=0 */
+- frob_control(fd, PARPORT_CONTROL_STROBE, 0);
+-
+- /* Event 36: wait PeriphAck/Busy=1 */
+- if (wait_status(fd, PARPORT_STATUS_BUSY, PARPORT_STATUS_BUSY, PP_SIGNAL_TIMEOUT))
+- {
+-
+- /* Event 72: write NReverseRequest/nInit=0 (Host Transfer Recovery) */
+- frob_control(fd, PARPORT_CONTROL_INIT, 0);
+-
+- /* Event 73: wait nAckReverse/PError=0 */
+- wait_status(fd, PARPORT_STATUS_PAPEROUT, 0, PP_SIGNAL_TIMEOUT);
+-
+- /* Event 74: write NReverseRequest/nInit=1 */
+- frob_control(fd, PARPORT_CONTROL_INIT, PARPORT_CONTROL_INIT);
+-
+- /* Event 75: wait nAckReverse/PError=1 */
+- wait_status(fd, PARPORT_STATUS_PAPEROUT, PARPORT_STATUS_PAPEROUT, PP_SIGNAL_TIMEOUT);
+-
+- cnt++;
+- if (cnt > 4)
+- {
+- BUG("ecp_write_data transfer stalled\n");
+- goto bugout;
+- }
+- BUG("ecp_write_data host transfer recovery cnt=%d\n", cnt);
+- continue; /* retry */
+- }
+- break; /* done */
+- } /* while (1) */
+-
+- len = 1;
+-
+-bugout:
+-
+- /* Event 37: write HostClk/NStrobe=1 */
+- frob_control(fd, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE);
+-
+- return len;
+-}
+-
+-static int ecp_read_data(int fd, unsigned char *data)
+-{
+- int len=0;
+-
+- // ecp_fwd_to_rev(fd);
+-
+- /* Event 43: wait PeriphClk/NAck=0 */
+- if (wait_status(fd, PARPORT_STATUS_ACK, 0, PP_SIGNAL_TIMEOUT))
+- {
+- len = -1;
+- goto bugout;
+- }
+- ioctl(fd, PPRDATA, data);
+-
+- /* Event 44: write HostAck/nAutoFd=1 */
+- frob_control(fd, PARPORT_CONTROL_AUTOFD, PARPORT_CONTROL_AUTOFD);
+-
+- /* Event 45: wait PeriphClk/NAck=1 */
+- wait_status(fd, PARPORT_STATUS_ACK, PARPORT_STATUS_ACK, PP_SIGNAL_TIMEOUT);
+-
+- /* Event 46: write HostAck/nAutoFd=0 */
+- frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+-
+- len = 1;
+-
+-bugout:
+-
+- return len;
+-}
+-
+-static int ecp_read(int fd, void *buffer, int size, int usec)
+-{
+- int i=0;
+- unsigned char *p = (unsigned char *)buffer;
+-
+- ecp_fwd_to_rev(fd);
+-
+- while (i < size)
+- {
+- if (ecp_read_data(fd, p+i) != 1)
+- {
+- usec-=PP_SIGNAL_TIMEOUT;
+- if (usec > 0)
+- continue;
+-
+-// return -1;
+- return -ETIMEDOUT; /* timeout */
+- }
+- i++;
+- }
+- return i;
+-}
+-
+-static int ecp_write(int fd, const void *buffer, int size)
+-{
+- int i;
+- unsigned char *p = (unsigned char *)buffer;
+- static int timeout=0;
+-
+- if (timeout)
+- {
+- timeout=0;
+- return -1; /* report timeout */
+- }
+-
+- ecp_rev_to_fwd(fd);
+-
+- for (i=0; i < size; i++)
+- {
+- if (ecp_write_data(fd, p[i]) != 1)
+- {
+- if (i)
+- timeout=1; /* save timeout, report bytes written */
+- else
+- i=-1; /* report timeout */
+- break;
+- }
+- }
+- return i;
+-}
+-
+-static int nibble_read_data(int fd, unsigned char *data)
+-{
+- int len=0;
+- unsigned char nibble;
+-
+- /* Event 7: write HostBusy/nAutoFd=0 */
+- frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+-
+- /* Event 8: peripheral sets low-order nibble. */
+-
+- /* Event 9: wait PtrClk/NAck=0 */
+- if (wait_status(fd, PARPORT_STATUS_ACK, 0, PP_SIGNAL_TIMEOUT))
+- {
+- len = -1;
+- goto bugout;
+- }
+- nibble = read_status(fd) >> 3;
+- nibble = ((nibble & 0x10) >> 1) | (nibble & 0x7);
+- *data = nibble;
+-
+- /* Event 10: write HostBusy/nAutoFd=1 */
+- frob_control(fd, PARPORT_CONTROL_AUTOFD, PARPORT_CONTROL_AUTOFD);
+-
+- /* Event 11: wait PtrClk/NAck=1 */
+- wait_status(fd, PARPORT_STATUS_ACK, PARPORT_STATUS_ACK, PP_SIGNAL_TIMEOUT);
+-
+- /* Event 7: write HostBusy/nAutoFd=0 */
+- frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+-
+- /* Event 8: peripheral sets high-order nibble. */
+-
+- /* Event 9: wait PtrClk/NAck=0 */
+- if (wait_status(fd, PARPORT_STATUS_ACK, 0, PP_SIGNAL_TIMEOUT))
+- {
+- len = -1;
+- goto bugout;
+- }
+- nibble = read_status(fd) >> 3;
+- nibble = ((nibble & 0x10) >> 1) | (nibble & 0x7);
+- *data |= (nibble<<4);
+-
+- /* Event 10: write HostBusy/nAutoFd=1 */
+- frob_control(fd, PARPORT_CONTROL_AUTOFD, PARPORT_CONTROL_AUTOFD);
+-
+- /* Event 11: wait PtrClk/NAck=1 */
+- wait_status(fd, PARPORT_STATUS_ACK, PARPORT_STATUS_ACK, PP_SIGNAL_TIMEOUT);
+-
+- len = 1;
+-
+-bugout:
+-
+- return len;
+-}
+-
+-static int nibble_read(int fd, int flag, void *buffer, int size, int usec)
+-{
+- int i=0;
+- unsigned char *p = (unsigned char *)buffer;
+- int m = IEEE1284_MODE_NIBBLE | flag;
+- int mc = IEEE1284_MODE_COMPAT;
+- unsigned char status;
+-
+- ioctl (fd, PPNEGOT, &mc);
+- if (ioctl (fd, PPNEGOT, &m))
+- {
+- DBG("nibble_read negotiation failed: %m\n");
+- return -1;
+- }
+-
+- while (i < size)
+- {
+- if (nibble_read_data(fd, p+i) != 1)
+- {
+- usec-=PP_SIGNAL_TIMEOUT;
+- if (usec > 0)
+- continue;
+-
+-// return -1;
+- return -ETIMEDOUT; /* timeout */
+- }
+-
+- i++;
+-
+- /* More data? */
+- status = read_status(fd);
+- if (status & PARPORT_STATUS_ERROR)
+- {
+- /* Event 7: write HostBusy/nAutoFd=0, idle phase */
+- frob_control(fd, PARPORT_CONTROL_AUTOFD, 0);
+-
+- break; /* done */
+- }
+- }
+-
+- return i;
+-}
+-
+-static int compat_write_data(int fd, unsigned char data)
+-{
+- int len=0;
+-
+- /* wait Busy=0 */
+- if (wait_status(fd, PARPORT_STATUS_BUSY, 0, PP_DEVICE_TIMEOUT))
+- {
+- BUG("compat_write_data transfer stalled\n");
+- goto bugout;
+- }
+-
+- ioctl(fd, PPWDATA, &data);
+- wait(PP_SETUP_TIMEOUT);
+-
+- /* write NStrobe=0 */
+- frob_control(fd, PARPORT_CONTROL_STROBE, 0);
+-
+- /* wait Busy=1 */
+- if (wait_status(fd, PARPORT_STATUS_BUSY, PARPORT_STATUS_BUSY, PP_SIGNAL_TIMEOUT))
+- {
+- BUG("compat_write_data transfer stalled\n");
+- goto bugout;
+- }
+-
+- /* write nStrobe=1 */
+- frob_control(fd, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE);
+-
+- len = 1;
+-
+-bugout:
+- return len;
+-}
+-
+-static int compat_write(int fd, const void *buffer, int size)
+-{
+- int i=0;
+- unsigned char *p = (unsigned char *)buffer;
+- int m = IEEE1284_MODE_COMPAT;
+- static int timeout=0;
+-
+- if (timeout)
+- {
+- timeout=0;
+- return -1; /* report timeout */
+- }
+-
+- if (ioctl(fd, PPNEGOT, &m))
+- {
+- BUG("compat_write failed: %m\n");
+- goto bugout;
+- }
+-
+- for (i=0; i < size; i++)
+- {
+- if (compat_write_data(fd, p[i]) != 1)
+- {
+- if (i)
+- timeout=1; /* save timeout, report bytes written */
+- else
+- i=-1; /* report timeout */
+- break;
+- }
+- }
+-
+-bugout:
+- return i;
+-}
+-
+ static int claim_pp(int fd)
+ {
+ int stat=1;
+@@ -617,11 +121,23 @@
+
+ static int device_id(int fd, char *buffer, int size)
+ {
+- int len=0, maxSize;
++ int len=0, maxSize, mode;
+
+ maxSize = (size > 1024) ? 1024 : size; /* RH8 has a size limit for device id */
+
+- len = nibble_read(fd, IEEE1284_DEVICEID, buffer, maxSize, 0);
++ /* reset (in case someone else stopped in the middle of reading the device
++ * ID) */
++ mode = IEEE1284_MODE_COMPAT;
++ ioctl(fd, PPNEGOT, &mode);
++
++ mode = IEEE1284_MODE_NIBBLE | IEEE1284_DEVICEID;
++ ioctl(fd, PPNEGOT, &mode);
++ len = read(fd, buffer, maxSize);
++
++ /* Reset (for safety) */
++ mode = IEEE1284_MODE_COMPAT;
++ ioctl(fd, PPNEGOT, &mode);
++
+ if (len < 0)
+ {
+ BUG("unable to read device-id ret=%d\n", len);
+@@ -720,24 +236,134 @@
+ return 0;
+ }
+
++static int ecp_write_addr(int fd, unsigned char addr)
++{
++ /* Currently, PPSETMODE always resets the kernel's idea of the current phase
++ * to equal that of the inital phase of the given mode (i.e.
++ * IEEE1284_PH_FWD_IDLE for ECP). However, we're not actually changing the
++ * mode, we're just modifying the "send command bytes" flag; thus, we do
++ * *not* want the phase to change. We workaround the kernel's bad behavor by
++ * forcibly refreshing its phase setting whenever we call PPSETMODE.
++ */
++ int mode, phase, cmdmode, len, retval;
++
++ /* To send an address, we send an ECP command byte with the high bit set
++ * and the address in the other 7 bits. */
++ unsigned char command = addr | 0x80;
++
++ /* Enable command mode */
++ ioctl(fd, PPGETMODE, &mode);
++ cmdmode = mode | IEEE1284_ADDR;
++ ioctl(fd, PPGETPHASE, &phase);
++ ioctl(fd, PPSETMODE, &cmdmode);
++ ioctl(fd, PPSETPHASE, &phase);
++
++ len = write(fd, &command, 1);
++
++ /* Restore original mode */
++ ioctl(fd, PPGETPHASE, &phase);
++ ioctl(fd, PPSETMODE, &mode);
++ ioctl(fd, PPSETPHASE, &phase);
++
++ if (len == 1)
++ retval = len;
++ else
++ {
++ BUG("ecp_write_addr transfer failed\n");
++ retval = -errno;
++ }
++
++ return retval;
++}
++
++static void setup_timeout(int timeout_usec, timer_t *timeout_timer)
++{
++ struct sigevent timeout_sigevent =
++ {
++ .sigev_notify = SIGEV_NONE
++ };
++ struct itimerspec timeout =
++ {
++ .it_value =
++ {
++ .tv_sec = timeout_usec / 1000000,
++ .tv_nsec = (timeout_usec % 1000000) * 1000
++ },
++ .it_interval =
++ {
++ .tv_sec = 0,
++ .tv_nsec = 0
++ }
++ };
++
++ timer_create(CLOCK_MONOTONIC, &timeout_sigevent, timeout_timer);
++ timer_settime(*timeout_timer, 0, &timeout, NULL);
++}
++
++static int timeout_not_expired(timer_t *timer)
++{
++ struct itimerspec timeout;
++ timer_gettime(*timer, &timeout);
++ return timeout.it_value.tv_sec > 0 || timeout.it_value.tv_nsec > 0;
++}
++
++enum io_operation
++{
++ IO_READ,
++ IO_WRITE
++};
++
++static int ppdev_io_with_timeout(enum io_operation operation,
++ int fd, void *buf, int buf_size, int timeout_usec)
++{
++ /* As of Linux 2.6.39, ppdev's read and write implementations do not honor
++ * the timeout values given by PPSETTIME ioctls. Furthermore, when using
++ * blocking IO, ppdev reads and writes will block forever until at least one
++ * byte is transfered, which is a problem if, say, the peripheral has lost
++ * power and will never respond. To avoid these issues, we use non-blocking
++ * IO and we implement the timeout ourselves. */
++
++ int offset = 0, retval = 0, error = 0;
++ timer_t timeout_timer;
++
++ setup_timeout(timeout_usec, &timeout_timer);
++
++ do {
++ switch (operation)
++ {
++ case IO_READ:
++ retval = read(fd, buf + offset, buf_size - offset);
++ break;
++ case IO_WRITE:
++ retval = write(fd, buf + offset, buf_size - offset);
++ break;
++ }
++
++ if (retval >= 0)
++ offset += retval;
++ else if (errno != EAGAIN)
++ error = errno;
++ } while (!error && offset < buf_size && timeout_not_expired(&timeout_timer));
++
++ timer_delete(timeout_timer);
++
++ if (error)
++ return -error;
++ else if (offset == 0)
++ return -ETIMEDOUT;
++ else
++ return offset;
++}
++
+ /*********************************************************************************************************************************
+ * Parallel port mud_device functions.
+ */
+
+ int __attribute__ ((visibility ("hidden"))) pp_write(int fd, const void *buf, int size, int usec)
+ {
+- int len=0, m;
++ int len;
+
+- ioctl(fd, PPGETMODE, &m);
+-
+- if (m & (IEEE1284_MODE_ECPSWE | IEEE1284_MODE_ECP))
+- {
+- len = ecp_write(fd, buf, size);
+- }
+- else
+- {
+- len = compat_write(fd, buf, size);
+- }
++ len = ppdev_io_with_timeout(IO_WRITE, fd, (void *)buf, size, usec);
+
+ DBG("write fd=%d len=%d size=%d\n", fd, len, size);
+ DBG_DUMP(buf, len < 32 ? len : 32);
+@@ -747,19 +373,9 @@
+
+ int __attribute__ ((visibility ("hidden"))) pp_read(int fd, void *buf, int size, int usec)
+ {
+- int len=0, m;
+-// int sec = usec/1000000;
+-
+- ioctl(fd, PPGETMODE, &m);
++ int len;
+
+- if (m & (IEEE1284_MODE_ECPSWE | IEEE1284_MODE_ECP))
+- {
+- len = ecp_read(fd, buf, size, usec);
+- }
+- else
+- {
+- len = nibble_read(fd, 0, buf, size, usec);
+- }
++ len = ppdev_io_with_timeout(IO_READ, fd, buf, size, usec);
+
+ DBG("read fd=%d len=%d size=%d usec=%d\n", fd, len, size, usec);
+ DBG_DUMP(buf, len < 32 ? len : 32);
+@@ -779,9 +395,11 @@
+
+ if (pd->id[0] == 0)
+ {
+- /* First client, open actual kernal device, use blocking i/o. */
++ /* First client, open actual kernal device, use non-blocking i/o. See
++ * comment in ppdev_io_with_timeout() for why we use non-blocking i/o.
++ */
+ hpmud_get_uri_datalink(pd->uri, dev, sizeof(dev));
+- if ((fd = open(dev, O_RDWR | O_NOCTTY)) < 0)
++ if ((fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0)
+ {
+ BUG("unable to open %s: %m\n", pd->uri);
+ goto bugout;
+@@ -1037,7 +655,7 @@
+ goto bugout;
+
+ /* Negotiate ECP mode. */
+- m = IEEE1284_MODE_ECPSWE;
++ m = IEEE1284_MODE_ECP;
+ if (ioctl(pd->open_fd, PPNEGOT, &m))
+ {
+ BUG("unable to negotiate %s ECP mode: %m\n", pd->uri);
+@@ -1046,7 +664,7 @@
+
+ /* Enable MLC mode with ECP channel-77. */
+ ecp_write_addr(pd->open_fd, 78);
+- ecp_write(pd->open_fd, "\0", 1);
++ write(pd->open_fd, "\0", 1);
+ ecp_write_addr(pd->open_fd, 77);
+
+ /* MLC initialize */
+@@ -1099,7 +717,7 @@
+ pd->mlc_up=0;
+
+ ecp_write_addr(pd->mlc_fd, 78); /* disable MLC mode with ECP channel-78 */
+- ecp_write(pd->mlc_fd, "\0", 1);
++ write(pd->mlc_fd, "\0", 1);
+
+ m = IEEE1284_MODE_NIBBLE;
+ ioctl(pd->mlc_fd, PPNEGOT, &m);
+@@ -1129,7 +747,7 @@
+ goto bugout;
+
+ /* Negotiate ECP mode. */
+- m = IEEE1284_MODE_ECPSWE;
++ m = IEEE1284_MODE_ECP;
+ if (ioctl(pd->open_fd, PPNEGOT, &m))
+ {
+ BUG("unable to negotiate %s ECP mode: %m\n", pd->uri);
+@@ -1138,7 +756,7 @@
+
+ /* Enable MLC mode with ECP channel-77. */
+ ecp_write_addr(pd->open_fd, 78);
+- ecp_write(pd->open_fd, "\0", 1);
++ write(pd->open_fd, "\0", 1);
+ ecp_write_addr(pd->open_fd, 77);
+
+ /* DOT4 initialize */
+@@ -1191,7 +809,7 @@
+ pd->mlc_up=0;
+
+ ecp_write_addr(pd->mlc_fd, 78); /* disable MLC mode with ECP channel-78 */
+- ecp_write(pd->mlc_fd, "\0", 1);
++ write(pd->mlc_fd, "\0", 1);
+
+ m = IEEE1284_MODE_NIBBLE;
+ ioctl(pd->mlc_fd, PPNEGOT, &m);
+diff -ur hplip-3.12.2/io/hpmud/pp.h hplip-3.12.2-fast-pp/io/hpmud/pp.h
+--- hplip-3.12.2/io/hpmud/pp.h 2012-02-01 06:53:52.000000000 -0500
++++ hplip-3.12.2-fast-pp/io/hpmud/pp.h 2012-02-20 19:28:27.990747569 -0500
+@@ -60,18 +60,11 @@
+ * 0 - Strobe *
+ *
+ * * inverted
+- *
+- * Notes:
+- * For ECP mode use low-level parport ioctl instead of high-level parport read/writes because its more reliable. High-level support
+- * for Compatible and Nibble modes are probably ok, but for consistency low-level parport ioctl is used.
+- *
+ */
+
+-#define PP_DEVICE_TIMEOUT 30000000 /* device timeout (us) */
+ //#define PP_SIGNAL_TIMEOUT 1000000 /* signal timeout (us), too long for 1ms timeout, DES 8/18/08 */
+ //#define PP_SIGNAL_TIMEOUT 1000 /* signal timeout (us), too short for DJ540, DES 8/18/08 */
+ #define PP_SIGNAL_TIMEOUT 100000 /* signal timeout (us), DES 8/18/08 */
+-#define PP_SETUP_TIMEOUT 10 /* setup timeout (us) */
+
+ struct _mud_device;
+ struct _mud_channel;
+diff -ur hplip-3.12.2/Makefile.am hplip-3.12.2-fast-pp/Makefile.am
+--- hplip-3.12.2/Makefile.am 2012-02-01 06:53:57.000000000 -0500
++++ hplip-3.12.2-fast-pp/Makefile.am 2012-02-20 21:26:21.210745149 -0500
+@@ -74,6 +74,9 @@
+ libhpmud_la_LDFLAGS = -version-info 0:6:0 -lusb -lpthread
+ endif
+ libhpmud_la_CFLAGS = -DMUDNAME=\"$(MUDNAME)\" -DCONFDIR=\"$(hplip_confdir)\"
++if PP_BUILD
++libhpmud_la_LDFLAGS += -lrt
++endif
+
+ # ip library
+ lib_LTLIBRARIES += libhpip.la
diff --git a/net-print/hplip/files/hplip-3.12.4-htmldir.patch b/net-print/hplip/files/hplip-3.12.4-htmldir.patch
new file mode 100644
index 000000000000..4a16c29a9da8
--- /dev/null
+++ b/net-print/hplip/files/hplip-3.12.4-htmldir.patch
@@ -0,0 +1,109 @@
+diff -Naur hplip-3.12.4/work/hplip-3.12.4-old/configure.in hplip-3.12.4//configure.in
+--- hplip-3.12.4-old/configure.in 2012-04-10 10:38:27.000000000 +0200
++++ hplip-3.12.4/configure.in 2012-04-11 19:29:34.883554956 +0200
+@@ -327,6 +327,9 @@
+ AC_ARG_WITH(docdir, AC_HELP_STRING([--with-docdir=DIR], [set hplip documentation directory [default=datadir/doc]]),
+ hpdocdir=$withval, hpdocdir="$datadir/doc/hplip-$VERSION")
+
++AC_ARG_WITH(htmldir, AC_HELP_STRING([--with-htmldir=DIR], [set hplip html documentation directory [default=datadir/doc]]),
++ hphtmldir=$withval, hphtmldir="$datadir/doc/hplip-$VERSION")
++
+ AC_MSG_CHECKING([for foomatic ppd install])
+ AC_ARG_ENABLE(foomatic_ppd_install,
+ [ --enable-foomatic-ppd-install enable foomatic static ppd install (default=no), uses hpppddir],
+@@ -551,6 +554,7 @@
+ AC_DEFINE_DIR([abs_sbindir], [sbindir])
+ AC_DEFINE_DIR([abs_hpppddir], [hpppddir])
+ AC_DEFINE_DIR([abs_docdir], [hpdocdir])
++AC_DEFINE_DIR([abs_htmldir], [hphtmldir])
+ abs_ppddir=${abs_hpppddir%/*}
+ AC_DEFINE_DIR([abs_drvdir], [drvdir])
+
+@@ -558,6 +562,7 @@
+ AC_SUBST(abs_sbindir)
+ AC_SUBST(abs_hpppddir)
+ AC_SUBST(abs_docdir)
++AC_SUBST(abs_htmldir)
+ AC_SUBST(abs_ppddir)
+ AC_SUBST(abs_drvdir)
+ AC_SUBST(abs_mimedir)
+@@ -568,6 +573,7 @@
+ AC_SUBST(cupsfilterdir)
+ AC_SUBST(hpppddir)
+ AC_SUBST(hpdocdir)
++AC_SUBST(hphtmldir)
+ AC_SUBST(drvdir)
+ AC_SUBST(network_build)
+ AC_SUBST(pp_build)
+diff -Naur hplip-3.12.4-old//hplip.conf.in hplip-3.12.4//hplip.conf.in
+--- hplip-3.12.4-old/hplip.conf.in 2012-04-10 10:35:14.000000000 +0200
++++ hplip-3.12.4/hplip.conf.in 2012-04-11 19:29:54.810680844 +0200
+@@ -9,6 +9,7 @@
+ ppd=@abs_hpppddir@
+ ppdbase=@abs_ppddir@
+ doc=@abs_docdir@
++html=@abs_htmldir@
+ icon=@icondir@
+ cupsbackend=@cupsbackenddir@
+ cupsfilter=@cupsfilterdir@
+@@ -42,4 +43,4 @@
+ lite-build=@lite_build@
+ udev-acl-rules=@udev_acl_rules@
+ hpcups-only-build=@hpcups_only_build@
+-hpijs-only-build=@hpijs_only_build@
+\ Kein Zeilenumbruch am Dateiende.
++hpijs-only-build=@hpijs_only_build@
+diff -Naur hplip-3.12.4-old/hplip.list.in hplip-3.12.4/hplip.list.in
+--- hplip-3.12.4-old/hplip.list.in 2012-04-10 10:35:14.000000000 +0200
++++ hplip-3.12.4/hplip.list.in 2012-04-11 19:31:17.035941466 +0200
+@@ -49,6 +49,7 @@
+ $icondir=@icondir@
+ $systraydir=@systraydir@
+ $docdir=@hpdocdir@
++$htmldir=@hphtmldirdir@
+ $version=@VERSION@
+ $internal_tag=@PACKAGE_BUGREPORT@
+
+@@ -271,11 +272,11 @@
+ @epm_full@f 755 root root $home/diagnose_queues.py diagnose_queues.py
+
+ # docs
+-@epm_full@f 644 root root $docdir doc/*
+-@epm_full@d 775 root root $docdir/images -
+-@epm_full@f 644 root root $docdir/images doc/images/*
+-@epm_full@d 775 root root $docdir/styles -
+-@epm_full@f 644 root root $docdir/styles doc/styles/*
++@epm_full@f 644 root root $htmldir doc/*
++@epm_full@d 775 root root $htmldir/images -
++@epm_full@f 644 root root $htmldir/images doc/images/*
++@epm_full@d 775 root root $htmldir/styles -
++@epm_full@f 644 root root $htmldir/styles doc/styles/*
+ # python commands
+ @epm_full@l 755 root root $bindir/hp-toolbox ../share/hplip/toolbox.py
+ @epm_full@l 755 root root $bindir/hp-colorcal ../share/hplip/colorcal.py
+diff -Naur hplip-3.12.4-old/Makefile.am hplip-3.12.4/Makefile.am
+--- hplip-3.12.4-old/Makefile.am 2012-04-10 10:35:14.000000000 +0200
++++ hplip-3.12.4/Makefile.am 2012-04-11 19:32:31.351056728 +0200
+@@ -9,6 +9,7 @@
+ hplipdir = $(datadir)/hplip
+
+ docdir = $(hpdocdir)
++htmldir = $(hphtmldir)
+ doc_DATA = COPYING copyright prnt/hpijs/README_LIBJPG
+ EXTRA_DIST = prnt/hpijs/gdevijs-krgb-1.5-gs8.61.patch prnt/hpijs/README_LIBJPG copyright
+
+@@ -23,11 +24,11 @@
+
+ if DOC_BUILD
+ wwwsrc = doc
+-www0dir = $(docdir)
++www0dir = $(htmldir)
+ dist_www0_DATA = $(wwwsrc)/index.html $(wwwsrc)/commandline.html $(wwwsrc)/copying.html $(wwwsrc)/devicemanager.html $(wwwsrc)/faxtrouble.html $(wwwsrc)/gettinghelp.html $(wwwsrc)/hpscan.html $(wwwsrc)/mainttask.html $(wwwsrc)/plugins.html $(wwwsrc)/print.html $(wwwsrc)/printing.html $(wwwsrc)/printoptions.html $(wwwsrc)/printtroubleshooting.html $(wwwsrc)/scanning.html $(wwwsrc)/scantrouble.html $(wwwsrc)/sendfax.html $(wwwsrc)/setup.html $(wwwsrc)/systray.html $(wwwsrc)/troubleshooting.html $(wwwsrc)/uninstalling.html $(wwwsrc)/upgrading.html
+-www3dir = $(docdir)/styles
++www3dir = $(htmldir)/styles
+ dist_www3_DATA = $(wwwsrc)/styles/*
+-www4dir = $(docdir)/images
++www4dir = $(htmldir)/images
+ dist_www4_DATA = $(wwwsrc)/images/*
+ endif
+
diff --git a/net-print/hplip/hplip-3.12.4.ebuild b/net-print/hplip/hplip-3.12.4.ebuild
new file mode 100644
index 000000000000..c0c4fb18cdb7
--- /dev/null
+++ b/net-print/hplip/hplip-3.12.4.ebuild
@@ -0,0 +1,264 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/net-print/hplip/hplip-3.12.4.ebuild,v 1.1 2012/04/11 18:33:38 billie Exp $
+
+EAPI=4
+
+PYTHON_DEPEND="!minimal? 2"
+PYTHON_USE_WITH="threads xml"
+PYTHON_USE_WITH_OPT="!minimal"
+
+inherit fdo-mime linux-info python autotools
+
+DESCRIPTION="HP Linux Imaging and Printing. Includes printer, scanner, fax drivers and service tools."
+HOMEPAGE="http://hplipopensource.com/hplip-web/index.html"
+SRC_URI="mirror://sourceforge/hplip/${P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~ppc ~ppc64 ~x86"
+
+# zeroconf does not work properly with >=cups-1.4.
+# Thus support for it is also disabled in hplip.
+IUSE="doc fax +hpcups hpijs kde libnotify minimal parport policykit qt4 scanner snmp static-ppds -acl X"
+
+REQUIRED_USE="|| ( hpijs hpcups )"
+
+COMMON_DEPEND="
+ virtual/jpeg
+ hpijs? ( >=net-print/foomatic-filters-3.0.20080507[cups] )
+ acl? ( || ( >=sys-auth/consolekit-0.4.5-r3[acl] >=sys-fs/udev-171-r5[acl] <sys-fs/udev-171-r5[extras] ) )
+ !minimal? (
+ >=net-print/cups-1.4.0
+ virtual/libusb:0
+ scanner? ( >=media-gfx/sane-backends-1.0.19-r1 )
+ fax? ( sys-apps/dbus )
+ snmp? (
+ net-analyzer/net-snmp
+ dev-libs/openssl
+ )
+ )"
+
+DEPEND="${COMMON_DEPEND}
+ dev-util/pkgconfig"
+
+RDEPEND="${COMMON_DEPEND}
+ >=app-text/ghostscript-gpl-8.71-r3
+ policykit? (
+ sys-auth/polkit
+ )
+ !minimal? (
+ dev-python/pygobject:2
+ kernel_linux? ( >=sys-fs/udev-114 )
+ scanner? (
+ dev-python/imaging
+ X? ( || (
+ kde? ( kde-misc/skanlite )
+ media-gfx/xsane
+ media-gfx/sane-frontends
+ ) )
+ )
+ fax? (
+ dev-python/reportlab
+ dev-python/dbus-python
+ )
+ qt4? (
+ dev-python/PyQt4[dbus,X]
+ libnotify? (
+ dev-python/notify-python
+ )
+ )
+ )"
+
+CONFIG_CHECK="~PARPORT ~PPDEV"
+ERROR_PARPORT="Please make sure kernel parallel port support is enabled (PARPORT and PPDEV)."
+
+pkg_setup() {
+ if ! use minimal; then
+ python_set_active_version 2
+ python_pkg_setup
+ fi
+
+ ! use qt4 && ewarn "You need USE=qt4 for the hplip GUI."
+
+ use scanner && ! use X && ewarn "You need USE=X for the scanner GUI."
+
+ if use minimal ; then
+ ewarn "Installing driver portions only, make sure you know what you are doing."
+ ewarn "Depending on the USE flags set for hpcups or hpijs the appropiate driver"
+ ewarn "is installed. If both USE flags are set hpijs overrides hpcups."
+ else
+ use parport && linux-info_pkg_setup
+ fi
+}
+
+src_prepare() {
+
+ use !minimal && python_convert_shebangs -q -r 2 .
+
+ # Fix for Gentoo bug #345725
+ sed -i -e "s|/etc/udev/rules.d|/lib/udev/rules.d|" \
+ $(find ./ -type f -exec grep -l '/etc/udev/rules.d' '{}' '+') \
+ || die
+
+ # Do not install desktop files if there is no gui
+ # Upstream bug: https://bugs.launchpad.net/hplip/+bug/452113
+ epatch "${FILESDIR}"/${P}-desktop.patch
+
+ # Browser detection through xdg-open
+ # Upstream bug: https://bugs.launchpad.net/hplip/+bug/482674
+ epatch "${FILESDIR}"/${PN}-3.9.10-browser.patch
+
+ # Use cups-config when checking for cupsddk
+ # Upstream bug: https://bugs.launchpad.net/hplip/+bug/483136
+ epatch "${FILESDIR}"/${P}-cupsddk.patch
+
+ # Htmldocs are not installed under docdir/html so enable htmldir configure
+ # switch
+ # Upstream bug: https://bugs.launchpad.net/hplip/+bug/483217
+ epatch "${FILESDIR}"/${P}-htmldir.patch
+
+ # Let 56-hpmud_support.rules call hp-mkuri to make it work with newer udev
+ # Upstream bug: None
+ epatch "${FILESDIR}"/${PN}-3.11.12-udev-rules.patch
+
+ # CVE-2010-4267 SNMP Response Processing Buffer Overflow Vulnerability
+ # http://secunia.com/advisories/42956/
+ # https://bugzilla.redhat.com/show_bug.cgi?id=662740
+ epatch "${FILESDIR}"/${PN}-3.10.9-cve-2010-4267.patch
+
+ # Fix black stripes on pcl5c printouts
+ # Upstream bug: https://bugs.launchpad.net/hplip/+bug/561264
+ epatch "${FILESDIR}"/${PN}-3.11.12-black-stripes-pcl5c.patch
+
+ # Fix parallel port cpu usage
+ # Upstream bug: https://bugs.launchpad.net/hplip/+bug/750796
+ epatch "${FILESDIR}"/${P}-fast-pp.patch
+
+ # Fix minmal/hpijs_only/hpcups_only install
+ # Upstream bug: https://bugs.launchpad.net/hplip/+bug/932918
+ epatch "${FILESDIR}"/${PN}-3.12.2-minimal.patch
+
+ # Force recognition of Gentoo distro by hp-check
+ sed -i \
+ -e "s:file('/etc/issue', 'r').read():'Gentoo':" \
+ installer/core_install.py || die
+
+ # Use system foomatic-rip for hpijs driver instead of foomatic-rip-hplip
+ # The hpcups driver does not use foomatic-rip
+ local i
+ for i in ppd/hpijs/*.ppd.gz ; do
+ rm -f ${i}.temp
+ gunzip -c ${i} | sed 's/foomatic-rip-hplip/foomatic-rip/g' | \
+ gzip > ${i}.temp || die
+ mv ${i}.temp ${i}
+ done
+
+ eautoreconf
+}
+
+src_configure() {
+ local myconf drv_build minimal_build
+
+ if use fax || use qt4 ; then
+ myconf="${myconf} --enable-dbus-build"
+ else
+ myconf="${myconf} --disable-dbus-build"
+ fi
+
+ if use hpcups ; then
+ drv_build="$(use_enable hpcups hpcups-install)"
+ if use static-ppds ; then
+ drv_build="${drv_build} --enable-cups-ppd-install"
+ drv_build="${drv_build} --disable-cups-drv-install"
+ else
+ drv_build="${drv_build} --enable-cups-drv-install"
+ drv_build="${drv_build} --disable-cups-ppd-install"
+ fi
+ else
+ drv_build="--disable-hpcups-install"
+ drv_build="${drv_build} --disable-cups-drv-install"
+ drv_build="${drv_build} --disable-cups-ppd-install"
+ fi
+
+ if use hpijs ; then
+ drv_build="${drv_build} $(use_enable hpijs hpijs-install)"
+ if use static-ppds ; then
+ drv_build="${drv_build} --enable-foomatic-ppd-install"
+ drv_build="${drv_build} --disable-foomatic-drv-install"
+ else
+ drv_build="${drv_build} --enable-foomatic-drv-install"
+ drv_build="${drv_build} --disable-foomatic-ppd-install"
+ fi
+ else
+ drv_build="${drv_build} --disable-hpijs-install"
+ drv_build="${drv_build} --disable-foomatic-drv-install"
+ drv_build="${drv_build} --disable-foomatic-ppd-install"
+ fi
+
+ if use minimal ; then
+ if use hpijs ; then
+ minimal_build="--enable-hpijs-only-build"
+ else
+ minimal_build="--disable-hpijs-only-build"
+ fi
+ if use hpcups ; then
+ minimal_build="${minimal_build} --enable-hpcups-only-build"
+ else
+ minimal_build="${minimal_build} --disable-hpcups-only-build"
+ fi
+ fi
+
+ econf \
+ --disable-cups11-build \
+ --disable-lite-build \
+ --disable-foomatic-rip-hplip-install \
+ --disable-shadow-build \
+ --disable-qt3 \
+ --with-cupsbackenddir=$(cups-config --serverbin)/backend \
+ --with-cupsfilterdir=$(cups-config --serverbin)/filter \
+ --with-docdir=/usr/share/doc/${PF} \
+ --with-htmldir=/usr/share/doc/${PF}/html \
+ ${myconf} \
+ ${drv_build} \
+ ${minimal_build} \
+ $(use_enable doc doc-build) \
+ $(use_enable fax fax-build) \
+ $(use_enable parport pp-build) \
+ $(use_enable scanner scan-build) \
+ $(use_enable snmp network-build) \
+ $(use_enable acl udev-acl-rules) \
+ $(use_enable qt4 gui-build) \
+ $(use_enable qt4) \
+ $(use_enable policykit)
+}
+
+src_install() {
+ default
+
+ # Installed by sane-backends
+ # Gentoo Bug: #201023
+ rm -f "${D}"/etc/sane.d/dll.conf || die
+
+ rm -f "${D}"/usr/share/doc/${PF}/{copyright,README_LIBJPG,COPYING} || die
+ rmdir --ignore-fail-on-non-empty "${D}"/usr/share/doc/${PF}/ || die
+
+ # Remove hal fdi files
+ rm -rf "${D}"/usr/share/hal || die
+
+ find "${D}" -name '*.la' -exec rm -rf '{}' '+' || die
+}
+
+pkg_postinst() {
+ use !minimal && python_mod_optimize /usr/share/${PN}
+ fdo-mime_desktop_database_update
+
+ elog "For more information on setting up your printer please take"
+ elog "a look at the hplip section of the gentoo printing guide:"
+ elog "http://www.gentoo.org/doc/en/printing-howto.xml"
+}
+
+pkg_postrm() {
+ use !minimal && python_mod_cleanup /usr/share/${PN}
+ fdo-mime_desktop_database_update
+}